Changeset: d6876ccea89a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d6876ccea89a
Modified Files:
sql/server/rel_schema.c
sql/test/SQLancer/Tests/sqlancer22.test
Branch: Jan2022
Log Message:
Look for with queries when validating a view. Also make sure the output
subquery is a projection
diffs (82 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
@@ -133,10 +133,6 @@ as_subquery(mvc *sql, sql_table *t, tabl
if (!r)
return 0;
-
- if (is_topn(r->op) || is_sample(r->op))
- r = sq->l;
-
if (column_spec) {
dnode *n = column_spec->h;
node *m = r->exps->h;
@@ -1374,6 +1370,8 @@ rel_create_table(sql_query *query, int t
sq = rel_selects(query, subquery);
if (!sq)
return NULL;
+ if (!is_project(sq->op)) /* make sure sq is a projection */
+ sq = rel_project(sql->sa, sq, rel_projections(sql, sq,
NULL, 1, 1));
if (tt != tt_table && with_data)
return sql_error(sql, 02, SQLSTATE(42000) "%s TABLE:
cannot create %s 'with data'", action,
@@ -1423,9 +1421,12 @@ rel_create_view(sql_query *query, dlist
if (ast) {
sql_rel *sq = NULL;
char *q = QUERY(sql->scanner);
+ symbol *sym = ast;
- if (ast->token == SQL_SELECT) {
- SelectNode *sn = (SelectNode *) ast;
+ if (sym->token == SQL_WITH)
+ sym = sym->data.lval->h->next->data.sym;
+ if (sym->token == SQL_SELECT) {
+ SelectNode *sn = (SelectNode *) sym;
if (sn->limit || sn->sample)
return sql_error(sql, 01, SQLSTATE(42000) "%s:
%s not supported", base, sn->limit ? "LIMIT" : "SAMPLE");
@@ -1434,6 +1435,8 @@ rel_create_view(sql_query *query, dlist
sq = schema_selects(query, s, ast);
if (!sq)
return NULL;
+ if (!is_project(sq->op)) /* make sure sq is a projection */
+ sq = rel_project(sql->sa, sq, rel_projections(sql, sq,
NULL, 1, 1));
if (!create) {
if (column_spec) {
@@ -1469,7 +1472,7 @@ rel_create_view(sql_query *query, dlist
}
if (!persistent && column_spec)
sq = view_rename_columns(sql, name, sq, column_spec);
- if (sq && sq->op == op_project && sq->l && sq->exps && sq->card
== CARD_AGGR) {
+ if (sq && is_simple_project(sq->op) && sq->l && sq->exps &&
sq->card == CARD_AGGR) {
exps_setcard(sq->exps, CARD_MULTI);
sq->card = CARD_MULTI;
}
diff --git a/sql/test/SQLancer/Tests/sqlancer22.test
b/sql/test/SQLancer/Tests/sqlancer22.test
--- a/sql/test/SQLancer/Tests/sqlancer22.test
+++ b/sql/test/SQLancer/Tests/sqlancer22.test
@@ -52,3 +52,22 @@ 1
statement ok
ROLLBACK
+
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE VIEW v1(vc0, vc1, vc2) AS (WITH ctel0n0(ct0n0,ct0n1) AS (VALUES (4, 5))
SELECT 1, 2, 3 FROM ctel0n0)
+
+query III nosort
+SELECT * FROM v1
+----
+1
+2
+3
+
+statement error 42000!CREATE VIEW: LIMIT not supported
+CREATE VIEW v2(vc0, vc1, vc2) AS (WITH ctel0n0(ct0n0,ct0n1) AS (VALUES (4, 5))
SELECT 1, 2, 3 FROM ctel0n0 LIMIT 7)
+
+statement ok
+ROLLBACK
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list