diff --git a/src/box/alter.cc b/src/box/alter.cc index 6741b7aa47576acc9bbe6478dccab401f2984666..7a858bc27f83480b0f5a234b66a91a7e4ce1bdb7 100644 --- a/src/box/alter.cc +++ b/src/box/alter.cc @@ -5013,7 +5013,7 @@ on_drop_or_replace_fk_constraint_commit(struct trigger *trigger, void *event) * use bit mask. Otherwise, fall through slow check where we * use O(field_cont^2) simple nested cycle iterations. */ -static void +static int fk_constraint_check_dup_links(struct fk_constraint_def *fk_def) { uint64_t field_mask = 0; @@ -5026,7 +5026,7 @@ fk_constraint_check_dup_links(struct fk_constraint_def *fk_def) goto error; field_mask |= parent_field; } - return; + return 0; slow_check: for (uint32_t i = 0; i < fk_def->field_count; ++i) { uint32_t parent_field = fk_def->links[i].parent_field; @@ -5035,10 +5035,11 @@ fk_constraint_check_dup_links(struct fk_constraint_def *fk_def) goto error; } } - return; + return 0; error: - tnt_raise(ClientError, ER_CREATE_FK_CONSTRAINT, fk_def->name, + diag_set(ClientError, ER_CREATE_FK_CONSTRAINT, fk_def->name, "referenced fields can not contain duplicates"); + return -1; } /** A trigger invoked on replace in the _fk_constraint space. */ @@ -5117,7 +5118,8 @@ on_replace_dd_fk_constraint(struct trigger * /* trigger*/, void *event) return -1; } } - fk_constraint_check_dup_links(fk_def); + if (fk_constraint_check_dup_links(fk_def) != 0) + return -1; /* * Search for suitable index in parent space: * it must be unique and consist exactly from