Changeset: 6cd048fb16e1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6cd048fb16e1
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        sql/test/BugTracker-2013/Tests/numeric-column-alias.Bug-3279.stable.out
        sql/test/BugTracker-2014/Tests/querylog.Bug-3607.stable.out
Branch: sq2default
Log Message:

fixed merge_project optimizer


diffs (137 lines):

diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -2279,7 +2279,7 @@ exp_push_down_prj(mvc *sql, sql_exp *e, 
                        ne = exps_bind_column(f->exps, e->r, NULL);
                if (!ne || (ne->type != e_column && ne->type != e_atom))
                        return NULL;
-               while (ne && f->op == op_project && ne->type == e_column) {
+               while (ne && has_label(ne) && f->op == op_project && ne->type 
== e_column) {
                        sql_exp *oe = e, *one = ne;
 
                        e = ne;
@@ -3764,7 +3764,7 @@ rel_project_cse(int *changes, mvc *sql, 
                for (n=rel->exps->h; n && !needed; n = n->next) {
                        sql_exp *e1 = n->data;
 
-                       if (e1->type != e_column && e1->type != e_atom && 
exp_name(e1)) {
+                       if (e1->type != e_column && !exp_is_atom(e1) && 
exp_name(e1)) {
                                for (m=n->next; m; m = m->next){
                                        sql_exp *e2 = m->data;
                                
@@ -3781,7 +3781,7 @@ rel_project_cse(int *changes, mvc *sql, 
                for (n=rel->exps->h; n; n = n->next) {
                        sql_exp *e1 = n->data;
 
-                       if (e1->type != e_column && e1->type != e_atom && 
exp_name(e1)) {
+                       if (e1->type != e_column && !exp_is_atom(e1) && 
exp_name(e1)) {
                                for (m=nexps->h; m; m = m->next){
                                        sql_exp *e2 = m->data;
                                
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
@@ -1022,9 +1022,9 @@ rel_column_ref(sql_query *query, sql_rel
                }
                if (!exp && !var)
                        return sql_error(sql, 02, SQLSTATE(42000) "SELECT: 
identifier '%s' unknown", name);
-               if (exp && inner && inner->card <= CARD_AGGR && exp->card > 
CARD_AGGR && is_sql_sel(f) && !is_sql_aggr(f))
+               if (exp && inner && inner->card <= CARD_AGGR && exp->card > 
CARD_AGGR && (is_sql_sel(f) || is_sql_having(f)) && !is_sql_aggr(f))
                        return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column '%s' in query results without an 
aggregate function", name);
-               if (exp && inner && is_groupby(inner->op) && !is_sql_aggr(f) && 
!is_freevar(exp)) 
+               if (exp && inner && is_groupby(inner->op) && !is_sql_aggr(f) && 
!is_freevar(exp))
                        exp = rel_groupby_add_aggr(sql, inner, exp);
        } else if (dlist_length(l) == 2) {
                char *tname = l->h->data.sval;
@@ -1081,9 +1081,9 @@ rel_column_ref(sql_query *query, sql_rel
                }
                if (!exp)
                        return sql_error(sql, 02, SQLSTATE(42S22) "SELECT: no 
such column '%s.%s'", tname, cname);
-               if (exp && inner && inner->card <= CARD_AGGR && exp->card > 
CARD_AGGR && is_sql_sel(f) && !is_sql_aggr(f))
+               if (exp && inner && inner->card <= CARD_AGGR && exp->card > 
CARD_AGGR && (is_sql_sel(f) || is_sql_having(f)) && !is_sql_aggr(f))
                        return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column '%s.%s' in query results without an 
aggregate function", tname, cname);
-               if (exp && inner && is_groupby(inner->op) && !is_sql_aggr(f) && 
!is_freevar(exp)) 
+               if (exp && inner && is_groupby(inner->op) && !is_sql_aggr(f) && 
!is_freevar(exp))
                        exp = rel_groupby_add_aggr(sql, inner, exp);
        } else if (dlist_length(l) >= 3) {
                return sql_error(sql, 02, SQLSTATE(42000) "TODO: column names 
of level >= 3");
diff --git 
a/sql/test/BugTracker-2013/Tests/numeric-column-alias.Bug-3279.stable.out 
b/sql/test/BugTracker-2013/Tests/numeric-column-alias.Bug-3279.stable.out
--- a/sql/test/BugTracker-2013/Tests/numeric-column-alias.Bug-3279.stable.out
+++ b/sql/test/BugTracker-2013/Tests/numeric-column-alias.Bug-3279.stable.out
@@ -57,7 +57,7 @@ stdout of test 'numeric-column-alias.Bug
 #      D1.c3 as c4,
 #      D1.c4 as c5
 #from SAWITH0 D1;
-% .L13,        .L15,   .L17,   .L21,   .L23 # table_name
+% .,   .d1,    .d1,    .d1,    .d1 # table_name
 % c1,  c2,     c3,     c4,     c5 # name
 % tinyint,     char,   char,   char,   tinyint # type
 % 1,   1,      1,      1,      1 # length
@@ -73,7 +73,7 @@ stdout of test 'numeric-column-alias.Bug
 #      D1.c4 as c5
 #from SAWITH0 D1
 #order by 5, 4, 3, 2;
-% .L13,        .L15,   .L17,   .L21,   .L23 # table_name
+% .,   .d1,    .d1,    .d1,    .d1 # table_name
 % c1,  c2,     c3,     c4,     c5 # name
 % tinyint,     char,   char,   char,   tinyint # type
 % 1,   1,      1,      1,      1 # length
@@ -89,7 +89,7 @@ stdout of test 'numeric-column-alias.Bug
 #      D1.c4 as a5
 #from SAWITH0 D1
 #order by 5, 4, 3, 2;
-% .L13,        .L15,   .L17,   .L21,   .L23 # table_name
+% .,   .,      .,      .,      . # table_name
 % c1,  a2,     a3,     a4,     a5 # name
 % tinyint,     char,   char,   char,   tinyint # type
 % 1,   1,      1,      1,      1 # length
@@ -107,7 +107,7 @@ stdout of test 'numeric-column-alias.Bug
 #      D1.c4 as c2,
 #      D1.c2 as c7
 #    from  SAWITH1 D1 );
-% .L37,        .L37 # table_name
+% .%15,        .%15 # table_name
 % c2,  c7 # name
 % varchar,     tinyint # type
 % 1,   1 # length
@@ -127,7 +127,7 @@ stdout of test 'numeric-column-alias.Bug
 #      D1.c4 as c200000,
 #      D1.c2 as c7
 #from  SAWITH1 D1 );
-% .L37,        .L37 # table_name
+% .%15,        .%15 # table_name
 % c200000,     c7 # name
 % varchar,     tinyint # type
 % 1,   1 # length
@@ -142,7 +142,7 @@ stdout of test 'numeric-column-alias.Bug
 #      cast(NULL as  VARCHAR ( 1 ) ) as c2,
 #      D1.c2 as c7
 #from  SAWITH0 D1;
-% .L23,        .L25 # table_name
+% .%10,        .%11 # table_name
 % c2,  c7 # name
 % varchar,     tinyint # type
 % 0,   1 # length
@@ -156,7 +156,7 @@ stdout of test 'numeric-column-alias.Bug
 #      D1.c2 as c7
 #from  SAWITH0 D1
 #ORDER BY 1;
-% .L23,        .L25 # table_name
+% .,   . # table_name
 % c2,  c7 # name
 % varchar,     tinyint # type
 % 0,   1 # length
diff --git a/sql/test/BugTracker-2014/Tests/querylog.Bug-3607.stable.out 
b/sql/test/BugTracker-2014/Tests/querylog.Bug-3607.stable.out
--- a/sql/test/BugTracker-2014/Tests/querylog.Bug-3607.stable.out
+++ b/sql/test/BugTracker-2014/Tests/querylog.Bug-3607.stable.out
@@ -68,8 +68,8 @@ stdout of test 'querylog.Bug-3607` in di
 % oid, timestamp,      timestamp,      clob,   bigint, bigint, bigint, int,    
int # type
 % 3,   26,     26,     0,      1,      1,      1,      1,      1 # length
 #select 1;
-% .L2 # table_name
-% L2 # name
+% . # table_name
+% single_value # name
 % tinyint # type
 % 1 # length
 [ 1    ]
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to