Changeset: 8fe50f4c6fd0 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8fe50f4c6fd0 Modified Files: sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out sql/test/BugTracker-2020/Tests/All Branch: mtest Log Message:
Merged with default diffs (258 lines): diff --git a/monetdb5/optimizer/opt_pushselect.c b/monetdb5/optimizer/opt_pushselect.c --- a/monetdb5/optimizer/opt_pushselect.c +++ b/monetdb5/optimizer/opt_pushselect.c @@ -22,6 +22,7 @@ PushArgument(MalBlkPtr mb, InstrPtr p, i return p; } +#if 0 static InstrPtr PushNil(MalBlkPtr mb, InstrPtr p, int pos, int tpe) { @@ -34,6 +35,7 @@ PushNil(MalBlkPtr mb, InstrPtr p, int po getArg(p, pos) = arg; return p; } +#endif static InstrPtr ReplaceWithNil(MalBlkPtr mb, InstrPtr p, int pos, int tpe) @@ -74,6 +76,7 @@ subselect_add( subselect_t *subselects, return i; } +#if 0 static int subselect_find_tids( subselect_t *subselects, int subselect) { @@ -99,6 +102,7 @@ subselect_find_subselect( subselect_t *s } return -1; } +#endif static int lastbat_arg(MalBlkPtr mb, InstrPtr p) @@ -298,7 +302,7 @@ OPTpushselectImplementation(Client cntxt } } - if (/* DISABLES CODE */ (0) && subselects.nr) { + if (nr_likes || subselects.nr) { if (newMalBlkStmt(mb, mb->ssize) <0 ) { GDKfree(vars); goto wrapup; @@ -309,12 +313,16 @@ OPTpushselectImplementation(Client cntxt for (i = 1; i < limit; i++) { p = old[i]; - /* rewrite batalgebra.like + select -> likeselect */ - if (getModuleId(p) == algebraRef && p->retc == 1 && getFunctionId(p) == selectRef) { + /* rewrite batalgebra.like + [theta]select -> likeselect */ + if (getModuleId(p) == algebraRef && p->retc == 1 && + (getFunctionId(p) == selectRef || getFunctionId(p) == thetaselectRef)) { int var = getArg(p, 1); InstrPtr q = mb->stmt[vars[var]]; /* BEWARE: the optimizer may not add or remove statements ! */ - if (isLikeOp(q)) { /* TODO check if getArg(p, 3) value == TRUE */ + if (isLikeOp(q) && + !isaBatType(getArgType(mb, q, 2)) && /* pattern is a value */ + (q->argc != 4 || !isaBatType(getArgType(mb, q, 3))) /* escape is a value */ + ) { InstrPtr r = newInstruction(mb, algebraRef, likeselectRef); int has_cand = (getArgType(mb, p, 2) == newBatType(TYPE_oid)); int a, anti = (getFunctionId(q)[0] == 'n'), ignore_case = (getFunctionId(q)[anti?4:0] == 'i'); @@ -340,6 +348,7 @@ OPTpushselectImplementation(Client cntxt /* inject table ids into subselect * s = subselect(c, C1..) => subselect(c, t, C1..) */ +#if 0 if (isSelect(p) && p->retc == 1) { int tid = 0; @@ -445,6 +454,7 @@ OPTpushselectImplementation(Client cntxt } } } +#endif pushInstruction(mb,p); } for (; i<limit; i++) 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 @@ -771,7 +771,6 @@ rel_values(sql_query *query, symbol *tab node *m; list *exps = sa_list(sql->sa); exp_kind ek = {type_value, card_value, TRUE}; - unsigned int card = dlist_length(rowlist) == 1 ? CARD_ATOM : CARD_MULTI; for (dnode *o = rowlist->h; o; o = o->next) { dlist *values = o->data.lval; @@ -803,7 +802,9 @@ rel_values(sql_query *query, symbol *tab } } } + /* loop to check types and cardinality */ + unsigned int card = exps->h && list_length(((sql_exp*)exps->h->data)->f) > 1 ? CARD_MULTI : CARD_ATOM; for (m = exps->h; m; m = m->next) { sql_exp *e = m->data; diff --git a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out --- a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out +++ b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out @@ -263,12 +263,13 @@ function user.main():void; X_44:bat[:int] := bat.pack(0:int, 0:int); X_4:int := sql.mvc(); X_17:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 0:int); + C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); + C_131:bat[:oid] := algebra.likeselect(X_17:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, false:bit, false:bit); (X_19:bat[:oid], X_20:bat[:str]) := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 2:int); + C_132:bat[:oid] := algebra.likeselect(X_20:bat[:str], nil:bat[:oid], "%optimizers%":str, "":str, false:bit, false:bit); X_18:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 1:int); - X_21:bat[:str] := sql.delta(X_17:bat[:str], X_19:bat[:oid], X_20:bat[:str], X_18:bat[:str]); - X_91:bat[:bit] := batalgebra.like(X_21:bat[:str], "%optimizers%":str); - C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); - C_35:bat[:oid] := algebra.thetaselect(X_91:bat[:bit], C_5:bat[:oid], true:bit, "==":str); + C_134:bat[:oid] := algebra.likeselect(X_18:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, false:bit, false:bit); + C_35:bat[:oid] := sql.subdelta(C_131:bat[:oid], C_5:bat[:oid], X_19:bat[:oid], C_132:bat[:oid], C_134:bat[:oid]); X_37:bat[:str] := sql.projectdelta(C_35:bat[:oid], X_17:bat[:str], X_19:bat[:oid], X_20:bat[:str], X_18:bat[:str]); X_22:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "func":str, 0:int); (X_25:bat[:oid], X_26:bat[:str]) := sql.bind(X_4:int, "sys":str, "functions":str, "func":str, 2:int); @@ -315,12 +316,13 @@ function user.main():void; X_44:bat[:int] := bat.pack(0:int, 0:int); X_4:int := sql.mvc(); X_17:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 0:int); + C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); + C_131:bat[:oid] := algebra.likeselect(X_17:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, false:bit, true:bit); (X_19:bat[:oid], X_20:bat[:str]) := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 2:int); + C_132:bat[:oid] := algebra.likeselect(X_20:bat[:str], nil:bat[:oid], "%optimizers%":str, "":str, false:bit, true:bit); X_18:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 1:int); - X_21:bat[:str] := sql.delta(X_17:bat[:str], X_19:bat[:oid], X_20:bat[:str], X_18:bat[:str]); - X_91:bat[:bit] := batalgebra.not_like(X_21:bat[:str], "%optimizers%":str); - C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); - C_35:bat[:oid] := algebra.thetaselect(X_91:bat[:bit], C_5:bat[:oid], true:bit, "==":str); + C_134:bat[:oid] := algebra.likeselect(X_18:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, false:bit, true:bit); + C_35:bat[:oid] := sql.subdelta(C_131:bat[:oid], C_5:bat[:oid], X_19:bat[:oid], C_132:bat[:oid], C_134:bat[:oid]); X_37:bat[:str] := sql.projectdelta(C_35:bat[:oid], X_17:bat[:str], X_19:bat[:oid], X_20:bat[:str], X_18:bat[:str]); X_22:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "func":str, 0:int); (X_25:bat[:oid], X_26:bat[:str]) := sql.bind(X_4:int, "sys":str, "functions":str, "func":str, 2:int); @@ -367,12 +369,13 @@ function user.main():void; X_44:bat[:int] := bat.pack(0:int, 0:int); X_4:int := sql.mvc(); X_17:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 0:int); + C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); + C_131:bat[:oid] := algebra.likeselect(X_17:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, true:bit, false:bit); (X_19:bat[:oid], X_20:bat[:str]) := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 2:int); + C_132:bat[:oid] := algebra.likeselect(X_20:bat[:str], nil:bat[:oid], "%optimizers%":str, "":str, true:bit, false:bit); X_18:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 1:int); - X_21:bat[:str] := sql.delta(X_17:bat[:str], X_19:bat[:oid], X_20:bat[:str], X_18:bat[:str]); - X_91:bat[:bit] := batalgebra.ilike(X_21:bat[:str], "%optimizers%":str); - C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); - C_35:bat[:oid] := algebra.thetaselect(X_91:bat[:bit], C_5:bat[:oid], true:bit, "==":str); + C_134:bat[:oid] := algebra.likeselect(X_18:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, true:bit, false:bit); + C_35:bat[:oid] := sql.subdelta(C_131:bat[:oid], C_5:bat[:oid], X_19:bat[:oid], C_132:bat[:oid], C_134:bat[:oid]); X_37:bat[:str] := sql.projectdelta(C_35:bat[:oid], X_17:bat[:str], X_19:bat[:oid], X_20:bat[:str], X_18:bat[:str]); X_22:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "func":str, 0:int); (X_25:bat[:oid], X_26:bat[:str]) := sql.bind(X_4:int, "sys":str, "functions":str, "func":str, 2:int); @@ -419,12 +422,13 @@ function user.main():void; X_44:bat[:int] := bat.pack(0:int, 0:int); X_4:int := sql.mvc(); X_17:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 0:int); + C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); + C_131:bat[:oid] := algebra.likeselect(X_17:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, true:bit, true:bit); (X_19:bat[:oid], X_20:bat[:str]) := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 2:int); + C_132:bat[:oid] := algebra.likeselect(X_20:bat[:str], nil:bat[:oid], "%optimizers%":str, "":str, true:bit, true:bit); X_18:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 1:int); - X_21:bat[:str] := sql.delta(X_17:bat[:str], X_19:bat[:oid], X_20:bat[:str], X_18:bat[:str]); - X_91:bat[:bit] := batalgebra.not_ilike(X_21:bat[:str], "%optimizers%":str); - C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); - C_35:bat[:oid] := algebra.thetaselect(X_91:bat[:bit], C_5:bat[:oid], true:bit, "==":str); + C_134:bat[:oid] := algebra.likeselect(X_18:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, true:bit, true:bit); + C_35:bat[:oid] := sql.subdelta(C_131:bat[:oid], C_5:bat[:oid], X_19:bat[:oid], C_132:bat[:oid], C_134:bat[:oid]); X_37:bat[:str] := sql.projectdelta(C_35:bat[:oid], X_17:bat[:str], X_19:bat[:oid], X_20:bat[:str], X_18:bat[:str]); X_22:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "func":str, 0:int); (X_25:bat[:oid], X_26:bat[:str]) := sql.bind(X_4:int, "sys":str, "functions":str, "func":str, 2:int); diff --git a/sql/test/BugTracker-2020/Tests/All b/sql/test/BugTracker-2020/Tests/All --- a/sql/test/BugTracker-2020/Tests/All +++ b/sql/test/BugTracker-2020/Tests/All @@ -32,3 +32,4 @@ semijoin.Bug-7001 decimal-multiplication.Bug-7003 drop-stream-table.Bug-7005 deallocate-id.Bug-7010 +values-groupby.Bug-7013 diff --git a/sql/test/BugTracker-2020/Tests/values-groupby.Bug-7013.sql b/sql/test/BugTracker-2020/Tests/values-groupby.Bug-7013.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2020/Tests/values-groupby.Bug-7013.sql @@ -0,0 +1,8 @@ +START TRANSACTION; +CREATE VIEW v AS SELECT a1, a2 FROM (VALUES (1,2)) as (a1,a2) GROUP BY a1, a2; + +SELECT a1 from v; +SELECT a2 from v; +SELECT a1, a2 from v; +SELECT * from v; +ROLLBACK; diff --git a/sql/test/BugTracker-2020/Tests/values-groupby.Bug-7013.stable.err b/sql/test/BugTracker-2020/Tests/values-groupby.Bug-7013.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2020/Tests/values-groupby.Bug-7013.stable.err @@ -0,0 +1,12 @@ +stderr of test 'values-groupby.Bug-7013` in directory 'sql/test/BugTracker-2020` itself: + + +# 23:01:57 > +# 23:01:57 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-75613" "--port=33233" +# 23:01:57 > + + +# 23:01:57 > +# 23:01:57 > "Done." +# 23:01:57 > + diff --git a/sql/test/BugTracker-2020/Tests/values-groupby.Bug-7013.stable.out b/sql/test/BugTracker-2020/Tests/values-groupby.Bug-7013.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2020/Tests/values-groupby.Bug-7013.stable.out @@ -0,0 +1,39 @@ +stdout of test 'values-groupby.Bug-7013` in directory 'sql/test/BugTracker-2020` itself: + + +# 23:01:57 > +# 23:01:57 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-75613" "--port=33233" +# 23:01:57 > + +#START TRANSACTION; +#CREATE VIEW v AS SELECT a1, a2 FROM (VALUES (1,2)) as (a1,a2) GROUP BY a1, a2; +#SELECT a1 from v; +% .v # table_name +% a1 # name +% tinyint # type +% 1 # length +[ 1 ] +#SELECT a2 from v; +% .v # table_name +% a2 # name +% tinyint # type +% 1 # length +[ 2 ] +#SELECT a1, a2 from v; +% .v, .v # table_name +% a1, a2 # name +% tinyint, tinyint # type +% 1, 1 # length +[ 1, 2 ] +#SELECT * from v; +% .v, .v # table_name +% a1, a2 # name +% tinyint, tinyint # type +% 1, 1 # length +[ 1, 2 ] +#ROLLBACK; + +# 23:01:57 > +# 23:01:57 > "Done." +# 23:01:57 > + _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list