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

Reply via email to