Changeset: 9b77e58aa75e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9b77e58aa75e
Modified Files:
        sql/server/rel_select.c
        sql/test/bugs/Tests/zero_or_one_bug.stable.out
Branch: Jul2012
Log Message:

fixed bug 3093. When we repeat the projection of partial query before the 
correlated subquery we need to use the aliases of this partial projection.


diffs (71 lines):

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
@@ -4744,7 +4744,7 @@ rel_select_exp(mvc *sql, sql_rel *rel, s
        list *pre_prj = NULL;
        list *outer_gbexps = NULL;
        sql_rel *inner = NULL;
-       int decorrelated = 0;
+       int decorrelated = 0, projection = 0;
 
        assert(sn->s.token == SQL_SELECT);
        if (!sn->selection)
@@ -4973,6 +4973,7 @@ rel_select_exp(mvc *sql, sql_rel *rel, s
                        sql_exp *e = rel_lastexp(sql, rel->r);
                        list *exps = list_dup(pre_prj, (fdup)NULL);
 
+                       projection = 1;
                        exps = list_merge(exps, rel_projections(sql, outer, 
NULL, 1, 1), (fdup)NULL);
                        rel = rel_project(sql->sa, rel, exps);
                        rel_project_add_exp(sql, rel, e);
@@ -4990,6 +4991,7 @@ rel_select_exp(mvc *sql, sql_rel *rel, s
        if (outer && pre_prj) {
                sql_rel *l;
                node *n;
+               list *exps;
 
                if (outer_gbexps) {
                        assert(is_groupby(rel->op));
@@ -5003,7 +5005,20 @@ rel_select_exp(mvc *sql, sql_rel *rel, s
                        rel->exps = outer_gbexps;
                        exps_fix_card(outer_gbexps, rel->card);
                }
-               l = rel = rel_project(sql->sa, rel, pre_prj);
+               if (projection) {
+                       exps = new_exp_list(sql->sa);
+                       for (n = pre_prj->h; n; n = n->next) {
+                               sql_exp *pe = n->data;
+
+                               if (!exp_name(pe))
+                                       exp_label(sql->sa, pe, ++sql->label);
+                               pe = exp_column(sql->sa, exp_relname(pe), 
exp_name(pe), exp_subtype(pe), exp_card(pe), has_nil(pe), is_intern(pe));
+                               append(exps, pe);
+                       }
+               } else {
+                       exps = pre_prj;
+               }
+               l = rel = rel_project(sql->sa, rel, exps);
                while(l && l->op != op_join)
                        l = l->l;
                if (l && l->op == op_join && l->l == outer && ek.card != 
card_set)
diff --git a/sql/test/bugs/Tests/zero_or_one_bug.stable.out 
b/sql/test/bugs/Tests/zero_or_one_bug.stable.out
--- a/sql/test/bugs/Tests/zero_or_one_bug.stable.out
+++ b/sql/test/bugs/Tests/zero_or_one_bug.stable.out
@@ -60,7 +60,7 @@ Ready.
 #FROM  my_table1 x
 #;
 % .,   .my_table2 # table_name
-% isnull_not_isnull_id1,       L2 # name
+% L3,  L2 # name
 % int, varchar # type
 % 1,   0 # length
 [ 1,   NULL    ]
@@ -78,7 +78,7 @@ Ready.
 #FROM  my_table1 x
 #;
 % .,   .my_table2 # table_name
-% isnull_not_isnull_id1,       my_col1 # name
+% L3,  my_col1 # name
 % int, varchar # type
 % 1,   0 # length
 [ 1,   NULL    ]
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to