Changeset: dee77ea35123 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/dee77ea35123
Modified Files:
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_select.c
sql/server/rel_unnest.c
sql/test/BugTracker-2024/Tests/rel_groupby_cse-Bug-7484.test
Branch: label
Log Message:
some more cleanup and fixes for the new labeling
diffs (182 lines):
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -1101,12 +1101,15 @@ exp_label(allocator *sa, sql_exp *e, int
}
list*
-exps_label(allocator *sa, list *exps, int nr)
+exps_label(mvc *sql, list *exps)
{
if (!exps)
return NULL;
+
+ int nr = sql->label+1;
+ sql->label += list_length(exps);
for (node *n = exps->h; n; n = n->next)
- n->data = exp_label(sa, n->data, nr++);
+ n->data = exp_label(sql->sa, n->data, nr++);
list_hash_clear(exps);
return exps;
}
@@ -1318,6 +1321,22 @@ exps_find_exp( list *l, sql_exp *e)
return NULL;
}
+sql_exp*
+exps_find_equal_exp( list *l, sql_exp *e)
+{
+ node *n;
+
+ if (!l || !l->h)
+ return NULL;
+
+ for(n=l->h; n; n = n->next) {
+ sql_exp *s = n->data;
+ if (exp_match(n->data, e) || (s->nid && s->nid == e->nid))
+ return n->data;
+ }
+ return NULL;
+}
+
/* c refers to the parent p */
int
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -123,7 +123,7 @@ extern void exp_prop_alias(allocator *sa
extern void noninternexp_setname(mvc *sql, sql_exp *e, const char *rname,
const char *name );
extern char* make_label(allocator *sa, int nr);
extern sql_exp* exp_label(allocator *sa, sql_exp *e, int nr);
-extern list* exps_label(allocator *sa, list *exps, int nr);
+extern list* exps_label(mvc *sql, list *exps);
extern sql_exp * exp_copy( mvc *sql, sql_exp *e);
extern list * exps_copy( mvc *sql, list *exps);
@@ -149,6 +149,7 @@ extern int exp_refers( sql_exp *p, sql_e
extern sql_exp *exps_refers( sql_exp *p, list *exps);
extern int exp_match( sql_exp *e1, sql_exp *e2);
extern sql_exp* exps_find_exp( list *l, sql_exp *e);
+extern sql_exp* exps_find_equal_exp( list *l, sql_exp *e);
extern int exp_match_exp( sql_exp *e1, sql_exp *e2);
extern int exp_match_exp_semantics( sql_exp *e1, sql_exp *e2, bool semantics);
extern sql_exp* exps_any_match(list *l, sql_exp *e);
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
@@ -1423,8 +1423,10 @@ rel_column_ref(sql_query *query, sql_rel
else
exp->card = CARD_ATOM;
set_freevar(exp, i);
+ /*
if (exp->alias.label == exp->nid)
exp->alias.label = -(sql->nid++);
+ */
if (!is_sql_where(of) && !is_sql_aggr(of) &&
!is_sql_aggr(f) && !outer->grouped)
set_outer(outer);
}
@@ -1521,8 +1523,10 @@ rel_column_ref(sql_query *query, sql_rel
else
exp->card = CARD_ATOM;
set_freevar(exp, i);
+ /*
if (exp->alias.label == exp->nid)
exp->alias.label = -(sql->nid++);
+ */
if (!is_sql_where(of) && !is_sql_aggr(of) &&
!is_sql_aggr(f) && !outer->grouped)
set_outer(outer);
}
@@ -5134,6 +5138,8 @@ rel_value_exp2(sql_query *query, sql_rel
exp_kind nek = ek;
nek.aggr = is_sql_aggr(f);
r = rel_subquery(query, se, nek);
+ if (r)
+ exps_label(sql, r->exps);
}
if (rel && *rel) {
*rel = query_pop_outer(query);
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
@@ -752,7 +752,6 @@ rel_general_unnest(mvc *sql, sql_rel *re
if (rel && (is_join(rel->op) || is_semi(rel->op)) && is_dependent(rel)
&& ad) {
list *fd;
node *n, *m;
- int nr;
sql_rel *l = rel->l, *r = rel->r, *inner_r;
@@ -781,7 +780,7 @@ rel_general_unnest(mvc *sql, sql_rel *re
r = rel_project(sql->sa, r,
(is_semi(inner_r->op))?sa_list(sql->sa):rel_projections(sql, r->r, NULL, 1, 1));
- if (!is_semi(inner_r->op)) { /* skip the free vars */
+ if (!is_semi(inner_r->op)) { /* Remove the freevars exps */
list *exps = sa_list(sql->sa);
for(node *n=r->exps->h; n; n = n->next) {
@@ -789,6 +788,11 @@ rel_general_unnest(mvc *sql, sql_rel *re
if (e->nid)
ne = exps_bind_nid(ad, e->nid);
+ if (or && is_groupby(or->op) && or->r) { /* is
e a reference to an group by col */
+ sql_exp *gbe = exps_bind_nid(or->r,
e->nid);
+ if (gbe)
+ ne = exps_bind_nid(ad,
gbe->nid);
+ }
/*
if (e->l) {
ne = exps_bind_column2(ad, e->l, e->r,
NULL);
@@ -803,9 +807,7 @@ rel_general_unnest(mvc *sql, sql_rel *re
}
/* append ad + rename */
- nr = sql->label+1;
- sql->label += list_length(ad);
- fd = exps_label(sql->sa, exps_copy(sql, ad), nr);
+ fd = exps_label(sql, exps_copy(sql, ad));
for (n = ad->h, m = fd->h; n && m; n = n->next, m = m->next) {
sql_exp *l = n->data, *r = m->data, *e;
@@ -3816,7 +3818,7 @@ rewrite_groupings(visitor *v, sql_rel *r
for (node *nn = groups->h ; nn
; nn = nn->next) {
sql_exp *exp =
(sql_exp*) nn->data;
- if (!exps_find_exp(l,
exp)) {
+ if
(!exps_find_equal_exp(l, exp)) {
switch
(ATOMstorage(a->data.vtype)) {
case
TYPE_bte:
a->data.val.btval += (bte) (1 << counter);
@@ -3845,7 +3847,7 @@ rewrite_groupings(visitor *v, sql_rel *r
ne = exp_atom(v->sql->sa, a);
if (exp_name(e))
exp_prop_alias(v->sql->sa, ne, e);
- } else if (e->type == e_column &&
!exps_find_exp(l, e) && !has_label(e)) {
+ } else if (e->type == e_column &&
!exps_find_equal_exp(l, e) && !has_label(e)) {
/* do not include in the output
of the group by, but add to the project as null */
ne = exp_atom(v->sql->sa,
atom_general(v->sql->sa, exp_subtype(e), NULL, 0));
if (exp_name(e))
diff --git a/sql/test/BugTracker-2024/Tests/rel_groupby_cse-Bug-7484.test
b/sql/test/BugTracker-2024/Tests/rel_groupby_cse-Bug-7484.test
--- a/sql/test/BugTracker-2024/Tests/rel_groupby_cse-Bug-7484.test
+++ b/sql/test/BugTracker-2024/Tests/rel_groupby_cse-Bug-7484.test
@@ -8,19 +8,16 @@ WITH x AS ( SELECT 1 x UNION SELECT 1 )
----
1
-skipif knownfail
query I nosort
WITH x AS ( SELECT 1 x UNION SELECT 1 ) SELECT x FROM ( SELECT ( CASE WHEN 1
THEN x END ) x , 1 * x FROM x UNION SELECT 1 , 1 ) AS
----
1
-skipif knownfail
query I nosort
WITH x AS ( SELECT 1 x UNION SELECT 1 ) SELECT x FROM x WHERE ( SELECT x FROM
( SELECT ( CASE WHEN 1 THEN x END ) x , 1 * x FROM x UNION SELECT x , x ) AS )
----
1
-skipif knownfail
query I nosort
SELECT ( WITH x AS ( SELECT 1 x UNION SELECT 1 ) SELECT x FROM x WHERE (
SELECT x FROM ( SELECT ( CASE WHEN 1 THEN x END ) x , 1 * x FROM x UNION SELECT
x , x ) AS ) )
----
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]