diff --git a/src/box/xrow_update.c b/src/box/xrow_update.c index bb98b30ada7c8fdab3463618eb2046b070ffa6f4..123db081a30d4a0efaf48132322fb242d8d06ed2 100644 --- a/src/box/xrow_update.c +++ b/src/box/xrow_update.c @@ -269,11 +269,12 @@ xrow_update_read_ops(struct xrow_update *update, const char *expr, * @retval -1 Error. */ static int -xrow_update_do_ops(struct xrow_update *update, const char *old_data, - const char *old_data_end, uint32_t part_count) +xrow_update_do_ops(struct xrow_update *update, const char *header, + const char *old_data, const char *old_data_end, + uint32_t part_count) { - if (xrow_update_array_create(&update->root, old_data, old_data_end, - part_count) != 0) + if (xrow_update_array_create(&update->root, header, old_data, + old_data_end, part_count) != 0) return -1; struct xrow_update_op *op = update->ops; struct xrow_update_op *ops_end = op + update->op_count; @@ -290,12 +291,12 @@ xrow_update_do_ops(struct xrow_update *update, const char *old_data, * and it is enough to simply write the error to the log. */ static int -xrow_upsert_do_ops(struct xrow_update *update, const char *old_data, - const char *old_data_end, uint32_t part_count, - bool suppress_error) +xrow_upsert_do_ops(struct xrow_update *update, const char *header, + const char *old_data, const char *old_data_end, + uint32_t part_count, bool suppress_error) { - if (xrow_update_array_create(&update->root, old_data, old_data_end, - part_count) != 0) + if (xrow_update_array_create(&update->root, header, old_data, + old_data_end, part_count) != 0) return -1; struct xrow_update_op *op = update->ops; struct xrow_update_op *ops_end = op + update->op_count; @@ -352,12 +353,14 @@ xrow_update_execute(const char *expr,const char *expr_end, { struct xrow_update update; xrow_update_init(&update, index_base); + const char *header = old_data; uint32_t field_count = mp_decode_array(&old_data); if (xrow_update_read_ops(&update, expr, expr_end, dict, field_count) != 0) return NULL; - if (xrow_update_do_ops(&update, old_data, old_data_end, field_count)) + if (xrow_update_do_ops(&update, header, old_data, old_data_end, + field_count) != 0) return NULL; if (column_mask) *column_mask = update.column_mask; @@ -373,13 +376,14 @@ xrow_upsert_execute(const char *expr,const char *expr_end, { struct xrow_update update; xrow_update_init(&update, index_base); + const char *header = old_data; uint32_t field_count = mp_decode_array(&old_data); if (xrow_update_read_ops(&update, expr, expr_end, dict, field_count) != 0) return NULL; - if (xrow_upsert_do_ops(&update, old_data, old_data_end, field_count, - suppress_error)) + if (xrow_upsert_do_ops(&update, header, old_data, old_data_end, + field_count, suppress_error) != 0) return NULL; if (column_mask) *column_mask = update.column_mask; diff --git a/src/box/xrow_update_array.c b/src/box/xrow_update_array.c index b5f443cd0111904a7adf2abd23139652bb2bbe0b..7f198076bde25aef86a5d04e75f80b9e8ac28cbc 100644 --- a/src/box/xrow_update_array.c +++ b/src/box/xrow_update_array.c @@ -142,12 +142,13 @@ xrow_update_array_extract_item(struct xrow_update_field *field, } int -xrow_update_array_create(struct xrow_update_field *field, const char *data, - const char *data_end, uint32_t field_count) +xrow_update_array_create(struct xrow_update_field *field, const char *header, + const char *data, const char *data_end, + uint32_t field_count) { field->type = XUPDATE_ARRAY; - field->data = data; - field->size = data_end - data; + field->data = header; + field->size = data_end - header; struct region *region = &fiber()->gc; field->array.rope = xrow_update_rope_new(region); if (field->array.rope == NULL) diff --git a/src/box/xrow_update_field.h b/src/box/xrow_update_field.h index 04e452d23f17281fc2821dd5e35695d0e36bb13a..e90095b9e3bc83d709e29d89776e2d40eaa1841f 100644 --- a/src/box/xrow_update_field.h +++ b/src/box/xrow_update_field.h @@ -334,6 +334,7 @@ xrow_update_##type##_store(struct xrow_update_field *field, char *out, \ /** * Initialize @a field as an array to update. * @param[out] field Field to initialize. + * @param header Header of the MessagePack array @a data. * @param data MessagePack data of the array to update. * @param data_end End of @a data. * @param field_count Field count in @data. @@ -342,8 +343,9 @@ xrow_update_##type##_store(struct xrow_update_field *field, char *out, \ * @retval -1 Error. */ int -xrow_update_array_create(struct xrow_update_field *field, const char *data, - const char *data_end, uint32_t field_count); +xrow_update_array_create(struct xrow_update_field *field, const char *header, + const char *data, const char *data_end, + uint32_t field_count); OP_DECL_GENERIC(array)