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

Reply via email to