From 1aa186fa72221e29738234464ab1a6a41d9847c9 Mon Sep 17 00:00:00 2001
From: Vladimir Davydov <vdavydov@tarantool.org>
Date: Thu, 18 Aug 2022 15:50:35 +0300
Subject: [PATCH] memtx: reset read view key_def

Tuples stored in a read view might not have a format, because we
overwrite the tuple format id when we free a tuple. So for anything more
sophisticated than a full-scan, we need to use special comparators that
don't access the tuple format. To address that, let's provide a way to
reset tree and hash key_def if ENABLE_READ_VIEW is defined.

The stub functions simply reset the read view key_def to NULL, because
it isn't supposed to be used in the CE version.

Needed for https://github.com/tarantool/tarantool-ee/issues/197

NO_DOC=internal
NO_TEST=ee
NO_CHANGELOG=internal
---
 src/box/memtx_hash.cc | 7 +++++++
 src/box/memtx_tree.cc | 8 ++++++++
 2 files changed, 15 insertions(+)

diff --git a/src/box/memtx_hash.cc b/src/box/memtx_hash.cc
index 72e2b40afd..a868a53a14 100644
--- a/src/box/memtx_hash.cc
+++ b/src/box/memtx_hash.cc
@@ -546,6 +546,12 @@ hash_read_view_iterator_start(struct hash_read_view_iterator *it,
 	return 0;
 }
 
+static void
+hash_read_view_reset_key_def(struct hash_read_view *rv)
+{
+	rv->view.common.arg = NULL;
+}
+
 #endif /* !defined(ENABLE_READ_VIEW) */
 
 /** Implementation of create_iterator index_read_view callback. */
@@ -588,6 +594,7 @@ memtx_hash_index_create_read_view(struct index *base)
 	rv->index = index;
 	index_ref(base);
 	light_index_view_create(&rv->view, &index->hash_table);
+	hash_read_view_reset_key_def(rv);
 	return (struct index_read_view *)rv;
 }
 
diff --git a/src/box/memtx_tree.cc b/src/box/memtx_tree.cc
index fc32c8e6d3..a58b9d864a 100644
--- a/src/box/memtx_tree.cc
+++ b/src/box/memtx_tree.cc
@@ -1762,6 +1762,13 @@ tree_read_view_iterator_start(struct tree_read_view_iterator<USE_HINT> *it,
 	return 0;
 }
 
+template <bool USE_HINT>
+static void
+tree_read_view_reset_key_def(struct tree_read_view<USE_HINT> *rv)
+{
+	rv->tree_view.common.arg = NULL;
+}
+
 #endif /* !defined(ENABLE_READ_VIEW) */
 
 /** Implementation of create_iterator index_read_view callback. */
@@ -1813,6 +1820,7 @@ memtx_tree_index_create_read_view(struct index *base)
 	rv->index = index;
 	index_ref(base);
 	memtx_tree_view_create(&rv->tree_view, &index->tree);
+	tree_read_view_reset_key_def(rv);
 	return (struct index_read_view *)rv;
 }
 
-- 
GitLab