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 -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org