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]