Changeset: 3f4075dc2680 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3f4075dc2680
Modified Files:
        sql/server/rel_rel.h
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/test/2024/Tests/check.test
Branch: check
Log Message:

disallow arbitrary subqueries in CHECK constraints


diffs (67 lines):

diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h
--- a/sql/server/rel_rel.h
+++ b/sql/server/rel_rel.h
@@ -35,6 +35,7 @@
 #define psm_call         (1 << 15) //ORed
 #define sql_or           (1 << 16) //ORed
 #define sql_merge        (1 << 17) //ORed
+#define sql_no_subquery  (1 << 18) //ORed
 
 #define is_sql_from(X)         ((X & sql_from) == sql_from)
 #define is_sql_where(X)        ((X & sql_where) == sql_where)
@@ -54,6 +55,7 @@
 #define is_psm_call(X)         ((X & psm_call) == psm_call)
 #define is_sql_or(X)           ((X & sql_or) == sql_or)
 #define is_sql_merge(X)        ((X & sql_merge) == sql_merge)
+#define is_sql_no_subquery(X)  ((X & sql_no_subquery) == sql_no_subquery)
 
 #define is_anyequal_func(sf) (strcmp((sf)->func->base.name, "sql_anyequal") == 
0 || strcmp((sf)->func->base.name, "sql_not_anyequal") == 0)
 #define is_anyequal(sf) (strcmp((sf)->func->base.name, "sql_anyequal") == 0)
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
@@ -22,6 +22,7 @@
 #include "rel_psm.h"
 #include "rel_dump.h"
 #include "rel_propagate.h"
+#include "rel_unnest.h"
 #include "sql_parser.h"
 #include "sql_privileges.h"
 #include "sql_partition.h"
@@ -409,8 +410,8 @@ sql_rel* create_check_plan(sql_query *qu
        mvc *sql = query->sql;
        exp_kind ek = {type_value, card_value, FALSE};
        sql_rel* rel = rel_basetable(sql, t, t->base.name);
-       sql_exp *e = rel_logical_value_exp(query, &rel, s->data.sym, sql_sel, 
ek);
-       rel->exps = rel_base_projection(sql, rel, 0);
+       sql_exp *e = rel_logical_value_exp(query, &rel, s->data.sym, sql_sel | 
sql_no_subquery, ek);
+       rel->exps = rel_base_projection(sql, rel, 0);   
        list *pexps = sa_list(sql->sa);
        pexps = append(pexps, e);
        rel = rel_project(sql->sa, rel, pexps);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -4988,6 +4988,9 @@ rel_value_exp2(sql_query *query, sql_rel
                        assert(se->token == SQL_SELECT);
                        exp_kind nek = ek;
                        nek.aggr = is_sql_aggr(f);
+                       if (is_sql_no_subquery(f))
+                               return sql_error(sql, 02, SQLSTATE(42000) 
"SELECT: subquery not allowed");
+
                        r = rel_subquery(query, se, nek);
                }
                if (rel && *rel) {
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
@@ -33,3 +33,9 @@ update bar set i = 50 where i = 30
 
 statement error
 update bar set i = 50, j = 40 where i = 30
+
+statement error
+create table baz(j int check (j > (select max(i) from foo)))
+
+statement error
+create table baz(j int check (j in (select i from foo)))
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to