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

Reply via email to