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

Reply via email to