Changeset: 9c840c4243a9 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/9c840c4243a9 Modified Files: sql/server/rel_schema.c sql/test/2024/Tests/check.test Branch: Aug2024 Log Message:
Fixes #7577: CHECK constraint on single column can use any column in table diffs (67 lines): diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c --- a/sql/server/rel_schema.c +++ b/sql/server/rel_schema.c @@ -466,8 +466,8 @@ column_constraint_type(sql_query *query, return res; } char* check = NULL; + sql_rel* check_rel = NULL; if (kt == ckey) { - sql_rel* check_rel = NULL; if ((check_rel = create_check_plan(query, s, t)) == NULL) { return -3; } @@ -484,6 +484,32 @@ column_constraint_type(sql_query *query, default: break; } + if (check) { + sql_rel* btrel = check_rel->l; + node* n = NULL; + for (n = btrel->exps->h; n; n = n->next) { + sql_exp* e = n->data; + const char *nm = e->alias.name; + sql_column *c = mvc_bind_column(sql, t, nm); + if (!c) { + (void) sql_error(sql, ERR_NOTFOUND, SQLSTATE(42S22) "CONSTRAINT CHECK: no such column '%s' for table '%s'", + nm, t->base.name); + return SQL_ERR; + } + switch (mvc_create_kc(sql, k, c)) { + case -1: + (void) sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); + return SQL_ERR; + case -2: + case -3: + (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT CHECK: transaction conflict detected"); + return SQL_ERR; + default: + break; + } + } + } + else switch (mvc_create_kc(sql, k, cs)) { case -1: (void) sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); diff --git a/sql/test/2024/Tests/check.test b/sql/test/2024/Tests/check.test --- a/sql/test/2024/Tests/check.test +++ b/sql/test/2024/Tests/check.test @@ -69,3 +69,17 @@ insert into t3335 values(3) statement ok drop table t3335 +statement ok +create table bar(i int, j int check (i < 10)) + +statement error 40002!INSERT INTO: CHECK constraint violated: bar_j_check +insert into bar(i) values(10) + +statement ok +insert into bar(i) values(0) + +statement error 40002!UPDATE: CHECK constraint violated: bar_j_check +update bar set i = 10 + +statement ok +update bar set i = 1 _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org