Changeset: 2e9f6c7ee5f6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2e9f6c7ee5f6
Modified Files:
        sql/server/rel_rel.c
        sql/server/rel_unnest.c
Branch: Jun2020
Log Message:

Run rel_reset_subquery and _rel_unnest under rel_visitors, so psm statments 
under op_ddl are unnested


diffs (165 lines):

diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -1786,8 +1786,6 @@ rel_deps(mvc *sql, sql_rel *r, list *ref
                                return rel_deps(sql, r->l, refs, l);
                        if (r->r)
                                return rel_deps(sql, r->r, refs, l);
-               } else if (r->flag == ddl_psm) {
-                       break;
                } else if (r->flag == ddl_create_seq || r->flag == 
ddl_alter_seq) {
                        if (r->l)
                                return rel_deps(sql, r->l, refs, l);
@@ -1962,8 +1960,6 @@ rel_exp_visitor(mvc *sql, sql_rel *rel, 
                        if (rel->r)
                                if ((rel->r = rel_exp_visitor(sql, rel->r, 
exp_rewriter, topdown)) == NULL)
                                        return NULL;
-               } else if (rel->flag == ddl_psm) {
-                       break;
                }
                break;
        case op_insert:
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -1403,112 +1403,23 @@ rel_unnest_dependent(mvc *sql, sql_rel *
 }
 
 static sql_rel *
-_rel_unnest(mvc *sql, sql_rel *rel)
+_rel_unnest(mvc *sql, sql_rel *rel, int *changes)
 {
-       if (THRhighwater())
-               return sql_error(sql, 10, SQLSTATE(42000) "Query too complex: 
running out of stack space");
-       if (!rel)
-               return rel;
-
-       switch (rel->op) {
-       case op_basetable:
-               break;
-       case op_table:
-               if (IS_TABLE_PROD_FUNC(rel->flag) || rel->flag == 
TABLE_FROM_RELATION)
-                       rel->l = _rel_unnest(sql, rel->l);
-               break;
-       case op_join: 
-       case op_left: 
-       case op_right: 
-       case op_full: 
-
-       case op_semi: 
-       case op_anti: 
-
-       case op_union: 
-       case op_inter: 
-       case op_except: 
-               rel->l = _rel_unnest(sql, rel->l);
-               rel->r = _rel_unnest(sql, rel->r);
-               break;
-       case op_project:
-       case op_select: 
-       case op_groupby: 
-       case op_topn: 
-       case op_sample: 
-               rel->l = _rel_unnest(sql, rel->l);
-               break;
-       case op_ddl:
-               rel->l = _rel_unnest(sql, rel->l);
-               if (rel->r)
-                       rel->r = _rel_unnest(sql, rel->r);
-               break;
-       case op_insert:
-       case op_update:
-       case op_delete:
-       case op_truncate:
-               rel->l = _rel_unnest(sql, rel->l);
-               rel->r = _rel_unnest(sql, rel->r);
-               break;
+       if (is_dependent(rel)) {
+               rel = rel_unnest_dependent(sql, rel);
+               (*changes)++;
        }
-       if (is_dependent(rel)) 
-               rel = rel_unnest_dependent(sql, rel);
        return rel;
 }
 
-static void
-rel_reset_subquery(sql_rel *rel)
+static sql_rel *
+rel_reset_subquery(mvc *sql, sql_rel *rel, int *changes)
 {
-       if (!rel)
-               return;
-
+       (void) sql;
+       if (rel->subquery)
+               (*changes)++;
        rel->subquery = 0;
-       switch(rel->op){
-       case op_basetable:
-               break;
-       case op_table:
-               if ((IS_TABLE_PROD_FUNC(rel->flag) || rel->flag == 
TABLE_FROM_RELATION) && rel->l)
-                       rel_reset_subquery(rel->l);
-               break;
-       case op_ddl:
-               rel_reset_subquery(rel->l);
-               if (rel->r)
-                       rel_reset_subquery(rel->r);
-               break;
-       case op_insert:
-       case op_update:
-       case op_delete:
-       case op_truncate:
-               if (rel->l)
-                       rel_reset_subquery(rel->l);
-               if (rel->r)
-                       rel_reset_subquery(rel->r);
-               break;
-       case op_select:
-       case op_topn:
-       case op_sample:
-
-       case op_project:
-       case op_groupby:
-               if (rel->l)
-                       rel_reset_subquery(rel->l);
-               break;
-       case op_join:
-       case op_left:
-       case op_right:
-       case op_full:
-       case op_semi:
-       case op_anti:
-
-       case op_union:
-       case op_inter:
-       case op_except:
-               if (rel->l)
-                       rel_reset_subquery(rel->l);
-               if (rel->r)
-                       rel_reset_subquery(rel->r);
-       }
-
+       return rel;
 }
 
 static sql_exp *
@@ -2752,7 +2663,7 @@ rel_unnest(mvc *sql, sql_rel *rel)
 {
        int changes = 0;
 
-       rel_reset_subquery(rel);
+       rel = rel_visitor_topdown(sql, rel, &rel_reset_subquery, &changes);
        rel = rel_exp_visitor_bottomup(sql, rel, &rewrite_simplify_exp);
        rel = rel_visitor_bottomup(sql, rel, &rewrite_simplify, &changes);
        rel = rel_visitor_bottomup(sql, rel, &rewrite_or_exp, &changes);
@@ -2772,7 +2683,7 @@ rel_unnest(mvc *sql, sql_rel *rel)
        rel = rel_visitor_bottomup(sql, rel, &rewrite_simplify, &changes);      
        /* as expressions got merged before, lets try to simplify again */
        if (changes > 0)
                rel = rel_visitor_bottomup(sql, rel, &rel_remove_empty_select, 
&changes);
-       rel = _rel_unnest(sql, rel);
+       rel = rel_visitor_bottomup(sql, rel, &_rel_unnest, &changes);
        rel = rel_visitor_bottomup(sql, rel, &rewrite_fix_count, &changes);     
/* fix count inside a left join (adds a project (if (cnt IS null) then (0) else 
(cnt)) */
        rel = rel_visitor_bottomup(sql, rel, &rewrite_remove_xp, &changes);     
/* remove crossproducts with project [ atom ] */
        rel = rel_visitor_bottomup(sql, rel, &rewrite_groupings, &changes);     
/* transform group combinations into union of group relations */
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to