From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Vladimir Davydov Subject: [PATCH 05/12] vinyl: move vy_tuple_key_contains_null to generic code Date: Thu, 21 Feb 2019 13:26:05 +0300 Message-Id: <51872a8755aa2bc223103ab76f839b7df38f1fcb.1550744027.git.vdavydov.dev@gmail.com> In-Reply-To: References: In-Reply-To: References: To: kostja@tarantool.org Cc: tarantool-patches@freelists.org List-ID: The function doesn't require any knowledge of vinyl statement layout and can work on regular tuples. Let's rename it to tuple_key_contains_null, move its implementation to tuple_extract_key.cc, and declare it in key_def.h, as we do with other similar functions. --- src/box/key_def.h | 9 +++++++++ src/box/tuple_extract_key.cc | 16 ++++++++++++++++ src/box/vinyl.c | 2 +- src/box/vy_stmt.h | 22 ---------------------- 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/box/key_def.h b/src/box/key_def.h index 788a200d..dd62f6a3 100644 --- a/src/box/key_def.h +++ b/src/box/key_def.h @@ -464,6 +464,15 @@ key_part_cmp(const struct key_part *parts1, uint32_t part_count1, const struct key_part *parts2, uint32_t part_count2); /** + * Check if a key of @a tuple contains NULL. + * @param tuple Tuple to check. + * @param def Key def to check by. + * @retval Does the key contain NULL or not? + */ +bool +tuple_key_contains_null(const struct tuple *tuple, struct key_def *def); + +/** * Extract key from tuple by given key definition and return * buffer allocated on box_txn_alloc with this key. This function * has O(n) complexity, where n is the number of key parts. diff --git a/src/box/tuple_extract_key.cc b/src/box/tuple_extract_key.cc index 915b6bae..fead2328 100644 --- a/src/box/tuple_extract_key.cc +++ b/src/box/tuple_extract_key.cc @@ -399,3 +399,19 @@ tuple_extract_key_func_set(struct key_def *key_def) } } } + +bool +tuple_key_contains_null(const struct tuple *tuple, struct key_def *def) +{ + struct tuple_format *format = tuple_format(tuple); + const char *data = tuple_data(tuple); + const uint32_t *field_map = tuple_field_map(tuple); + for (struct key_part *part = def->parts, *end = part + def->part_count; + part < end; ++part) { + const char *field = + tuple_field_raw_by_part(format, data, field_map, part); + if (field == NULL || mp_typeof(*field) == MP_NIL) + return true; + } + return false; +} diff --git a/src/box/vinyl.c b/src/box/vinyl.c index 23c5b9c3..428bae1d 100644 --- a/src/box/vinyl.c +++ b/src/box/vinyl.c @@ -1503,7 +1503,7 @@ vy_check_is_unique_secondary(struct vy_tx *tx, const struct vy_read_view **rv, if (!lsm->check_is_unique) return 0; if (lsm->key_def->is_nullable && - vy_tuple_key_contains_null(stmt, lsm->key_def)) + tuple_key_contains_null(stmt, lsm->key_def)) return 0; struct tuple *key = vy_stmt_extract_key(stmt, lsm->key_def, lsm->env->key_format); diff --git a/src/box/vy_stmt.h b/src/box/vy_stmt.h index dd1f2460..3efad12c 100644 --- a/src/box/vy_stmt.h +++ b/src/box/vy_stmt.h @@ -669,28 +669,6 @@ vy_stmt_snprint(char *buf, int size, const struct tuple *stmt); const char * vy_stmt_str(const struct tuple *stmt); -/** - * Check if a key of @a tuple contains NULL. - * @param tuple Tuple to check. - * @param def Key def to check by. - * @retval Does the key contain NULL or not? - */ -static inline bool -vy_tuple_key_contains_null(const struct tuple *tuple, struct key_def *def) -{ - struct tuple_format *format = tuple_format(tuple); - const char *data = tuple_data(tuple); - const uint32_t *field_map = tuple_field_map(tuple); - for (struct key_part *part = def->parts, *end = part + def->part_count; - part < end; ++part) { - const char *field = - tuple_field_raw_by_part(format, data, field_map, part); - if (field == NULL || mp_typeof(*field) == MP_NIL) - return true; - } - return false; -} - #if defined(__cplusplus) } /* extern "C" */ #endif /* defined(__cplusplus) */ -- 2.11.0