Changeset: 7713c2fcac34 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7713c2fcac34
Modified Files:
        sql/server/rel_optimize_proj.c
        sql/server/rel_select.c
        sql/server/rel_unnest.c
        sql/test/BugTracker-2023/Tests/All
Branch: default
Log Message:

merged with dec2023


diffs (255 lines):

diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c
--- a/sql/server/rel_optimize_proj.c
+++ b/sql/server/rel_optimize_proj.c
@@ -691,7 +691,7 @@ rel_push_project_up_(visitor *v, sql_rel
                for (n = rel->exps->h; n && !fnd; n = n->next) {
                        sql_exp *e = n->data;
 
-                       if (e->type != e_aggr && e->type != e_column && e->type 
!= e_atom) {
+                       if (e->type != e_aggr && e->type != e_column && e->type 
!= e_atom && e->card > CARD_ATOM) {
                                fnd = 1;
                        }
                }
@@ -1370,6 +1370,7 @@ rel_project_cse(visitor *v, sql_rel *rel
                                                sql_exp *ne = 
exp_alias(v->sql->sa, exp_relname(e1), exp_name(e1), exp_relname(e2), 
exp_name(e2), exp_subtype(e2), e2->card, has_nil(e2), is_unique(e2), 
is_intern(e1));
 
                                                ne = exp_propagate(v->sql->sa, 
ne, e1);
+                                               set_selfref(ne);
                                                exp_prop_alias(v->sql->sa, ne, 
e1);
                                                e1 = ne;
                                                break;
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -4143,7 +4143,7 @@ rel_groupings(sql_query *query, sql_rel 
                                                if (e->type != e_column) { /* 
store group by expressions in the stack */
                                                        if 
(is_sql_group_totals(f))
                                                                return 
sql_error(sql, 02, SQLSTATE(42000) "GROUP BY: grouping expressions not possible 
with ROLLUP, CUBE and GROUPING SETS");
-                                                       if 
(!frame_push_groupby_expression(sql, grp, e))
+                                                       if (!exp_has_rel(e) && 
!frame_push_groupby_expression(sql, grp, e))
                                                                return NULL;
                                                }
                                                list_append(next_tuple, e);
@@ -5188,36 +5188,34 @@ group_merge_exps(mvc *sql, list *gexps, 
 {
        int nexps = list_length(gexps) + list_length(exps);
 
-       if (nexps < 5) {
-               return list_distinct(list_merge(gexps, exps, (fdup) NULL), 
(fcmp) exp_equal, (fdup) NULL);
-       } else { /* for longer lists, use hashing */
-               sql_hash *ht = hash_new(sql->ta, nexps, (fkeyvalue)&exp_key);
-
-               for (node *n = gexps->h; n ; n = n->next) { /* first add 
grouping expressions */
-                       sql_exp *e = n->data;
-                       int key = ht->key(e);
-
-                       hash_add(ht, key, e);
-               }
-
-               for (node *n = exps->h; n ; n = n->next) { /* then test if the 
new grouping expressions are already there */
-                       sql_exp *e = n->data;
-                       int key = ht->key(e);
-                       sql_hash_e *he = ht->buckets[key&(ht->size-1)];
-                       bool duplicates = false;
-
-                       for (; he && !duplicates; he = he->chain) {
-                               sql_exp *f = he->value;
-
-                               if (!exp_equal(e, f))
-                                       duplicates = true;
-                       }
-                       hash_add(ht, key, e);
-                       if (!duplicates)
-                               list_append(gexps, e);
-               }
-               return gexps;
-       }
+       sql_hash *ht = hash_new(sql->ta, nexps, (fkeyvalue)&exp_key);
+
+       for (node *n = gexps->h; n ; n = n->next) { /* first add grouping 
expressions */
+               sql_exp *e = n->data;
+               int key = ht->key(e);
+
+               hash_add(ht, key, e);
+       }
+
+       for (node *n = exps->h; n ; n = n->next) { /* then test if the new 
grouping expressions are already there */
+               sql_exp *e = n->data;
+               int key = ht->key(e);
+               sql_hash_e *he = ht->buckets[key&(ht->size-1)];
+               bool duplicates = false;
+
+               for (; he && !duplicates; he = he->chain) {
+                       sql_exp *f = he->value;
+
+                       if (!exp_equal(e, f))
+                               duplicates = true;
+               }
+               hash_add(ht, key, e);
+               if (!duplicates) {
+                       list_append(gexps, e);
+                       n->data = exp_ref(sql, e);
+               }
+       }
+       return gexps;
 }
 
 static list *
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
@@ -1591,6 +1591,8 @@ push_up_table(mvc *sql, sql_rel *rel, li
                                        id = exp_ref(sql, id);
                                } else {
                                        l->l = rel_dup(d);
+                                       if (is_project(l->op))
+                                               rel_bind_vars(sql, l, l->exps);
                                }
                        } else {
                                tf->l = rel_dup(d);
@@ -4343,23 +4345,58 @@ rel_simplify_exp_and_rank(visitor *v, sq
        return e;
 }
 
+static inline sql_rel *
+run_exp_rewriter(visitor *v, sql_rel *rel, exp_rewrite_fptr rewriter, bool 
direction, const char *name)
+{
+       (void)name;
+       /*
+#ifndef NDEBUG
+       int changes = v->changes;
+       lng clk = GDKusec();
+       rel = rel_exp_visitor_bottomup(v, rel, rewriter, direction);
+       printf("%s %d " LLFMT "\n", name, (v->changes - changes), (GDKusec() - 
clk));
+       return rel;
+#else
+*/
+       return rel_exp_visitor_bottomup(v, rel, rewriter, direction);
+//#endif
+}
+
+static inline sql_rel *
+run_rel_rewriter(visitor *v, sql_rel *rel, rel_rewrite_fptr rewriter, const 
char *name)
+{
+       (void)name;
+       /*
+#ifndef NDEBUG
+       int changes = v->changes;
+       lng clk = GDKusec();
+       rel = rel_visitor_bottomup(v, rel, rewriter);
+       printf("%s %d " LLFMT "\n", name, (v->changes - changes), (GDKusec() - 
clk));
+       return rel;
+#else
+*/
+       return rel_visitor_bottomup(v, rel, rewriter);
+//#endif
+}
+
 sql_rel *
 rel_unnest(mvc *sql, sql_rel *rel)
 {
        visitor v = { .sql = sql };
 
-       rel = rel_exp_visitor_bottomup(&v, rel, &rel_simplify_exp_and_rank, 
false);
-       rel = rel_visitor_bottomup(&v, rel, &rel_unnest_simplify);
-
-       rel = rel_exp_visitor_bottomup(&v, rel, &rewrite_complex, true);
-       rel = rel_exp_visitor_bottomup(&v, rel, &rewrite_ifthenelse, false);    
/* add isnull handling */
-       rel = rel_exp_visitor_bottomup(&v, rel, &rewrite_exp_rel, true);
-
-       rel = rel_visitor_bottomup(&v, rel, &rel_unnest_comparison_rewriters);
-       rel = rel_visitor_bottomup(&v, rel, &_rel_unnest);
-       rel = rel_visitor_bottomup(&v, rel, &rewrite_fix_count);        /* fix 
count inside a left join (adds a project (if (cnt IS null) then (0) else (cnt)) 
*/
-       rel = rel_visitor_bottomup(&v, rel, &rel_unnest_projects);
-       rel = rel_exp_visitor_bottomup(&v, rel, 
&exp_reset_card_and_freevar_set_physical_type, false);
+       rel = run_exp_rewriter(&v, rel, &rel_simplify_exp_and_rank, false, 
"simplify_exp_and_rank");
+       rel = run_rel_rewriter(&v, rel, &rel_unnest_simplify, 
"unnest_simplify");
+//if (0) {
+       rel = run_exp_rewriter(&v, rel, &rewrite_complex, true, 
"rewrite_complex");
+       rel = run_exp_rewriter(&v, rel, &rewrite_ifthenelse, false, 
"rewrite_ifthenelse"); /* add isnull handling */
+       rel = run_exp_rewriter(&v, rel, &rewrite_exp_rel, true, 
"rewrite_exp_rel");
+
+       rel = run_rel_rewriter(&v, rel, &rel_unnest_comparison_rewriters, 
"unnest_comparison_rewriters");
+       rel = run_rel_rewriter(&v, rel, &_rel_unnest, "unnest");
+       rel = run_rel_rewriter(&v, rel, &rewrite_fix_count, "fix_count");       
/* fix count inside a left join (adds a project (if (cnt IS null) then (0) else 
(cnt)) */
+       rel = run_rel_rewriter(&v, rel, &rel_unnest_projects, 
"unnest_projects");
+//}
+       rel = run_exp_rewriter(&v, rel, 
&exp_reset_card_and_freevar_set_physical_type, false, 
"exp_reset_card_and_freevar_set_physical_type");
        rel = rel_visitor_topdown(&v, rel, &rel_set_type);
        return rel;
 }
diff --git a/sql/test/BugTracker-2023/Tests/All 
b/sql/test/BugTracker-2023/Tests/All
--- a/sql/test/BugTracker-2023/Tests/All
+++ b/sql/test/BugTracker-2023/Tests/All
@@ -24,3 +24,4 @@ insert-delete-insert-crash-7415
 orderby-debug-crash-7416
 newurl-issue-7417
 rel_order_by-assertion-7418
+HAVE_LIBPY3?aggregate-vararg.Bug-7422
diff --git a/sql/test/BugTracker-2023/Tests/SingleServer 
b/sql/test/BugTracker-2023/Tests/SingleServer
--- a/sql/test/BugTracker-2023/Tests/SingleServer
+++ b/sql/test/BugTracker-2023/Tests/SingleServer
@@ -0,0 +1,1 @@
+--set embedded_py=3
diff --git a/sql/test/BugTracker-2023/Tests/aggregate-vararg.Bug-7422.test 
b/sql/test/BugTracker-2023/Tests/aggregate-vararg.Bug-7422.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2023/Tests/aggregate-vararg.Bug-7422.test
@@ -0,0 +1,20 @@
+statement ok
+CREATE OR REPLACE AGGREGATE python_aggregate (*)
+RETURNS INTEGER
+LANGUAGE PYTHON
+{
+try:
+       unique = numpy.unique(aggr_group)
+       x = numpy.zeros(shape=(unique.size))
+       for i in range(0, unique.size):
+               x[i] = numpy.sum(val[aggr_group==unique[i]])
+except NameError:
+# aggr_group doesn't exist. no groups, aggregate on all data
+       x = numpy.sum(arg2)
+return (x)
+}
+
+query I nosort
+select python_aggregate(5,2);
+----
+2
diff --git a/sql/test/BugTracker-2024/Tests/SQLunionfunc-Bug-7473.test 
b/sql/test/BugTracker-2024/Tests/SQLunionfunc-Bug-7473.test
--- a/sql/test/BugTracker-2024/Tests/SQLunionfunc-Bug-7473.test
+++ b/sql/test/BugTracker-2024/Tests/SQLunionfunc-Bug-7473.test
@@ -1,5 +1,4 @@
-skipif knownfail
 query I nosort
 SELECT ( WITH x ( x ) AS ( SELECT 1 ) SELECT ( WITH x ( x ) AS ( SELECT 
DISTINCT SUM ( 1 ) ) SELECT ( SELECT ( NULLIF ( 9.000000 , 0 ) ) FROM 
GENERATE_SERIES ( 1 , x ) ) FROM x ) FROM x )
 ----
-1
+9
diff --git a/sql/test/BugTracker-2024/Tests/exp_equal-Bug-7478.test 
b/sql/test/BugTracker-2024/Tests/exp_equal-Bug-7478.test
--- a/sql/test/BugTracker-2024/Tests/exp_equal-Bug-7478.test
+++ b/sql/test/BugTracker-2024/Tests/exp_equal-Bug-7478.test
@@ -1,10 +1,10 @@
-skipif knownfail
 query T nosort
 WITH x AS ( SELECT NULL ) SELECT 'x' IN ( SELECT * FROM x GROUP BY 'x' )
 ----
+NULL
 
-skipif knownfail
 query T nosort
 SELECT ( WITH x AS ( SELECT NULL ) SELECT 'x' IN ( SELECT * FROM x GROUP BY 
'x' ) )
 ----
+NULL
 
diff --git a/sql/test/BugTracker-2024/Tests/groupby-select1-Bug-7472.test 
b/sql/test/BugTracker-2024/Tests/groupby-select1-Bug-7472.test
--- a/sql/test/BugTracker-2024/Tests/groupby-select1-Bug-7472.test
+++ b/sql/test/BugTracker-2024/Tests/groupby-select1-Bug-7472.test
@@ -3,7 +3,6 @@ SELECT ( WITH x AS ( SELECT 1 x ) SELECT
 ----
 NULL
 
-skipif knownfail
 query I nosort
 SELECT ( WITH x AS ( SELECT 1 x ) SELECT 1 FROM ( x NATURAL JOIN x ) WHERE x 
NOT IN ( SELECT CASE WHEN x THEN ( SELECT 1 ) END GROUP BY ( SELECT 1 ) ) )
 ----
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to