Changeset: 3f680440e949 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3f680440e949
Modified Files:
        sql/server/rel_select.c
        sql/server/rel_unnest.c
        
sql/test/BugTracker-2012/Tests/correlated_groupby_in_selection.Bug-3011.stable.out
        sql/test/BugTracker-2013/Tests/pivot.Bug-3339.stable.err
        sql/test/BugTracker-2013/Tests/syntaxerror.Bug-3399.stable.err
        sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.stable.out
Branch: subquery
Log Message:

fixes for order problems
a fix for table production functions


diffs (230 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
@@ -4185,7 +4185,7 @@ static sql_exp *
                }
        }
        if (a && execute_priv(sql,a->aggr)) {
-               sql_exp *e = exp_aggr(sql->sa, exps, a, distinct, no_nil, 
CARD_ATOM, have_nil(exps));
+               sql_exp *e = exp_aggr(sql->sa, exps, a, distinct, no_nil, 
groupby->card, have_nil(exps));
 
                /* if aggregate is from outer side, move it over */
                if (freevar && query_has_outer(query)) {
@@ -4216,11 +4216,11 @@ static sql_exp *
                                groupby=groupby->l;
 
                        //e->card = groupby->card;
-                       if (*rel != groupby || !is_sql_sel(f)) { /* selection */
+                       if (*rel != groupby || !is_sql_sel(f) || 
is_sql_orderby(f)) { /* selection */
                                //sql_rel *l = NULL;
        
                                e = rel_groupby_add_aggr(sql, groupby, e);
-                               if (p != groupby)
+                               if (p != groupby || is_sql_orderby(f))
                                        e = exp_ref(sql->sa, e);
                                if (!group)
                                        return e;
@@ -4939,7 +4939,6 @@ rel_order_by(sql_query *query, sql_rel *
                                sql->errstr[0] = '\0';
 
                                /* check for project->select->groupby */
-               #if 0
                                if (is_project(rel->op) && is_sql_orderby(f)) {
                                        sql_rel *s = rel->l;
                                        sql_rel *p = rel;
@@ -4960,7 +4959,6 @@ rel_order_by(sql_query *query, sql_rel *
                                                }
                                        }
                                }
-               #endif
                                if (!e)
                                        e = rel_order_by_column_exp(query, 
&rel, col, f);
                                if (e && e->card != rel->card)
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
@@ -174,8 +174,14 @@ rel_freevar(mvc *sql, sql_rel *rel)
                return exps;
 
        case op_basetable:
-       case op_table:
                return NULL;
+       case op_table: {
+               sql_exp *call = rel->r;
+               if (rel->flag != 2 && rel->l)
+                       lexps = rel_freevar(sql, rel->l);
+               exps = (rel->flag != 2 && call)?exps_freevar(sql, call->l):NULL;
+               return merge_freevar(exps, lexps);
+       }
        case op_union:
        case op_except:
        case op_inter:
@@ -239,6 +245,7 @@ rel_dependent_var(mvc *sql, sql_rel *l, 
        return res;
 }
 
+#if 0
 static int
 exps_only_simple_refs(list *exps)
 {
@@ -275,6 +282,7 @@ rel_remove_project(sql_rel *rel)
        }
        return op;
 }
+#endif 
 
 static sql_rel *
 push_up_project(mvc *sql, sql_rel *rel) 
@@ -543,6 +551,22 @@ push_up_set(mvc *sql, sql_rel *rel)
 }
 
 static sql_rel *
+push_up_table(mvc *sql, sql_rel *rel) 
+{
+       (void)sql;
+       if (rel && (is_join(rel->op) || is_semi(rel->op)) && is_dependent(rel)) 
{
+               sql_rel *d = rel->l, *tf = rel->r;
+
+               /* for now just push d into function */
+               if (d && need_distinct(d) && tf && is_base(tf->op)) {
+                       tf->l = rel_dup(d);
+                       return rel;
+               }
+       }
+       return rel;
+}
+
+static sql_rel *
 rel_general_unnest(mvc *sql, sql_rel *rel, list *ad)
 {
        /* current unnest only possible for equality joins, <, <> etc needs 
more work */
@@ -652,7 +676,7 @@ rel_unnest_dependent(mvc *sql, sql_rel *
                if (rel_has_freevar(r)){
                        list *ad;
 
-                       rel->r = r = rel_remove_project(r);
+                       //rel->r = r = rel_remove_project(r);
 
                        if (r && is_simple_project(r->op)) {
                                rel = push_up_project(sql, rel);
@@ -679,8 +703,10 @@ rel_unnest_dependent(mvc *sql, sql_rel *
                                return rel_unnest_dependent(sql, rel);
                        }
 
-                       if (r && is_base(r->op)) /* table functions need 
dependent implementation */
+                       if (r && is_base(r->op)) { /* TODO table functions need 
dependent implementation */
+                               rel = push_up_table(sql, rel);
                                return rel; 
+                       }
 
                        /* fallback */
                        if ((ad = rel_dependent_var(sql, rel->l, rel->r)) != 
NULL)
diff --git 
a/sql/test/BugTracker-2012/Tests/correlated_groupby_in_selection.Bug-3011.stable.out
 
b/sql/test/BugTracker-2012/Tests/correlated_groupby_in_selection.Bug-3011.stable.out
--- 
a/sql/test/BugTracker-2012/Tests/correlated_groupby_in_selection.Bug-3011.stable.out
+++ 
b/sql/test/BugTracker-2012/Tests/correlated_groupby_in_selection.Bug-3011.stable.out
@@ -43,7 +43,7 @@ Ready.
 #            counter.timinglinkorder < test.timinglinkorder and
 #            counter.userstopcodebegin = test.userstopcodebegin
 #            group by dataownercode, lineplanningnumber, journeypatterncode) as
-% .test,       .test,  .test,  .test,  .test,  .test,  .L16 # table_name
+% sys.test,    sys.test,       sys.test,       sys.test,       sys.test,       
sys.test,       .L13 # table_name
 % dataownercode,       lineplanningnumber,     journeypatterncode,     
timinglinkorder,        userstopcodebegin,      istimingstop,   
passagesequencenumber # name
 % varchar,     varchar,        varchar,        decimal,        varchar,        
boolean,        bigint # type
 % 0,   0,      0,      4,      0,      5,      1 # length
@@ -56,7 +56,7 @@ Ready.
 #            counter.timinglinkorder < test.timinglinkorder and
 #            counter.userstopcodebegin = test.userstopcodebegin) as
 #passagesequencenumber 
-% .test,       .test,  .test,  .test,  .test,  .test,  .L16 # table_name
+% sys.test,    sys.test,       sys.test,       sys.test,       sys.test,       
sys.test,       .L13 # table_name
 % dataownercode,       lineplanningnumber,     journeypatterncode,     
timinglinkorder,        userstopcodebegin,      istimingstop,   
passagesequencenumber # name
 % varchar,     varchar,        varchar,        decimal,        varchar,        
boolean,        bigint # type
 % 0,   0,      0,      4,      0,      5,      1 # length
@@ -78,20 +78,20 @@ Ready.
 #            counter.timinglinkorder < test.timinglinkorder and
 #            counter.userstopcodebegin = test.userstopcodebegin
 #            group by dataownercode, lineplanningnumber, journeypatterncode) as
-% .test,       .test,  .test,  .test,  .test,  .test,  .L16 # table_name
+% sys.test,    sys.test,       sys.test,       sys.test,       sys.test,       
sys.test,       .L13 # table_name
 % dataownercode,       lineplanningnumber,     journeypatterncode,     
timinglinkorder,        userstopcodebegin,      istimingstop,   
passagesequencenumber # name
 % varchar,     varchar,        varchar,        decimal,        varchar,        
boolean,        bigint # type
 % 3,   4,      1,      4,      8,      5,      1 # length
-[ "CXX",       "A001", "0",    0,      "40000010",     true,   1       ]
-[ "CXX",       "A001", "0",    1,      "40004015",     false,  1       ]
-[ "CXX",       "A001", "0",    2,      "40004021",     false,  1       ]
-[ "CXX",       "A001", "0",    3,      "40002570",     false,  1       ]
-[ "CXX",       "A001", "0",    4,      "40002550",     false,  1       ]
-[ "CXX",       "A001", "0",    5,      "40002590",     false,  1       ]
-[ "CXX",       "A001", "0",    6,      "40002610",     false,  1       ]
-[ "CXX",       "A001", "0",    7,      "40002630",     false,  1       ]
-[ "CXX",       "A001", "0",    8,      "40002690",     false,  1       ]
-[ "CXX",       "A001", "0",    9,      "40002770",     false,  1       ]
+[ "CXX",       "A001", "0",    0,      "40000010",     true,   0       ]
+[ "CXX",       "A001", "0",    1,      "40004015",     false,  0       ]
+[ "CXX",       "A001", "0",    2,      "40004021",     false,  0       ]
+[ "CXX",       "A001", "0",    3,      "40002570",     false,  0       ]
+[ "CXX",       "A001", "0",    4,      "40002550",     false,  0       ]
+[ "CXX",       "A001", "0",    5,      "40002590",     false,  0       ]
+[ "CXX",       "A001", "0",    6,      "40002610",     false,  0       ]
+[ "CXX",       "A001", "0",    7,      "40002630",     false,  0       ]
+[ "CXX",       "A001", "0",    8,      "40002690",     false,  0       ]
+[ "CXX",       "A001", "0",    9,      "40002770",     false,  0       ]
 #select dataownercode, lineplanningnumber, journeypatterncode, timinglinkorder,
 #userstopcodebegin, istimingstop,
 #       (select count(*) from test as counter where
@@ -101,7 +101,7 @@ Ready.
 #            counter.timinglinkorder < test.timinglinkorder and
 #            counter.userstopcodebegin = test.userstopcodebegin) as
 #passagesequencenumber 
-% .test,       .test,  .test,  .test,  .test,  .test,  .L16 # table_name
+% sys.test,    sys.test,       sys.test,       sys.test,       sys.test,       
sys.test,       .L13 # table_name
 % dataownercode,       lineplanningnumber,     journeypatterncode,     
timinglinkorder,        userstopcodebegin,      istimingstop,   
passagesequencenumber # name
 % varchar,     varchar,        varchar,        decimal,        varchar,        
boolean,        bigint # type
 % 3,   4,      1,      4,      8,      5,      1 # length
diff --git a/sql/test/BugTracker-2013/Tests/pivot.Bug-3339.stable.err 
b/sql/test/BugTracker-2013/Tests/pivot.Bug-3339.stable.err
--- a/sql/test/BugTracker-2013/Tests/pivot.Bug-3339.stable.err
+++ b/sql/test/BugTracker-2013/Tests/pivot.Bug-3339.stable.err
@@ -31,8 +31,8 @@ stderr of test 'pivot.Bug-3339` in direc
 MAPI  = (monetdb) /var/tmp/mtest-16107/.s.monetdb.31536
 QUERY = SELECT (SELECT * FROM groupElements(pivot.x))
         FROM (SELECT * FROM tmp) as pivot;
-ERROR = !SELECT: no such column 'pivot.x'
-CODE  = 42S22
+ERROR = !21000!zero_or_one: cardinality violation, scalar expression expected
+CODE  = M0M29
 
 # 09:16:37 >  
 # 09:16:37 >  "Done."
diff --git a/sql/test/BugTracker-2013/Tests/syntaxerror.Bug-3399.stable.err 
b/sql/test/BugTracker-2013/Tests/syntaxerror.Bug-3399.stable.err
--- a/sql/test/BugTracker-2013/Tests/syntaxerror.Bug-3399.stable.err
+++ b/sql/test/BugTracker-2013/Tests/syntaxerror.Bug-3399.stable.err
@@ -30,8 +30,8 @@ stderr of test 'syntaxerror.Bug-3399` in
 
 MAPI  = (monetdb) /var/tmp/mtest-19909/.s.monetdb.30301
 QUERY = select *, (select *) from tmp;
-ERROR = !SELECT: subquery result missing
-CODE  = 42000
+ERROR = !SELECT: no such table 'tmp'
+CODE  = 42S02
 
 # 11:53:57 >  
 # 11:53:57 >  "Done."
diff --git a/sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.stable.out 
b/sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.stable.out
--- a/sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.stable.out
+++ b/sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.stable.out
@@ -60,12 +60,12 @@ Ready.
 [ "two",       NULL    ]
 [ "two",       NULL    ]
 #select k,count(*),count(v) from (select k,v from a union all select k,null 
from b) as t(k,v) group by k order by count(*) desc;
-% .t,  .L16,   .L21 # table_name
-% k,   L15,    L20 # name
+% .t,  .L16,   .L20 # table_name
+% k,   L16,    L20 # name
 % varchar,     bigint, bigint # type
 % 3,   1,      1 # length
+[ "one",       2,      2       ]
 [ "two",       4,      1       ]
-[ "one",       2,      2       ]
 
 # 17:12:13 >  
 # 17:12:13 >  "Done."
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to