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 -- [email protected]
To unsubscribe send an email to [email protected]