Changeset: 1523e6298fe7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1523e6298fe7
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_optimizer.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
        
sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out
        
sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out.single
        sql/test/BugTracker-2019/Tests/str_to_time.Bug-6791.stable.out
        sql/test/mapi/Tests/sql_int128.stable.out.int128
        sql/test/pg_regress/Tests/float8.stable.err.int128
Branch: default
Log Message:

use unique for (aggr(distinct )), cases without grouping.
also leave dataflow enabled also when we disable mitosis


diffs (277 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -827,9 +827,13 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                                if (!as)
                                        return NULL;
                                if (need_distinct(e)){
-                                       stmt *g = stmt_group(be, as, grp, ext, 
cnt, 1);
-                                       stmt *next = stmt_result(be, g, 1);
-
+                                       stmt *next = NULL;
+                                       if (grp) {
+                                               stmt *g = stmt_group(be, as, 
grp, ext, cnt, 1);
+                                               next = stmt_result(be, g, 1);
+                                       } else {
+                                               next = stmt_unique(be, as);
+                                       }
                                        as = stmt_project(be, next, as);
                                        if (grp)
                                                grp = stmt_project(be, next, 
grp);
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -96,20 +96,13 @@ rel_need_distinct_query(sql_rel *rel)
 
        while (!need_distinct && rel && is_simple_project(rel->op))
                rel = rel->l;
-       if (!need_distinct && rel && is_groupby(rel->op) && rel->exps) {
-               node *n, *m;
-               for (n = rel->exps->h; n && !need_distinct; n = n->next) {
+       if (!need_distinct && rel && is_groupby(rel->op) && rel->exps && 
!rel->r) {
+               for (node *n = rel->exps->h; n && !need_distinct; n = n->next) {
                        sql_exp *e = n->data;
                        if (e->type == e_aggr) {
-                               list *l = e->l;
-
-                               if (l)
-                                       for (m = l->h; m && !need_distinct; m = 
m->next) {
-                                               sql_exp *a = m->data;
-
-                                               if (need_distinct(a))
-                                                       need_distinct = 1;
-                                       }
+
+                               if (need_distinct(e))
+                                       need_distinct = 1;
                        }
                }
        }
diff --git a/sql/backends/monet5/sql_optimizer.c 
b/sql/backends/monet5/sql_optimizer.c
--- a/sql/backends/monet5/sql_optimizer.c
+++ b/sql/backends/monet5/sql_optimizer.c
@@ -193,7 +193,7 @@ addOptimizers(Client c, MalBlkPtr mb, ch
                        q = getInstrPtr(mb, i);
                        if (q->token == ENDsymbol)
                                break;
-                       if (getFunctionId(q) == mitosisRef || getFunctionId(q) 
== dataflowRef)
+                       if (getFunctionId(q) == mitosisRef)
                                q->token = REMsymbol;   /* they are ignored */
                }
        }
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -269,6 +269,37 @@ stmt_group(backend *be, stmt *s, stmt *g
 }
 
 stmt *
+stmt_unique(backend *be, stmt *s)
+{
+       MalBlkPtr mb = be->mb;
+       InstrPtr q = NULL;
+
+       if (s->nr < 0)
+               return NULL;
+
+       q = newStmt(mb, algebraRef, uniqueRef);
+       if(!q)
+               return NULL;
+
+       q = pushArgument(mb, q, s->nr);
+       if (q) {
+               stmt *ns = stmt_create(be->mvc->sa, st_unique);
+               if (ns == NULL) {
+                       freeInstruction(q);
+                       return NULL;
+               }
+
+               ns->op1 = s;
+               ns->nrcols = s->nrcols;
+               ns->key = 1;
+               ns->q = q;
+               ns->nr = getDestVar(q);
+               return ns;
+       }
+       return NULL;
+}
+
+stmt *
 stmt_none(backend *be)
 {
        return stmt_create(be->mvc->sa, st_none);
diff --git a/sql/backends/monet5/sql_statement.h 
b/sql/backends/monet5/sql_statement.h
--- a/sql/backends/monet5/sql_statement.h
+++ b/sql/backends/monet5/sql_statement.h
@@ -82,6 +82,7 @@ typedef enum stmt_type {
        st_delete,
 
        st_group,
+       st_unique,
        st_convert,
        st_Nop,
        st_func,
@@ -199,6 +200,7 @@ extern stmt *stmt_list(backend *be, list
 extern void stmt_set_nrcols(stmt *s);
 
 extern stmt *stmt_group(backend *be, stmt *op1, stmt *grp, stmt *ext, stmt 
*cnt, int done);
+extern stmt *stmt_unique(backend *be, stmt *op1);
 
 /* raise exception incase the condition (cond) holds, continue with stmt res */
 extern stmt *stmt_exception(backend *be, stmt *cond, const char *errstr, int 
errcode);
diff --git 
a/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out
 
b/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out
--- 
a/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out
+++ 
b/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out
@@ -34,6 +34,7 @@ stdout of test 'duplicates-not-eliminate
 % 1023 # length
 function user.main():void;
     X_1:void := querylog.define("explain select sys.timestamp_to_str(case when 
task0.\"sys_created_on\" >= \\'1999-10-31 09:00:00\\' and 
task0.\"sys_created_on\" < \\'2000-04-02 10:00:00\\' then 
task0.\"sys_created_on\" + interval \\'-28800\\' second when 
task0.\"sys_created_on\" >= \\'2000-04-02 10:00:00\\' and 
task0.\"sys_created_on\" < \\'2000-10-29 09:00:00\\' then 
task0.\"sys_created_on\" + interval \\'-25200\\' second when 
task0.\"sys_created_on\" >= \\'2000-10-29 09:00:00\\' and 
task0.\"sys_created_on\" < \\'2001-04-01 10:00:00\\' then 
task0.\"sys_created_on\" + interval \\'-28800\\' second when 
task0.\"sys_created_on\" >= \\'2001-04-01 10:00:00\\' and 
task0.\"sys_created_on\" < \\'2001-10-28 09:00:00\\' then 
task0.\"sys_created_on\" + interval \\'-25200\\' second when 
task0.\"sys_created_on\" >= \\'2001-10-28 09:00:00\\' and 
task0.\"sys_created_on\" < \\'2002-04-07 10:00:00\\' then 
task0.\"sys_created_on\" + interval \\'-28800\\' second when 
task0.\"sys_created_on\" >= \\'20
 02-04-07 10:00:00\\' and t
+barrier X_1047:bit := language.dataflow();
     X_892:bat[:str] := bat.pack("sys.":str);
     X_893:bat[:str] := bat.pack("yearref":str);
     X_894:bat[:str] := bat.pack("clob":str);
@@ -135,6 +136,10 @@ function user.main():void;
     X_882:bat[:timestamp] := batcalc.ifthenelse(X_53:bat[:bit], 
X_58:bat[:timestamp], X_880:bat[:timestamp]);
     X_883:bat[:timestamp] := batcalc.timestamp(X_882:bat[:timestamp], 7:int);
     X_888:bat[:str] := batmtime.timestamp_to_str(X_883:bat[:timestamp], 
"%Y":str);
+    language.pass(X_45:bat[:timestamp]);
+    language.pass(X_74:bat[:timestamp]);
+    language.pass(X_58:bat[:timestamp]);
+exit X_1047:bit;
     sql.resultSet(X_892:bat[:str], X_893:bat[:str], X_894:bat[:str], 
X_895:bat[:int], X_895:bat[:int], X_888:bat[:str]);
 end user.main;
 # optimizer.mitosis()
diff --git 
a/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out.single
 
b/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out.single
--- 
a/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out.single
+++ 
b/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out.single
@@ -34,6 +34,7 @@ stdout of test 'duplicates-not-eliminate
 % 1023 # length
 function user.main():void;
     X_1:void := querylog.define("explain select sys.timestamp_to_str(case when 
task0.\"sys_created_on\" >= \\'1999-10-31 09:00:00\\' and 
task0.\"sys_created_on\" < \\'2000-04-02 10:00:00\\' then 
task0.\"sys_created_on\" + interval \\'-28800\\' second when 
task0.\"sys_created_on\" >= \\'2000-04-02 10:00:00\\' and 
task0.\"sys_created_on\" < \\'2000-10-29 09:00:00\\' then 
task0.\"sys_created_on\" + interval \\'-25200\\' second when 
task0.\"sys_created_on\" >= \\'2000-10-29 09:00:00\\' and 
task0.\"sys_created_on\" < \\'2001-04-01 10:00:00\\' then 
task0.\"sys_created_on\" + interval \\'-28800\\' second when 
task0.\"sys_created_on\" >= \\'2001-04-01 10:00:00\\' and 
task0.\"sys_created_on\" < \\'2001-10-28 09:00:00\\' then 
task0.\"sys_created_on\" + interval \\'-25200\\' second when 
task0.\"sys_created_on\" >= \\'2001-10-28 09:00:00\\' and 
task0.\"sys_created_on\" < \\'2002-04-07 10:00:00\\' then 
task0.\"sys_created_on\" + interval \\'-28800\\' second when 
task0.\"sys_created_on\" >= \\'20
 02-04-07 10:00:00\\' and t
+barrier X_1047:bit := language.dataflow();
     X_892:bat[:str] := bat.pack("sys.":str);
     X_893:bat[:str] := bat.pack("yearref":str);
     X_894:bat[:str] := bat.pack("clob":str);
@@ -135,6 +136,10 @@ function user.main():void;
     X_882:bat[:timestamp] := batcalc.ifthenelse(X_53:bat[:bit], 
X_58:bat[:timestamp], X_880:bat[:timestamp]);
     X_883:bat[:timestamp] := batcalc.timestamp(X_882:bat[:timestamp], 7:int);
     X_888:bat[:str] := batmtime.timestamp_to_str(X_883:bat[:timestamp], 
"%Y":str);
+    language.pass(X_45:bat[:timestamp]);
+    language.pass(X_74:bat[:timestamp]);
+    language.pass(X_58:bat[:timestamp]);
+exit X_1047:bit;
     sql.resultSet(X_892:bat[:str], X_893:bat[:str], X_894:bat[:str], 
X_895:bat[:int], X_895:bat[:int], X_888:bat[:str]);
 end user.main;
 # optimizer.mitosis()
diff --git a/sql/test/BugTracker-2019/Tests/str_to_time.Bug-6791.stable.out 
b/sql/test/BugTracker-2019/Tests/str_to_time.Bug-6791.stable.out
--- a/sql/test/BugTracker-2019/Tests/str_to_time.Bug-6791.stable.out
+++ b/sql/test/BugTracker-2019/Tests/str_to_time.Bug-6791.stable.out
@@ -39,11 +39,13 @@ stdout of test 'str_to_time.Bug-6791` in
 % 277 # length
 function user.main():void;
     X_1:void := querylog.define("explain select str_to_date(\\'23-09-1987\\', 
\\'%d-%m-%Y\\') as \"date\",\n str_to_time(\\'11:40\\', \\'%H:%M\\') as 
\"time\",\n str_to_timestamp(\\'23-09-1987 11:40\\', \\'%d-%m-%Y %H:%M\\') as 
\"timestamp\";":str, "default_pipe":str, 19:int);
+barrier X_90:bit := language.dataflow();
     X_23:bat[:str] := bat.pack(".":str, ".":str, ".":str);
     X_24:bat[:str] := bat.pack("date":str, "time":str, "timestamp":str);
     X_25:bat[:str] := bat.pack("date":str, "timetz":str, "timestamptz":str);
     X_26:bat[:int] := bat.pack(0:int, 1:int, 7:int);
     X_27:bat[:int] := bat.pack(0:int, 0:int, 0:int);
+exit X_90:bit;
     sql.resultSet(X_23:bat[:str], X_24:bat[:str], X_25:bat[:str], 
X_26:bat[:int], X_27:bat[:int], "1987-09-23":date, "11:40:00.000000":daytime, 
"1987-09-23 11:40:00.000000":timestamp);
 end user.main;
 # optimizer.mitosis()
diff --git a/sql/test/mapi/Tests/sql_int128.stable.out.int128 
b/sql/test/mapi/Tests/sql_int128.stable.out.int128
--- a/sql/test/mapi/Tests/sql_int128.stable.out.int128
+++ b/sql/test/mapi/Tests/sql_int128.stable.out.int128
@@ -15,11 +15,13 @@ stdout of test 'sql_int128` in directory
 % 118 # length
 function user.main():void;
     X_1:void := querylog.define("explain update mytest set a = 
1234567890987654321;":str, "default_pipe":str, 39:int);
+barrier X_110:bit := language.dataflow();
     X_4:int := sql.mvc();
     C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "mytest":str);
     X_17:bat[:hge] := sql.bind(X_4:int, "sys":str, "mytest":str, "a":str, 
0:int);
     X_47:bat[:hge] := algebra.projection(C_5:bat[:oid], X_17:bat[:hge]);
     X_54:bat[:hge] := algebra.project(X_47:bat[:hge], 1234567890987654321:hge);
+exit X_110:bit;
     X_56:int := sql.update(X_4:int, "sys":str, "mytest":str, "a":str, 
C_5:bat[:oid], X_54:bat[:hge]);
     X_59:lng := aggr.count(C_5:bat[:oid]);
     sql.affectedRows(X_56:int, X_59:lng);
@@ -59,11 +61,13 @@ end user.main;
 % 110 # length
 function user.main():void;
     X_1:void := querylog.define("explain update mytest set b = 
10000000000;":str, "default_pipe":str, 39:int);
+barrier X_110:bit := language.dataflow();
     X_4:int := sql.mvc();
     C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "mytest":str);
     X_17:bat[:hge] := sql.bind(X_4:int, "sys":str, "mytest":str, "a":str, 
0:int);
     X_47:bat[:hge] := algebra.projection(C_5:bat[:oid], X_17:bat[:hge]);
     X_54:bat[:hge] := algebra.project(X_47:bat[:hge], 10000000000:hge);
+exit X_110:bit;
     X_56:int := sql.update(X_4:int, "sys":str, "mytest":str, "b":str, 
C_5:bat[:oid], X_54:bat[:hge]);
     X_59:lng := aggr.count(C_5:bat[:oid]);
     sql.affectedRows(X_56:int, X_59:lng);
@@ -103,6 +107,7 @@ end user.main;
 % 104 # length
 function user.main():void;
     X_1:void := querylog.define("explain update mytest set c = a * b;":str, 
"default_pipe":str, 38:int);
+barrier X_111:bit := language.dataflow();
     X_4:int := sql.mvc();
     C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "mytest":str);
     X_17:bat[:hge] := sql.bind(X_4:int, "sys":str, "mytest":str, "a":str, 
0:int);
@@ -110,6 +115,7 @@ function user.main():void;
     X_22:bat[:hge] := sql.bind(X_4:int, "sys":str, "mytest":str, "b":str, 
0:int);
     X_48:bat[:hge] := algebra.projection(C_5:bat[:oid], X_22:bat[:hge]);
     X_52:bat[:hge] := batcalc.*(X_47:bat[:hge], X_48:bat[:hge], nil:BAT, 
nil:BAT);
+exit X_111:bit;
     X_56:int := sql.update(X_4:int, "sys":str, "mytest":str, "c":str, 
C_5:bat[:oid], X_52:bat[:hge]);
     X_58:lng := aggr.count(C_5:bat[:oid]);
     sql.affectedRows(X_56:int, X_58:lng);
@@ -149,6 +155,7 @@ end user.main;
 % 104 # length
 function user.main():void;
     X_1:void := querylog.define("explain update mytest set d = c * b;":str, 
"default_pipe":str, 38:int);
+barrier X_111:bit := language.dataflow();
     X_4:int := sql.mvc();
     C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "mytest":str);
     X_28:bat[:hge] := sql.bind(X_4:int, "sys":str, "mytest":str, "c":str, 
0:int);
@@ -156,6 +163,7 @@ function user.main():void;
     X_22:bat[:hge] := sql.bind(X_4:int, "sys":str, "mytest":str, "b":str, 
0:int);
     X_48:bat[:hge] := algebra.projection(C_5:bat[:oid], X_22:bat[:hge]);
     X_52:bat[:hge] := batcalc.*(X_49:bat[:hge], X_48:bat[:hge], nil:BAT, 
nil:BAT);
+exit X_111:bit;
     X_56:int := sql.update(X_4:int, "sys":str, "mytest":str, "d":str, 
C_5:bat[:oid], X_52:bat[:hge]);
     X_58:lng := aggr.count(C_5:bat[:oid]);
     sql.affectedRows(X_56:int, X_58:lng);
@@ -192,6 +200,7 @@ end user.main;
 % 104 # length
 function user.main():void;
     X_1:void := querylog.define("explain update mytest set e = d + a;":str, 
"default_pipe":str, 38:int);
+barrier X_111:bit := language.dataflow();
     X_4:int := sql.mvc();
     C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "mytest":str);
     X_34:bat[:hge] := sql.bind(X_4:int, "sys":str, "mytest":str, "d":str, 
0:int);
@@ -199,6 +208,7 @@ function user.main():void;
     X_17:bat[:hge] := sql.bind(X_4:int, "sys":str, "mytest":str, "a":str, 
0:int);
     X_47:bat[:hge] := algebra.projection(C_5:bat[:oid], X_17:bat[:hge]);
     X_52:bat[:hge] := batcalc.+(X_50:bat[:hge], X_47:bat[:hge], nil:BAT, 
nil:BAT);
+exit X_111:bit;
     X_56:int := sql.update(X_4:int, "sys":str, "mytest":str, "e":str, 
C_5:bat[:oid], X_52:bat[:hge]);
     X_58:lng := aggr.count(C_5:bat[:oid]);
     sql.affectedRows(X_56:int, X_58:lng);
diff --git a/sql/test/pg_regress/Tests/float8.stable.err.int128 
b/sql/test/pg_regress/Tests/float8.stable.err.int128
--- a/sql/test/pg_regress/Tests/float8.stable.err.int128
+++ b/sql/test/pg_regress/Tests/float8.stable.err.int128
@@ -138,9 +138,9 @@ ERROR = !overflow in calculation -1.2345
 CODE  = 22003
 MAPI  = (monetdb) /var/tmp/mtest-30274/.s.monetdb.37685
 QUERY = SELECT '' AS bad, f.f1 ^ '1e200' from FLOAT8_TBL f;
-ERROR = !too many digits (201 > 38)
-CODE  = 22003
-MAPI  = (monetdb) /var/tmp/mtest-12357/.s.monetdb.39793
+ERROR = !Decimal (1e200) doesn't have format (38.0)
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-1797224/.s.monetdb.35743
 QUERY = SELECT '' AS bad, f.f1 / '0.0' from FLOAT8_TBL f;
 ERROR = !division by zero.
 CODE  = 22012
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to