Tarantool development patches archive
 help / color / mirror / Atom feed
From: Nikita Pettik <korablev@tarantool.org>
To: tarantool-patches@freelists.org
Cc: tarantool-patches@dev.tarantool.org
Subject: Re: [Tarantool-patches] [tarantool-patches] [PATCH v4 2/4] sql: add an ability to disable CK constraints
Date: Mon, 14 Oct 2019 19:56:57 +0300	[thread overview]
Message-ID: <20191014165657.GB30792@tarantool.org> (raw)
In-Reply-To: <d4002407f749fff0c1f0facb1ed4cf66b8b7edd6.1570539526.git.kshcherbatov@tarantool.org>

On 08 Oct 16:02, Kirill Shcherbatov wrote:
> Closes #4244
> 
> @TarantoolBot document
> Title: an ability to disable CK constraints
> 
> Now it is possible to disable and enable ck constraints.
> This option is not persistent.

Outdated comment.

> All ck constraints are enabled
> by default when Tarantool is configured. Ck constraints checks
> are not performed during standard recovery, but performed during
> force_recovery - all conflicting tuples are skipped in case of
> ck_constraint conflict.
> 
> To change CK constraint "is_enabled" state, call
> -- in LUA
> ck_obj:enable(new_state in {true, false})
> -- in SQL
> ALTER TABLE {TABLE_NAME} {EN, DIS}ABLE CHECK CONSTRAINT {CK_NAME};
> 
> Example:
> box.space.T6.ck_constraint.ck_unnamed_T6_1:enable(false)
> box.space.T6.ck_constraint.ck_unnamed_T6_1
> - space_id: 512
>   is_enabled: false
>   name: ck_unnamed_T6_1
>   expr: a < 10
> box.space.T6:insert({11})
> -- passed
> box.execute("ALTER TABLE t6 ENABLE CHECK CONSTRAINT \"ck_unnamed_T6_1\"")
> box.space.T6:insert({12})
> - error: 'Check constraint failed ''ck_unnamed_T6_1'': a < 10'
> ---
> diff --git a/src/box/sql/alter.c b/src/box/sql/alter.c
> index 765600186..500cabc5f 100644
> --- a/src/box/sql/alter.c
> +++ b/src/box/sql/alter.c
> @@ -79,6 +79,71 @@ tnt_error:
>  	goto exit_rename_table;
>  }
>  
> +void
> +sql_alter_ck_constraint_enable(struct Parse *parse)
> +{
> +	struct enable_entity_def *enable_def = &parse->enable_entity_def;
> +	struct SrcList *src_tab = enable_def->base.entity_name;
> +	assert(enable_def->base.entity_type == ENTITY_TYPE_CK);
> +	assert(enable_def->base.alter_action == ALTER_ACTION_ENABLE);
> +	assert(src_tab->nSrc == 1);
> +	struct sql *db = parse->db;
> +
> +	char *constraint_name = NULL;
> +	const char *tbl_name = src_tab->a[0].zName;
> +	struct space *space = space_by_name(tbl_name);
> +	if (space == NULL) {
> +		diag_set(ClientError, ER_NO_SUCH_SPACE, tbl_name);
> +		parse->is_aborted = true;
> +		goto exit_alter_ck_constraint;
> +	}
> +
> +	constraint_name = sql_name_from_token(db, &enable_def->name);
> +	if (constraint_name == NULL) {
> +		parse->is_aborted = true;
> +		goto exit_alter_ck_constraint;
> +	}
> +
> +	struct Vdbe *v = sqlGetVdbe(parse);
> +	if (v == NULL)
> +		goto exit_alter_ck_constraint;
> +
> +	struct space *ck_space = space_by_id(BOX_CK_CONSTRAINT_ID);
> +	assert(ck_space != NULL);
> +	int cursor = parse->nTab++;
> +	vdbe_emit_open_cursor(parse, cursor, 0, ck_space);
> +	sqlVdbeChangeP5(v, OPFLAG_SYSTEMSP);
> +
> +	int key_reg = sqlGetTempRange(parse, 2);
> +	sqlVdbeAddOp2(v, OP_Integer, space->def->id, key_reg);
> +	sqlVdbeAddOp4(v, OP_String8, 0, key_reg + 1, 0,
> +		      sqlDbStrDup(db, constraint_name), P4_DYNAMIC);
> +	int addr = sqlVdbeAddOp4Int(v, OP_Found, cursor, 0, key_reg, 2);
> +	sqlVdbeAddOp4(v, OP_SetDiag, ER_NO_SUCH_CONSTRAINT, 0, 0,
> +		      sqlMPrintf(db, tnt_errcode_desc(ER_NO_SUCH_CONSTRAINT),
> +				 constraint_name), P4_DYNAMIC);
> +	sqlVdbeAddOp2(v, OP_Halt, -1, ON_CONFLICT_ACTION_ABORT);
> +	sqlVdbeJumpHere(v, addr);
> +
> +	const int field_count = 6;
> +	int tuple_reg = sqlGetTempRange(parse, field_count + 1);
> +	for (int i = 0; i < field_count - 1; ++i)
> +		sqlVdbeAddOp3(v, OP_Column, cursor, i, tuple_reg + i);
> +	sqlVdbeAddOp1(v, OP_Close, cursor);
> +	sqlVdbeAddOp2(v, OP_Bool, enable_def->is_enabled,
> +		      tuple_reg + field_count - 1);
> +	sqlVdbeAddOp3(v, OP_MakeRecord, tuple_reg, field_count,
> +		      tuple_reg + field_count);
> +	sqlVdbeAddOp4(v, OP_IdxReplace, tuple_reg + field_count, 0, 0,
> +		      (char *)ck_space, P4_SPACEPTR);
> +
> +
> +

Too many new lines.

> +exit_alter_ck_constraint:
> +	sqlDbFree(db, constraint_name);
> +	sqlSrcListDelete(db, src_tab);
> +}
> +
>  /* This function is used to implement the ALTER TABLE command.
>   * The table name in the CREATE TRIGGER statement is replaced with the third
>   * argument and the result returned. This is analagous to rename_table()

  parent reply	other threads:[~2019-10-14 16:56 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <cover.1570539526.git.kshcherbatov@tarantool.org>
     [not found] ` <8232b0466f3878280a9ad35cb08f437610a36486.1570539526.git.kshcherbatov@tarantool.org>
2019-10-14 16:49   ` [Tarantool-patches] [tarantool-patches] [PATCH v4 1/4] box: " Nikita Pettik
2019-10-15 11:13     ` [Tarantool-patches] [tarantool-patches] " Kirill Shcherbatov
2019-10-15 21:47       ` Nikita Pettik
2019-10-16  5:52         ` Konstantin Osipov
2019-10-16 11:19           ` Nikita Pettik
2019-10-16 13:50             ` Kirill Shcherbatov
2019-10-16 18:09               ` Nikita Pettik
     [not found] ` <d4002407f749fff0c1f0facb1ed4cf66b8b7edd6.1570539526.git.kshcherbatov@tarantool.org>
2019-10-14 16:56   ` Nikita Pettik [this message]
2019-10-15 11:13     ` [Tarantool-patches] [tarantool-patches] Re: [PATCH v4 2/4] sql: " Kirill Shcherbatov
2019-10-16 18:10       ` Nikita Pettik
     [not found] ` <f462f55eebcb13abb8a0611a4d84d7ed8b1a6b6a.1570539526.git.kshcherbatov@tarantool.org>
     [not found]   ` <af095dba-bacd-e35f-9143-30ae59188697@tarantool.org>
2019-10-15 15:15     ` [Tarantool-patches] [tarantool-patches] [PATCH v4 4/4] sql: use name instead of function pointer for UDF Nikita Pettik
2019-10-16 13:51       ` [Tarantool-patches] [tarantool-patches] " Kirill Shcherbatov
2019-10-16 18:08         ` Nikita Pettik
     [not found] ` <4eb8f545449842bc4c468ccf50c494e4c44c32d6.1570539526.git.kshcherbatov@tarantool.org>
     [not found]   ` <20191013125109.GA24391@atlas>
     [not found]     ` <7114925b-190a-4f0d-409f-974d2e6a65dd@tarantool.org>
2019-10-17 13:58       ` [Tarantool-patches] [tarantool-patches] Re: [PATCH v4 3/4] box: do not evaluate ck constraints on recovery Nikita Pettik
2019-10-17 14:12         ` Konstantin Osipov
2019-10-17 14:39           ` Nikita Pettik
2019-10-17 15:18             ` Konstantin Osipov
2019-10-17 16:28               ` Nikita Pettik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191014165657.GB30792@tarantool.org \
    --to=korablev@tarantool.org \
    --cc=tarantool-patches@dev.tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --subject='Re: [Tarantool-patches] [tarantool-patches] [PATCH v4 2/4] sql: add an ability to disable CK constraints' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox