Changeset: bfe9b09d1cd5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/bfe9b09d1cd5
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_updates.c
        sql/server/sql_parser.y
        sql/test/2024/Tests/returning.test
Branch: returning
Log Message:

fix DELETE ... RETURNING statements with no WHERE clause


diffs (60 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -6699,8 +6699,8 @@ rel2bin_delete(backend *be, sql_rel *rel
        }
 
        if (rel->attr) {
-               sql_rel* sel = ((sql_rel*) rel->r)->l;
-               sql_rel* ret = rel_project(sql->sa, sel, rel->attr);
+               sql_rel* inner = rel->r?((sql_rel*) rel->r)->l:rel->l;
+               sql_rel* ret = rel_project(sql->sa, inner, rel->attr);
                s = subrel_bin(be, ret, refs);
                s = subrel_project(be, s, refs, rel);
                sql->type = Q_TABLE;
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -1331,9 +1331,11 @@ delete_table(sql_query *query, dlist *qn
                        list *pexps = sa_list(sql->sa);
                        for (dnode *n = opt_returning->h; n; n = n->next) {
                                sql_rel* inner = r->l;
-                               sql_rel* sel = ((sql_rel*) r->r)->l;
-                               assert(is_select(sel->op));
-                               (void) rel_dup (sel); // required to prevent 
recalculating select in rel2bin_delete
+                               if (r->r) {
+                                       sql_rel* sel = ((sql_rel*) r->r)->l;
+                                       assert(is_select(sel->op));
+                                       (void) rel_dup (sel); // required to 
prevent recalculating select in rel2bin_delete
+                               }
                                sql_exp *ce = rel_column_exp(query, &inner, 
n->data.sym, sql_sel | sql_no_subquery | sql_update_set);
                                if (ce == NULL)
                                        return sql_error(sql, 02, 
SQLSTATE(42000) "aggregate functions and subqueries are not allowed in 
RETURNING clause");
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -6107,7 +6107,6 @@ non_reserved_word:
 | NIL          { $$ = sa_strdup(SA, "nil"); }
 | PASSING      { $$ = sa_strdup(SA, "passing"); }
 | REF          { $$ = sa_strdup(SA, "ref"); }
-| RETURNING    { $$ = sa_strdup(SA, "returning"); }
 | STRIP                { $$ = sa_strdup(SA, "strip"); }
 | URI          { $$ = sa_strdup(SA, "uri"); }
 | WHITESPACE   { $$ = sa_strdup(SA, "whitespace"); }
diff --git a/sql/test/2024/Tests/returning.test 
b/sql/test/2024/Tests/returning.test
--- a/sql/test/2024/Tests/returning.test
+++ b/sql/test/2024/Tests/returning.test
@@ -63,3 +63,13 @@ update foo set i = -i returning sum(i)
 
 statement error 42000!SELECT: subquery not allowed
 update foo set i = -i returning i in (select j from foo)
+
+statement error 42000!SELECT: identifier 'k' unknown
+delete from foo returning k
+
+query I nosort
+delete from foo returning i*i
+----
+1
+4
+9
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to