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