Changeset: 70353a47a547 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/70353a47a547
Modified Files:
        sql/server/rel_updates.c
        sql/test/2024/Tests/returning.test
Branch: returning
Log Message:

allow aggregates in returning clauses


diffs (80 lines):

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
@@ -697,14 +697,14 @@ insert_into(sql_query *query, dlist *qna
                mvc *sql = query->sql;
                sql->type = Q_TABLE;
                list *pexps = sa_list(sql->sa);
+               sql_rel* inner = ins->l;
                for (dnode *n = opt_returning->h; n; n = n->next) {
-                       sql_rel* inner = ins->l;
-                       sql_exp *ce = rel_column_exp(query, &inner, 
n->data.sym, sql_sel | sql_no_subquery | sql_update_set);
+                       sql_exp *ce = rel_column_exp(query, &inner, 
n->data.sym, sql_sel | sql_no_subquery);
                        if (ce == NULL)
                                return NULL;
                        pexps = append(pexps, ce);
                }
-               ins->attr = pexps;
+               ins->attr = is_groupby(inner->op) ? inner->exps : pexps;
        }
 
        return ins;
@@ -1265,14 +1265,14 @@ update_table(sql_query *query, dlist *qn
                if (opt_returning) {
                        sql->type = Q_TABLE;
                        list *pexps = sa_list(sql->sa);
+                       sql_rel* inner = r->l;
                        for (dnode *n = opt_returning->h; n; n = n->next) {
-                               sql_rel* inner = r->l;
-                               sql_exp *ce = rel_column_exp(query, &inner, 
n->data.sym, sql_sel | sql_no_subquery | sql_update_set);
+                               sql_exp *ce = rel_column_exp(query, &inner, 
n->data.sym, sql_sel | sql_no_subquery);
                                if (ce == NULL)
                                        return NULL;
                                pexps = append(pexps, ce);
                        }
-                       r->attr = pexps;
+                       r->attr = is_groupby(inner->op) ? inner->exps : pexps;
                }
 
                return r;
@@ -1345,14 +1345,14 @@ delete_table(sql_query *query, dlist *qn
                if (opt_returning) {
                        sql->type = Q_TABLE;
                        list *pexps = sa_list(sql->sa);
+                       sql_rel* inner = r->l;
                        for (dnode *n = opt_returning->h; n; n = n->next) {
-                               sql_rel* inner = r->l;
                                sql_exp *ce = rel_column_exp(query, &inner, 
n->data.sym, sql_sel | sql_no_subquery | sql_update_set);
                                if (ce == NULL)
                                        return NULL;
                                pexps = append(pexps, ce);
                        }
-                       r->attr = pexps;
+                       r->attr = is_groupby(inner->op) ? inner->exps : pexps;
                }
                return r;
        }
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
@@ -52,15 +52,17 @@ 10
 20
 30
 
+query I nosort
+update foo set i = -i returning sum(j)
+----
+-60
+
 statement error 42000!SELECT: identifier 'k' unknown
 update foo set i = -i returning k
 
 statement error 42000!SELECT: identifier 'k' unknown
 delete from foo where i > 0 returning k
 
-statement error 42000!SUM: aggregate functions not allowed in SET, WHILE, IF, 
ELSE, CASE, WHEN, RETURN, ANALYZE, RETURNING clauses (use subquery)
-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)
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to