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