Changeset: a13e520c099b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a13e520c099b
Modified Files:
sql/server/rel_select.c
sql/test/BugTracker-2020/Tests/All
Branch: default
Log Message:
Merged with Oct2020
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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list