From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Kirill Shcherbatov Subject: [PATCH v5 01/12] box: refactor key_def_find routine Date: Mon, 29 Oct 2018 09:56:30 +0300 Message-Id: <4f2acb62de31f7ec7efc0246ae98c89b38d0291a.1540795996.git.kshcherbatov@tarantool.org> In-Reply-To: References: In-Reply-To: References: To: tarantool-patches@freelists.org Cc: vdavydov.dev@gmail.com, Kirill Shcherbatov List-ID: Refactored key_def_find routine to use key_part as a second argument. Introduced key_def_find_by_fieldno helper to use in scenarios where no key_part exists. New API is more convenient for complex key_part that will appear with JSON paths introduction. Need for #1012 --- src/box/alter.cc | 7 ++++--- src/box/key_def.c | 19 ++++++++++++++----- src/box/key_def.h | 9 ++++++++- src/box/sql/build.c | 2 +- src/box/sql/pragma.c | 2 +- 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/box/alter.cc b/src/box/alter.cc index a6bb5a0..fc4d44e 100644 --- a/src/box/alter.cc +++ b/src/box/alter.cc @@ -3952,9 +3952,10 @@ on_replace_dd_fk_constraint(struct trigger * /* trigger*/, void *event) continue; uint32_t j; for (j = 0; j < fk_def->field_count; ++j) { - if (key_def_find(idx->def->key_def, - fk_def->links[j].parent_field) - == NULL) + if (key_def_find_by_fieldno(idx->def->key_def, + fk_def->links[j]. + parent_field) == + NULL) break; } if (j != fk_def->field_count) diff --git a/src/box/key_def.c b/src/box/key_def.c index 3a560bb..2119ca3 100644 --- a/src/box/key_def.c +++ b/src/box/key_def.c @@ -519,12 +519,21 @@ key_def_decode_parts(struct key_part_def *parts, uint32_t part_count, } const struct key_part * -key_def_find(const struct key_def *key_def, uint32_t fieldno) +key_def_find_by_fieldno(const struct key_def *key_def, uint32_t fieldno) +{ + struct key_part part; + memset(&part, 0, sizeof(struct key_part)); + part.fieldno = fieldno; + return key_def_find(key_def, &part); +} + +const struct key_part * +key_def_find(const struct key_def *key_def, const struct key_part *to_find) { const struct key_part *part = key_def->parts; const struct key_part *end = part + key_def->part_count; for (; part != end; part++) { - if (part->fieldno == fieldno) + if (part->fieldno == to_find->fieldno) return part; } return NULL; @@ -536,7 +545,7 @@ key_def_contains(const struct key_def *first, const struct key_def *second) const struct key_part *part = second->parts; const struct key_part *end = part + second->part_count; for (; part != end; part++) { - if (key_def_find(first, part->fieldno) == NULL) + if (key_def_find(first, part) == NULL) return false; } return true; @@ -553,7 +562,7 @@ key_def_merge(const struct key_def *first, const struct key_def *second) const struct key_part *part = second->parts; const struct key_part *end = part + second->part_count; for (; part != end; part++) { - if (key_def_find(first, part->fieldno)) + if (key_def_find(first, part) != NULL) --new_part_count; } @@ -584,7 +593,7 @@ key_def_merge(const struct key_def *first, const struct key_def *second) part = second->parts; end = part + second->part_count; for (; part != end; part++) { - if (key_def_find(first, part->fieldno)) + if (key_def_find(first, part) != NULL) continue; key_def_set_part(new_def, pos++, part->fieldno, part->type, part->nullable_action, part->coll, diff --git a/src/box/key_def.h b/src/box/key_def.h index 20e79f9..cfed3f1 100644 --- a/src/box/key_def.h +++ b/src/box/key_def.h @@ -320,7 +320,14 @@ key_def_decode_parts(struct key_part_def *parts, uint32_t part_count, * If fieldno is not in index_def->parts returns NULL. */ const struct key_part * -key_def_find(const struct key_def *key_def, uint32_t fieldno); +key_def_find_by_fieldno(const struct key_def *key_def, uint32_t fieldno); + +/** + * Returns the part in index_def->parts for the specified key part. + * If to_find is not in index_def->parts returns NULL. + */ +const struct key_part * +key_def_find(const struct key_def *key_def, const struct key_part *to_find); /** * Check if key definition @a first contains all parts of diff --git a/src/box/sql/build.c b/src/box/sql/build.c index fb5d61c..7556a78 100644 --- a/src/box/sql/build.c +++ b/src/box/sql/build.c @@ -145,7 +145,7 @@ sql_space_column_is_in_pk(struct space *space, uint32_t column) if (column < 63) return (pk_mask & (((uint64_t) 1) << column)) != 0; else if ((pk_mask & (((uint64_t) 1) << 63)) != 0) - return key_def_find(key_def, column) != NULL; + return key_def_find_by_fieldno(key_def, column) != NULL; return false; } diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c index 9ece82a..cc99eb1 100644 --- a/src/box/sql/pragma.c +++ b/src/box/sql/pragma.c @@ -273,7 +273,7 @@ sql_pragma_table_info(struct Parse *parse, const char *tbl_name) k = 1; } else { struct key_def *kdef = pk->def->key_def; - k = key_def_find(kdef, i) - kdef->parts + 1; + k = key_def_find_by_fieldno(kdef, i) - kdef->parts + 1; } sqlite3VdbeMultiLoad(v, 1, "issisi", i, field->name, field_type_strs[field->type], -- 2.7.4