* [Tarantool-patches] [PATCH v3 0/2] box: implement binary search for _session_settings
@ 2020-01-26 12:01 Chris Sosnin
2020-01-26 12:01 ` [Tarantool-patches] [PATCH v3 1/2] box: replace session_settings modules with a single array Chris Sosnin
2020-01-26 12:01 ` [Tarantool-patches] [PATCH v3 2/2] box: add binary search for _session_settings space Chris Sosnin
0 siblings, 2 replies; 3+ messages in thread
From: Chris Sosnin @ 2020-01-26 12:01 UTC (permalink / raw)
To: v.shpilevoy, tarantool-patches
Changes in v3:
- add a patch that removes setting modules
- apply Vlad's fixes
branch: https://github.com/tarantool/tarantool/tree/ksosnin/gh-4712-search-settings
issue: https://github.com/tarantool/tarantool/issues/4712
Chris Sosnin (2):
box: replace session_settings modules with a single array
box: add binary search for _session_settings space
src/box/session_settings.c | 180 +++++++++++-------
src/box/session_settings.h | 47 +++--
src/box/sql/build.c | 60 ++----
...1-access-settings-from-any-frontend.result | 37 ++--
...access-settings-from-any-frontend.test.lua | 28 ++-
5 files changed, 198 insertions(+), 154 deletions(-)
--
2.21.1 (Apple Git-122.3)
^ permalink raw reply [flat|nested] 3+ messages in thread
* [Tarantool-patches] [PATCH v3 1/2] box: replace session_settings modules with a single array
2020-01-26 12:01 [Tarantool-patches] [PATCH v3 0/2] box: implement binary search for _session_settings Chris Sosnin
@ 2020-01-26 12:01 ` Chris Sosnin
2020-01-26 12:01 ` [Tarantool-patches] [PATCH v3 2/2] box: add binary search for _session_settings space Chris Sosnin
1 sibling, 0 replies; 3+ messages in thread
From: Chris Sosnin @ 2020-01-26 12:01 UTC (permalink / raw)
To: v.shpilevoy, tarantool-patches
Currently we have an array of modules and each module has
its own array of session_settings. This patch merges these
into one array, as long as it turned out, that we cannot
represent every setting as a part of some module. This
change is also needed for implementing binary search for
_session_settings space.
Part of #4712
---
src/box/session_settings.c | 103 +++++++++++--------------------------
src/box/session_settings.h | 47 ++++++++++-------
src/box/sql/build.c | 60 ++++++---------------
3 files changed, 75 insertions(+), 135 deletions(-)
diff --git a/src/box/session_settings.c b/src/box/session_settings.c
index a969d3d10..cdc2d1cf9 100644
--- a/src/box/session_settings.c
+++ b/src/box/session_settings.c
@@ -38,8 +38,8 @@
#include "xrow.h"
#include "sql.h"
-struct session_setting_module
- session_setting_modules[session_setting_type_MAX] = {};
+struct session_setting session_settings[session_setting_MAX] = {};
+static const int session_setting_count = session_setting_MAX;
struct session_settings_index {
/** Base index. Must be the first member. */
@@ -61,12 +61,7 @@ struct session_settings_iterator {
* a format for selected tuples.
*/
struct tuple_format *format;
- /**
- * ID of the current session settings module in the global
- * list of the modules.
- */
- int module_id;
- /** ID of the setting in current module. */
+ /** ID of the setting. */
int setting_id;
/** Decoded key. */
char *key;
@@ -86,46 +81,40 @@ session_settings_iterator_free(struct iterator *ptr)
}
static int
-session_settings_next_in_module(const struct session_setting_module *module,
- int *sid, const char *key, bool is_eq,
- bool is_including)
+session_settings_next(int *sid, const char *key, bool is_eq, bool is_including)
{
int i = *sid;
- int count = module->setting_count;
- if (i >= count)
+ if (i >= session_setting_count)
return -1;
if (key == NULL)
return 0;
assert(i >= 0);
- const char **name = &module->settings[i];
- for (; i < count; ++i, ++name) {
- int cmp = strcmp(*name, key);
+ struct session_setting *setting = &session_settings[i];
+ for (; i < session_setting_count; ++i, ++setting) {
+ int cmp = strcmp(setting->name, key);
if ((cmp == 0 && is_including) ||
(cmp > 0 && !is_eq)) {
*sid = i;
return 0;
}
}
- *sid = count;
+ *sid = session_setting_count;
return -1;
}
static int
-session_settings_prev_in_module(const struct session_setting_module *module,
- int *sid, const char *key, bool is_eq,
- bool is_including)
+session_settings_prev(int *sid, const char *key, bool is_eq, bool is_including)
{
int i = *sid;
- int count = module->setting_count;
if (i < 0)
return -1;
if (key == NULL)
return 0;
- if (i >= count)
- i = count - 1;
- const char **name = &module->settings[i];
- for (; i >= 0; --i, --name) {
- int cmp = strcmp(*name, key);
+ if (i >= session_setting_count)
+ i = session_setting_count - 1;
+ struct session_setting *setting = &session_settings[i];
+ for (; i >= 0; --i, --setting) {
+ int cmp = strcmp(setting->name, key);
if ((cmp == 0 && is_including) ||
(cmp < 0 && !is_eq)) {
*sid = i;
@@ -141,27 +130,19 @@ session_settings_iterator_next(struct iterator *iterator, struct tuple **result)
{
struct session_settings_iterator *it =
(struct session_settings_iterator *)iterator;
- int mid = it->module_id, sid = it->setting_id;
- struct session_setting_module *module;
+ int sid = it->setting_id;
const char *key = it->key;
bool is_including = it->is_including, is_eq = it->is_eq;
bool is_found = false;
- for (; mid < session_setting_type_MAX; ++mid, sid = 0) {
- module = &session_setting_modules[mid];
- if (session_settings_next_in_module(module, &sid, key, is_eq,
- is_including) == 0) {
- is_found = true;
- break;
- }
- }
- it->module_id = mid;
+ if (session_settings_next(&sid, key, is_eq, is_including) == 0)
+ is_found = true;
it->setting_id = sid + 1;
if (!is_found) {
*result = NULL;
return 0;
}
const char *mp_pair, *mp_pair_end;
- module->get(sid, &mp_pair, &mp_pair_end);
+ session_settings[sid].get(sid, &mp_pair, &mp_pair_end);
*result = box_tuple_new(it->format, mp_pair, mp_pair_end);
return *result != NULL ? 0 : -1;
}
@@ -171,27 +152,19 @@ session_settings_iterator_prev(struct iterator *iterator, struct tuple **result)
{
struct session_settings_iterator *it =
(struct session_settings_iterator *)iterator;
- int mid = it->module_id, sid = it->setting_id;
- struct session_setting_module *module;
+ int sid = it->setting_id;
const char *key = it->key;
bool is_including = it->is_including, is_eq = it->is_eq;
bool is_found = false;
- for (; mid >= 0; --mid, sid = INT_MAX) {
- module = &session_setting_modules[mid];
- if (session_settings_prev_in_module(module, &sid, key, is_eq,
- is_including) == 0) {
- is_found = true;
- break;
- }
- }
- it->module_id = mid;
+ if (session_settings_prev(&sid, key, is_eq, is_including) == 0)
+ is_found = true;
it->setting_id = sid - 1;
if (!is_found) {
*result = NULL;
return 0;
}
const char *mp_pair, *mp_pair_end;
- module->get(sid, &mp_pair, &mp_pair_end);
+ session_settings[sid].get(sid, &mp_pair, &mp_pair_end);
*result = box_tuple_new(it->format, mp_pair, mp_pair_end);
return *result != NULL ? 0 : -1;
}
@@ -239,14 +212,10 @@ session_settings_index_create_iterator(struct index *base,
it->format = index->format;
if (!iterator_type_is_reverse(type)) {
it->base.next = session_settings_iterator_next;
- it->module_id = 0;
it->setting_id = 0;
} else {
it->base.next = session_settings_iterator_prev;
- it->module_id = session_setting_type_MAX - 1;
- struct session_setting_module *module =
- &session_setting_modules[it->module_id];
- it->setting_id = module->setting_count - 1;
+ it->setting_id = session_setting_count - 1;
}
return (struct iterator *)it;
}
@@ -262,20 +231,15 @@ session_settings_index_get(struct index *base, const char *key,
uint32_t len;
key = mp_decode_str(&key, &len);
key = tt_cstr(key, len);
- struct session_setting_module *module = &session_setting_modules[0];
- struct session_setting_module *end = module + session_setting_type_MAX;
int sid = 0;
- for (; module < end; ++module, sid = 0) {
- if (session_settings_next_in_module(module, &sid, key, true,
- true) == 0)
- goto found;
- }
+ if (session_settings_next(&sid, key, true, true) == 0)
+ goto found;
*result = NULL;
return 0;
found:;
const char *mp_pair;
const char *mp_pair_end;
- module->get(sid, &mp_pair, &mp_pair_end);
+ session_settings[sid].get(sid, &mp_pair, &mp_pair_end);
*result = box_tuple_new(index->format, mp_pair, mp_pair_end);
return *result != NULL ? 0 : -1;
}
@@ -370,17 +334,12 @@ session_settings_space_execute_update(struct space *space, struct txn *txn,
}
key = mp_decode_str(&key, &key_len);
key = tt_cstr(key, key_len);
- struct session_setting_module *module = &session_setting_modules[0];
- struct session_setting_module *end = module + session_setting_type_MAX;
- for (; module < end; ++module, sid = 0) {
- if (session_settings_next_in_module(module, &sid, key, true,
- true) == 0)
- goto found;
- }
+ if (session_settings_next(&sid, key, true, true) == 0)
+ goto found;
*result = NULL;
return 0;
found:
- module->get(sid, &old_data, &old_data_end);
+ session_settings[sid].get(sid, &old_data, &old_data_end);
new_data = xrow_update_execute(request->tuple, request->tuple_end,
old_data, old_data_end, format->dict,
&new_size, request->index_base,
@@ -402,7 +361,7 @@ found:
goto finish;
}
}
- if (module->set(sid, new_data) != 0)
+ if (session_settings[sid].set(sid, new_data) != 0)
goto finish;
rc = 0;
finish:
diff --git a/src/box/session_settings.h b/src/box/session_settings.h
index 25490a7e3..2975bcaf0 100644
--- a/src/box/session_settings.h
+++ b/src/box/session_settings.h
@@ -31,28 +31,37 @@
*/
/**
- * Session has settings. Settings belong to different subsystems,
- * such as SQL. Each subsystem registers here its session setting
- * type and a set of settings with getter and setter functions.
- * The self-registration of modules allows session setting code
- * not to depend on all the subsystems.
+ * Identifiers of all session setings. The identifier of the
+ * option is equal to its place in the sorted list of session
+ * options.
*
- * The types should be ordered in alphabetical order, because the
- * type list is used by setting iterators.
+ * It is IMPORTANT that these options are sorted by name. If this
+ * is not the case, the result returned by the _session_settings
+ * space iterator will not be sorted properly.
*/
-enum session_setting_type {
- SESSION_SETTING_SQL,
- session_setting_type_MAX,
+enum {
+ sql_session_setting_BEGIN = 0,
+ SQL_SESSION_SETTING_DEFAULT_ENGINE = sql_session_setting_BEGIN,
+ SQL_SESSION_SETTING_DEFER_FOREIGN_KEYS,
+ SQL_SESSION_SETTING_FULL_COLUMN_NAMES,
+ SQL_SESSION_SETTING_FULL_METADATA,
+ SQL_SESSION_SETTING_PARSER_DEBUG,
+ SQL_SESSION_SETTING_RECURSIVE_TRIGGERS,
+ SQL_SESSION_SETTING_REVERSE_UNORDERED_SELECTS,
+ SQL_SESSION_SETTING_SELECT_DEBUG,
+ SQL_SESSION_SETTING_VDBE_DEBUG,
+ sql_session_setting_END = SQL_SESSION_SETTING_VDBE_DEBUG,
+ session_setting_MAX,
};
-struct session_setting_module {
- /**
- * An array of setting names. All of them should have the
- * same prefix.
- */
- const char **settings;
- /** Count of settings. */
- int setting_count;
+struct session_setting_metadata {
+ unsigned field_type;
+ unsigned mask;
+};
+
+struct session_setting {
+ const char *name;
+ struct session_setting_metadata metadata;
/**
* Get a MessagePack encoded pair [name, value] for a
* setting having index @a id. Index is from the settings
@@ -67,4 +76,4 @@ struct session_setting_module {
int (*set)(int id, const char *mp_value);
};
-extern struct session_setting_module session_setting_modules[];
+extern struct session_setting session_settings[];
diff --git a/src/box/sql/build.c b/src/box/sql/build.c
index bc50ecbfa..7dcf7b858 100644
--- a/src/box/sql/build.c
+++ b/src/box/sql/build.c
@@ -3310,29 +3310,7 @@ sql_fieldno_by_name(struct Parse *parse_context, struct Expr *field_name,
return 0;
}
-/**
- * Identifiers of all SQL session setings. The identifier of the
- * option is equal to its place in the sorted list of session
- * options of current module.
- *
- * It is IMPORTANT that these options are sorted by name. If this
- * is not the case, the result returned by the _session_settings
- * space iterator will not be sorted properly.
- */
-enum {
- SQL_SESSION_SETTING_DEFAULT_ENGINE = 0,
- SQL_SESSION_SETTING_DEFER_FOREIGN_KEYS,
- SQL_SESSION_SETTING_FULL_COLUMN_NAMES,
- SQL_SESSION_SETTING_FULL_METADATA,
- SQL_SESSION_SETTING_PARSER_DEBUG,
- SQL_SESSION_SETTING_RECURSIVE_TRIGGERS,
- SQL_SESSION_SETTING_REVERSE_UNORDERED_SELECTS,
- SQL_SESSION_SETTING_SELECT_DEBUG,
- SQL_SESSION_SETTING_VDBE_DEBUG,
- sql_session_setting_MAX,
-};
-
-static const char *sql_session_setting_strs[sql_session_setting_MAX] = {
+static const char *sql_session_setting_strs[] = {
"sql_default_engine",
"sql_defer_foreign_keys",
"sql_full_column_names",
@@ -3344,23 +3322,13 @@ static const char *sql_session_setting_strs[sql_session_setting_MAX] = {
"sql_vdbe_debug",
};
-/**
- * A local structure that allows to establish a connection between
- * parameter and its field type and mask, if it has one.
- */
-struct sql_option_metadata
-{
- uint32_t field_type;
- uint32_t mask;
-};
-
/**
* Variable that contains SQL session option field types and masks
* if they have one or 0 if don't have.
*
* It is IMPORTANT that these options sorted by name.
*/
-static struct sql_option_metadata sql_session_opts[] = {
+static struct session_setting_metadata sql_session_opts[] = {
/** SQL_SESSION_SETTING_DEFAULT_ENGINE */
{FIELD_TYPE_STRING, 0},
/** SQL_SESSION_SETTING_DEFER_FOREIGN_KEYS */
@@ -3386,10 +3354,11 @@ static struct sql_option_metadata sql_session_opts[] = {
static void
sql_session_setting_get(int id, const char **mp_pair, const char **mp_pair_end)
{
- assert(id >= 0 && id < sql_session_setting_MAX);
+ assert(id >= sql_session_setting_BEGIN &&
+ id <= sql_session_setting_END);
struct session *session = current_session();
uint32_t flags = session->sql_flags;
- struct sql_option_metadata *opt = &sql_session_opts[id];
+ struct session_setting_metadata *opt = &sql_session_opts[id];
uint32_t mask = opt->mask;
const char *name = sql_session_setting_strs[id];
size_t name_len = strlen(name);
@@ -3426,7 +3395,7 @@ static int
sql_set_boolean_option(int id, bool value)
{
struct session *session = current_session();
- struct sql_option_metadata *option = &sql_session_opts[id];
+ struct session_setting_metadata *option = &sql_session_opts[id];
assert(option->field_type == FIELD_TYPE_BOOLEAN);
#ifdef NDEBUG
if ((session->sql_flags & SQL_SqlTrace) == 0) {
@@ -3468,7 +3437,8 @@ sql_set_string_option(int id, const char *value)
static int
sql_session_setting_set(int id, const char *mp_value)
{
- assert(id >= 0 && id < sql_session_setting_MAX);
+ assert(id >= sql_session_setting_BEGIN &&
+ id <= sql_session_setting_END);
enum mp_type mtype = mp_typeof(*mp_value);
enum field_type stype = sql_session_opts[id].field_type;
uint32_t len;
@@ -3495,10 +3465,12 @@ sql_session_setting_set(int id, const char *mp_value)
void
sql_session_settings_init()
{
- struct session_setting_module *module =
- &session_setting_modules[SESSION_SETTING_SQL];
- module->settings = sql_session_setting_strs;
- module->setting_count = sql_session_setting_MAX;
- module->get = sql_session_setting_get;
- module->set = sql_session_setting_set;
+ int id = sql_session_setting_BEGIN;
+ for (; id <= sql_session_setting_END; ++id) {
+ struct session_setting *setting = &session_settings[id];
+ setting->name = sql_session_setting_strs[id];
+ setting->metadata = sql_session_opts[id];
+ setting->get = sql_session_setting_get;
+ setting->set = sql_session_setting_set;
+ }
}
--
2.21.1 (Apple Git-122.3)
^ permalink raw reply [flat|nested] 3+ messages in thread
* [Tarantool-patches] [PATCH v3 2/2] box: add binary search for _session_settings space
2020-01-26 12:01 [Tarantool-patches] [PATCH v3 0/2] box: implement binary search for _session_settings Chris Sosnin
2020-01-26 12:01 ` [Tarantool-patches] [PATCH v3 1/2] box: replace session_settings modules with a single array Chris Sosnin
@ 2020-01-26 12:01 ` Chris Sosnin
1 sibling, 0 replies; 3+ messages in thread
From: Chris Sosnin @ 2020-01-26 12:01 UTC (permalink / raw)
To: v.shpilevoy, tarantool-patches
As it is mentioned in implementation, it is important
that _session_settings options are sorted by name, so
there is no need in linear lookup and we can replace it
with binary search.
Closes #4712
---
src/box/session_settings.c | 97 +++++++++++++++++--
...1-access-settings-from-any-frontend.result | 37 ++++---
...access-settings-from-any-frontend.test.lua | 28 ++++--
3 files changed, 133 insertions(+), 29 deletions(-)
diff --git a/src/box/session_settings.c b/src/box/session_settings.c
index cdc2d1cf9..051ce0603 100644
--- a/src/box/session_settings.c
+++ b/src/box/session_settings.c
@@ -69,6 +69,8 @@ struct session_settings_iterator {
bool is_eq;
/** True if the iterator should include equal keys. */
bool is_including;
+ /** True if the iterator is pointing to an existing setting */
+ bool is_set;
};
static void
@@ -80,6 +82,72 @@ session_settings_iterator_free(struct iterator *ptr)
free(it);
}
+static int
+session_settings_set_forward(int *sid, const char *key, bool is_eq,
+ bool is_including)
+{
+ int low = 0, high = session_setting_count - 1;
+ if (key == NULL)
+ return 0;
+ while (low <= high) {
+ int index = (high + low) / 2;
+ const char *name = session_settings[index].name;
+ int cmp = strcmp(name, key);
+ if (cmp == 0) {
+ if (is_including) {
+ *sid = index;
+ return 0;
+ }
+ *sid = ++index;
+ return index < session_setting_count ? 0 : -1;
+ }
+ if (cmp < 0)
+ low = index + 1;
+ else
+ high = index - 1;
+ }
+ if (is_eq) {
+ *sid = session_setting_count;
+ return -1;
+ }
+ assert(low > high);
+ *sid = low;
+ return low < session_setting_count ? 0 : -1;
+}
+
+static int
+session_settings_set_reverse(int *sid, const char *key, bool is_eq,
+ bool is_including)
+{
+ int low = 0, high = session_setting_count - 1;
+ if (key == NULL)
+ return 0;
+ while (low <= high) {
+ int index = (high + low) / 2;
+ const char *name = session_settings[index].name;
+ int cmp = strcmp(name, key);
+ if (cmp == 0) {
+ if (is_including) {
+ *sid = index;
+ return 0;
+ }
+ *sid = --index;
+ return index >= 0 ? 0 : -1;
+ }
+ if (cmp < 0)
+ low = index + 1;
+ else
+ high = index - 1;
+ }
+ if (is_eq) {
+ *sid = session_setting_count;
+ return -1;
+ }
+ assert(low > high);
+ *sid = high;
+ return high >= 0 ? 0 : -1;
+}
+
static int
session_settings_next(int *sid, const char *key, bool is_eq, bool is_including)
{
@@ -130,12 +198,18 @@ session_settings_iterator_next(struct iterator *iterator, struct tuple **result)
{
struct session_settings_iterator *it =
(struct session_settings_iterator *)iterator;
- int sid = it->setting_id;
+ int rc, sid = it->setting_id;
const char *key = it->key;
bool is_including = it->is_including, is_eq = it->is_eq;
bool is_found = false;
- if (session_settings_next(&sid, key, is_eq, is_including) == 0)
- is_found = true;
+ if (!it->is_set) {
+ it->is_set = true;
+ rc = session_settings_set_forward(&sid, key, is_eq,
+ is_including);
+ } else {
+ rc = session_settings_next(&sid, key, is_eq, is_including);
+ }
+ is_found = rc == 0;
it->setting_id = sid + 1;
if (!is_found) {
*result = NULL;
@@ -152,12 +226,18 @@ session_settings_iterator_prev(struct iterator *iterator, struct tuple **result)
{
struct session_settings_iterator *it =
(struct session_settings_iterator *)iterator;
- int sid = it->setting_id;
+ int rc, sid = it->setting_id;
const char *key = it->key;
bool is_including = it->is_including, is_eq = it->is_eq;
bool is_found = false;
- if (session_settings_prev(&sid, key, is_eq, is_including) == 0)
- is_found = true;
+ if (!it->is_set) {
+ it->is_set = true;
+ rc = session_settings_set_reverse(&sid, key, is_eq,
+ is_including);
+ } else {
+ rc = session_settings_prev(&sid, key, is_eq, is_including);
+ }
+ is_found = rc == 0;
it->setting_id = sid - 1;
if (!is_found) {
*result = NULL;
@@ -209,6 +289,7 @@ session_settings_index_create_iterator(struct index *base,
it->is_eq = type == ITER_EQ || type == ITER_REQ;
it->is_including = it->is_eq || type == ITER_GE || type == ITER_ALL ||
type == ITER_LE;
+ it->is_set = false;
it->format = index->format;
if (!iterator_type_is_reverse(type)) {
it->base.next = session_settings_iterator_next;
@@ -232,7 +313,7 @@ session_settings_index_get(struct index *base, const char *key,
key = mp_decode_str(&key, &len);
key = tt_cstr(key, len);
int sid = 0;
- if (session_settings_next(&sid, key, true, true) == 0)
+ if (session_settings_set_forward(&sid, key, true, true) == 0)
goto found;
*result = NULL;
return 0;
@@ -334,7 +415,7 @@ session_settings_space_execute_update(struct space *space, struct txn *txn,
}
key = mp_decode_str(&key, &key_len);
key = tt_cstr(key, key_len);
- if (session_settings_next(&sid, key, true, true) == 0)
+ if (session_settings_set_forward(&sid, key, true, true) == 0)
goto found;
*result = NULL;
return 0;
diff --git a/test/box/gh-4511-access-settings-from-any-frontend.result b/test/box/gh-4511-access-settings-from-any-frontend.result
index ed340d053..f072bafae 100644
--- a/test/box/gh-4511-access-settings-from-any-frontend.result
+++ b/test/box/gh-4511-access-settings-from-any-frontend.result
@@ -82,6 +82,12 @@ function check_sorting(ss, ts, key)
for _, it in pairs(iterators_list) do
local view_space = ss:select({key}, {iterator = it})
local test_space = ts:select({key}, {iterator = it})
+ if #view_space ~= #test_space then
+ return {
+ err = 'bad sorting', type = it, exp = test_space,
+ got = view_space
+ }
+ end
for key, value in pairs(view_space) do
if test_space[key].name ~= value.name then
return {
@@ -111,32 +117,37 @@ check_sorting(s, t, 'sql_d')
check_sorting(s, t, 'sql_v')
| ---
| ...
-check_sorting(s, t, 'sql_defer_foreign_keys')
+check_sorting(s, t, 'z')
| ---
| ...
-
-t:drop()
+check_sorting(s, t, 'sql_parser_debuf')
+ | ---
+ | ...
+check_sorting(s, t, 'sql_parser_debuh')
| ---
| ...
--- Check get() method of session_settings space.
-s:get({'sql_defer_foreign_keys'})
+name = nil
| ---
- | - ['sql_defer_foreign_keys', false]
| ...
-s:get({'sql_recursive_triggers'})
+err = nil
| ---
- | - ['sql_recursive_triggers', true]
| ...
-s:get({'sql_reverse_unordered_selects'})
+for _, tuple in t:pairs() do \
+ name = tuple.name \
+ err = check_sorting(s, t, name) \
+ if err then \
+ break \
+ end \
+end
| ---
- | - ['sql_reverse_unordered_selects', false]
| ...
-s:get({'sql_default_engine'})
+err and {err, name}
| ---
- | - ['sql_default_engine', 'memtx']
+ | - null
| ...
-s:get({'abcd'})
+
+t:drop()
| ---
| ...
diff --git a/test/box/gh-4511-access-settings-from-any-frontend.test.lua b/test/box/gh-4511-access-settings-from-any-frontend.test.lua
index 366874998..40a58ad04 100644
--- a/test/box/gh-4511-access-settings-from-any-frontend.test.lua
+++ b/test/box/gh-4511-access-settings-from-any-frontend.test.lua
@@ -36,6 +36,12 @@ function check_sorting(ss, ts, key)
for _, it in pairs(iterators_list) do
local view_space = ss:select({key}, {iterator = it})
local test_space = ts:select({key}, {iterator = it})
+ if #view_space ~= #test_space then
+ return {
+ err = 'bad sorting', type = it, exp = test_space,
+ got = view_space
+ }
+ end
for key, value in pairs(view_space) do
if test_space[key].name ~= value.name then
return {
@@ -52,17 +58,23 @@ check_sorting(s, t)
check_sorting(s, t, 'abcde')
check_sorting(s, t, 'sql_d')
check_sorting(s, t, 'sql_v')
-check_sorting(s, t, 'sql_defer_foreign_keys')
+check_sorting(s, t, 'z')
+check_sorting(s, t, 'sql_parser_debuf')
+check_sorting(s, t, 'sql_parser_debuh')
+
+name = nil
+err = nil
+for _, tuple in t:pairs() do \
+ name = tuple.name \
+ err = check_sorting(s, t, name) \
+ if err then \
+ break \
+ end \
+end
+err and {err, name}
t:drop()
--- Check get() method of session_settings space.
-s:get({'sql_defer_foreign_keys'})
-s:get({'sql_recursive_triggers'})
-s:get({'sql_reverse_unordered_selects'})
-s:get({'sql_default_engine'})
-s:get({'abcd'})
-
-- Check pairs() method of session_settings space.
t = {}
for key, value in s:pairs() do table.insert(t, {key, value}) end
--
2.21.1 (Apple Git-122.3)
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-01-26 12:01 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-26 12:01 [Tarantool-patches] [PATCH v3 0/2] box: implement binary search for _session_settings Chris Sosnin
2020-01-26 12:01 ` [Tarantool-patches] [PATCH v3 1/2] box: replace session_settings modules with a single array Chris Sosnin
2020-01-26 12:01 ` [Tarantool-patches] [PATCH v3 2/2] box: add binary search for _session_settings space Chris Sosnin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox