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