Changeset: a18ffc3ee843 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a18ffc3ee843
Modified Files:
        monetdb5/optimizer/opt_pushselect.c
        
sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
        sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
        sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
        sql/test/leaks/Tests/check1.stable.out.int128
        sql/test/mergetables/Tests/mergequery.stable.out
Branch: Jul2017
Log Message:

fix pushdown of select (and some more leak fixing)


diffs (truncated from 381 to 300 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
@@ -132,7 +132,7 @@ str
 OPTpushselectImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci)
 {
        int i, j, limit, slimit, actions=0, *vars, *nvars = NULL, *slices = 
NULL, push_down_delta = 0, nr_topn = 0, nr_likes = 0;
-       char *rslices = NULL;
+       char *rslices = NULL, *oclean = NULL;
        InstrPtr p, *old;
        subselect_t subselects;
        char buf[256];
@@ -459,12 +459,14 @@ OPTpushselectImplementation(Client cntxt
        nvars = (int*) GDKzalloc(sizeof(int)* mb->vtop); 
        slices = (int*) GDKzalloc(sizeof(int)* mb->vtop);
        rslices = (char*) GDKzalloc(sizeof(char)* mb->vtop);
-       if (!nvars || !slices || !rslices || newMalBlkStmt(mb, 
mb->stop+(5*push_down_delta)) <0 ) {
+       oclean = (char*) GDKzalloc(sizeof(char)* mb->vtop);
+       if (!nvars || !slices || !rslices || !oclean || newMalBlkStmt(mb, 
mb->stop+(5*push_down_delta)) <0 ) {
                mb->stmt = old;
                GDKfree(vars);
                GDKfree(nvars);
                GDKfree(slices);
                GDKfree(rslices);
+               GDKfree(oclean);
                goto wrapup;
        }
        pushInstruction(mb,old[0]);
@@ -503,6 +505,8 @@ OPTpushselectImplementation(Client cntxt
                                    newTmpVariable(mb, getArgType(mb, s, 0));
                                getArg(s, 1) = getArg(r, 0); /* use result of 
slice */
                                pushInstruction(mb, s);
+                               oclean[i] = 1;
+                               actions++;
                                continue;
                        }
                }
@@ -542,13 +546,21 @@ OPTpushselectImplementation(Client cntxt
                                        }
                                }
                                q = newAssignment(mb);
-                               getArg(q, 0) = nvars[getArg(p, 0)]; 
-                               (void) pushArgument(mb, q, col);
+                               getArg(q, 0) = getArg(p, 0); 
+                               if (nvars[getArg(p,0)] > 0) {
+                                       assert(0);
+                                       getArg(q, 0) = nvars[getArg(p, 0)]; 
+                               }
+                               (void) pushArgument(mb, q, getArg(p, 2));
+                               if (nvars[getArg(p, 2)] > 0)
+                                       getArg(q, 1) = nvars[getArg(p, 2)];
+                               oclean[i] = 1;
                                actions++;
                                continue;
                        }
                } else if (p->argc >= 2 && slices[getArg(p, 1)] != 0) {
                        /* use new slice candidate list */
+                       assert(slices[getArg(p,1)] == nvars[getArg(p,1)]);
                        getArg(p, 1) = slices[getArg(p, 1)];
                }
                /* remap */
@@ -614,21 +626,24 @@ OPTpushselectImplementation(Client cntxt
                                u = pushArgument(mb, u, getArg(t,0));
                                u->typechk = TYPE_UNKNOWN;
                                pushInstruction(mb,u);  
-                               freeInstruction(p);
-                               old[i] = NULL;
+                               oclean[i] = 1;
                                continue;
                        }
                }
-               old[i] = NULL;
                pushInstruction(mb,p);
        }
-       for (i=1; i<limit; i++) 
+       for (j=1; j<i; j++)
+               if (old[j] && oclean[j])
+                       freeInstruction(old[j]);
+       for (; i<limit; i++)
                if (old[i])
-                       pushInstruction(mb,old[i]);
+                       freeInstruction(old[i]);
+                       //pushInstruction(mb,old[i]);
        GDKfree(vars);
        GDKfree(nvars);
        GDKfree(slices);
        GDKfree(rslices);
+       GDKfree(oclean);
        GDKfree(old);
 
     /* Defense line against incorrect plans */
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
@@ -39,11 +39,13 @@ function user.s4_1():void;
     X_37 := bat.new(nil:str);
     X_5 := sql.mvc();
     X_9:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 0:int);
+    C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
+    C_92 := algebra.likeselect(X_9, C_6, "%optimizers%", "", false);
     (C_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5, "sys", "functions", 
"name", 2:int);
+    C_93 := algebra.likeselect(X_15, nil:bat[:oid], "%optimizers%", "", false);
     X_12:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 1:int);
-    X_17 := sql.delta(X_9, C_14, X_15, X_12);
-    C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
-    C_29 := algebra.likeselect(X_17, C_6, "%optimizers%", "", false);
+    C_95 := algebra.likeselect(X_12, C_6, "%optimizers%", "", false);
+    C_29 := sql.subdelta(C_92, C_6, C_14, C_93, C_95);
     X_19:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 0:int);
     (C_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5, "sys", "functions", 
"func", 2:int);
     X_21:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 1:int);
@@ -98,11 +100,13 @@ function user.s6_1():void;
     X_37 := bat.new(nil:str);
     X_5 := sql.mvc();
     X_9:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 0:int);
+    C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
+    C_92 := algebra.likeselect(X_9, C_6, "%optimizers%", "", true);
     (C_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5, "sys", "functions", 
"name", 2:int);
+    C_93 := algebra.likeselect(X_15, nil:bat[:oid], "%optimizers%", "", true);
     X_12:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 1:int);
-    X_17 := sql.delta(X_9, C_14, X_15, X_12);
-    C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
-    C_29 := algebra.likeselect(X_17, C_6, "%optimizers%", "", true);
+    C_95 := algebra.likeselect(X_12, C_6, "%optimizers%", "", true);
+    C_29 := sql.subdelta(C_92, C_6, C_14, C_93, C_95);
     X_19:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 0:int);
     (C_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5, "sys", "functions", 
"func", 2:int);
     X_21:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 1:int);
@@ -158,16 +162,18 @@ function user.s8_1():void;
     X_37 := bat.new(nil:str);
     X_5 := sql.mvc();
     X_9:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 0:int);
+    C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
+    C_92 := algebra.ilikeselect(X_9, C_6, "%optimizers%", "", false);
     (C_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5, "sys", "functions", 
"name", 2:int);
+    C_93 := algebra.ilikeselect(X_15, nil:bat[:oid], "%optimizers%", "", 
false);
     X_12:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 1:int);
-    X_17 := sql.delta(X_9, C_14, X_15, X_12);
-    C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
-    X_29 := algebra.ilikeselect(X_17, C_6, "%optimizers%", "", false);
+    C_95 := algebra.ilikeselect(X_12, C_6, "%optimizers%", "", false);
+    C_29 := sql.subdelta(C_92, C_6, C_14, C_93, C_95);
     X_19:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 0:int);
     (C_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5, "sys", "functions", 
"func", 2:int);
     X_21:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 1:int);
-    X_33 := sql.projectdelta(X_29, X_19, C_22, X_23, X_21);
-    X_32 := sql.projectdelta(X_29, X_9, C_14, X_15, X_12);
+    X_33 := sql.projectdelta(C_29, X_19, C_22, X_23, X_21);
+    X_32 := sql.projectdelta(C_29, X_9, C_14, X_15, X_12);
     X_42 := bat.append(X_35, "sys.functions");
     X_44 := bat.append(X_37, "name");
     X_46 := bat.append(X_38, "varchar");
@@ -216,16 +222,18 @@ function user.s10_1():void;
     X_37 := bat.new(nil:str);
     X_5 := sql.mvc();
     X_9:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 0:int);
+    C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
+    C_92 := algebra.ilikeselect(X_9, C_6, "%optimizers%", "", true);
     (C_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5, "sys", "functions", 
"name", 2:int);
+    C_93 := algebra.ilikeselect(X_15, nil:bat[:oid], "%optimizers%", "", true);
     X_12:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 1:int);
-    X_17 := sql.delta(X_9, C_14, X_15, X_12);
-    C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
-    X_29 := algebra.ilikeselect(X_17, C_6, "%optimizers%", "", true);
+    C_95 := algebra.ilikeselect(X_12, C_6, "%optimizers%", "", true);
+    C_29 := sql.subdelta(C_92, C_6, C_14, C_93, C_95);
     X_19:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 0:int);
     (C_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5, "sys", "functions", 
"func", 2:int);
     X_21:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 1:int);
-    X_33 := sql.projectdelta(X_29, X_19, C_22, X_23, X_21);
-    X_32 := sql.projectdelta(X_29, X_9, C_14, X_15, X_12);
+    X_33 := sql.projectdelta(C_29, X_19, C_22, X_23, X_21);
+    X_32 := sql.projectdelta(C_29, X_9, C_14, X_15, X_12);
     X_42 := bat.append(X_35, "sys.functions");
     X_44 := bat.append(X_37, "name");
     X_46 := bat.append(X_38, "varchar");
diff --git a/sql/test/BugTracker/Tests/explain.SF-1739353.stable.out 
b/sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
--- a/sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
+++ b/sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
@@ -93,11 +93,13 @@ Operation successful
 |     X_35:bat[:str] := bat.new(nil:str);                                      
                             |
 |     X_4 := sql.mvc();                                                        
                             |
 |     X_18:bat[:sht] := sql.bind(X_4, "sys", "_tables", "type", 0:int);        
                             |
+|     C_5:bat[:oid] := sql.tid(X_4, "sys", "_tables");                         
                             |
+|     C_89 := algebra.thetaselect(X_18, C_5, 2:sht, "!=");                     
                             |
 |     (C_21:bat[:oid], X_22:bat[:sht]) := sql.bind(X_4, "sys", "_tables", 
"type", 2:int);                   |
+|     C_90 := algebra.thetaselect(X_22, nil:bat[:oid], 2:sht, "!=");           
                             |
 |     X_20:bat[:sht] := sql.bind(X_4, "sys", "_tables", "type", 1:int);        
                             |
-|     X_23 := sql.delta(X_18, C_21, X_22, X_20);                               
                             |
-|     C_5:bat[:oid] := sql.tid(X_4, "sys", "_tables");                         
                             |
-|     C_27 := algebra.thetaselect(X_23, C_5, 2:sht, "!=");                     
                             |
+|     C_92 := algebra.thetaselect(X_20, C_5, 2:sht, "!=");                     
                             |
+|     C_27 := sql.subdelta(C_89, C_5, C_21, C_90, C_92);                       
                             |
 |     X_8:bat[:str] := sql.bind(X_4, "sys", "_tables", "name", 0:int);         
                             |
 |     (C_13:bat[:oid], X_14:bat[:str]) := sql.bind(X_4, "sys", "_tables", 
"name", 2:int);                   |
 |     X_11:bat[:str] := sql.bind(X_4, "sys", "_tables", "name", 1:int);        
                             |
@@ -119,30 +121,30 @@ Operation successful
 |     X_55 := bat.append(X_46, 0:int);                                         
                             |
 |     sql.resultSet(X_47, X_49, X_51, X_53, X_55, X_39);                       
                             |
 | end user.s4_1;                                                               
                        |
-| #inline               actions= 0 time=1 usec                                 
                           |
-| #remap                actions= 0 time=1 usec                                 
                             |
-| #costmodel            actions= 1 time=1 usec                                 
                             |
-| #coercion             actions= 1 time=2 usec                                 
                             |
-| #evaluate             actions= 0 time=1 usec                                 
                             |
-| #emptybind            actions= 0 time=0 usec                                 
                             |
-| #pushselect           actions= 5 time=10 usec                                
                             |
-| #aliases              actions= 2 time=3 usec                                 
                             |
-| #mergetable           actions= 0 time=11 usec                                
                             |
-| #deadcode             actions= 2 time=3 usec                                 
                             |
+| #inline               actions= 0 time=2 usec                                 
                             |
+| #remap                actions= 0 time=3 usec                                 
                             |
+| #costmodel            actions= 1 time=3 usec                                 
                             |
+| #coercion             actions= 1 time=11 usec                                
                             |
+| #evaluate             actions= 0 time=6 usec                                 
                             |
+| #emptybind            actions= 0 time=1 usec                                 
                             |
+| #pushselect           actions= 5 time=47 usec                                
                             |
+| #aliases              actions= 2 time=14 usec                                
                             |
+| #mergetable           actions= 0 time=62 usec                                
                             |
+| #deadcode             actions= 3 time=13 usec                                
                             |
 | #aliases              actions= 0 time=0 usec                                 
                             |
-| #constants            actions= 2 time=3 usec                                 
                             |
-| #commonTerms          actions= 0 time=2 usec                                 
                             |
-| #projectionpath       actions= 0 time=2 usec                                 
                             |
-| #reorder              actions= 1 time=9 usec                                 
                             |
-| #deadcode             actions= 0 time=2 usec                                 
                             |
+| #constants            actions= 2 time=13 usec                                
                             |
+| #commonTerms          actions= 0 time=11 usec                                
                             |
+| #projectionpath       actions= 0 time=7 usec                                 
                             |
+| #reorder              actions= 1 time=48 usec                                
                             |
+| #deadcode             actions= 0 time=10 usec                                
                             |
 | #matpack              actions= 0 time=0 usec                                 
                             |
-| #multiplex            actions= 0 time=4 usec                                 
                             |
-| #profiler             actions=1 time=1 usec                                  
                             |
-| #candidates           actions=1 time=0 usec                                  
                             |
-| #garbagecollector     actions= 1 time=24 usec                                
                             |
-| #total                actions=23 time=118 usec                               
                             |
+| #multiplex            actions= 0 time=3 usec                                 
                             |
+| #profiler             actions=1 time=3 usec                                  
                             |
+| #candidates           actions=1 time=2 usec                                  
                             |
+| #garbagecollector     actions= 1 time=74 usec                                
                             |
+| #total                actions=23 time=487 usec                               
                             |
 
+-----------------------------------------------------------------------------------------------------------+
-53 rows
+55 rows
 
 # 10:24:50 >  
 # 10:24:50 >  "Done."
diff --git a/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out 
b/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
--- a/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
+++ b/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
@@ -51,11 +51,13 @@ Operation successful
 |     X_38:bat[:lng] := bat.new(nil:lng);                                      
                         |
 |     X_4 := sql.mvc();                                                        
                         |
 |     X_18:bat[:sht] := sql.bind(X_4, "sys", "_tables", "type", 0:int);        
                         |
+|     C_5:bat[:oid] := sql.tid(X_4, "sys", "_tables");                         
                         |
+|     C_84 := algebra.thetaselect(X_18, C_5, 2:sht, "!=");                     
                         |
 |     (C_21:bat[:oid], X_22:bat[:sht]) := sql.bind(X_4, "sys", "_tables", 
"type", 2:int);               |
+|     C_85 := algebra.thetaselect(X_22, nil:bat[:oid], 2:sht, "!=");           
                         |
 |     X_20:bat[:sht] := sql.bind(X_4, "sys", "_tables", "type", 1:int);        
                         |
-|     X_23 := sql.delta(X_18, C_21, X_22, X_20);                               
                         |
-|     C_5:bat[:oid] := sql.tid(X_4, "sys", "_tables");                         
                         |
-|     C_27 := algebra.thetaselect(X_23, C_5, 2:sht, "!=");                     
                         |
+|     C_87 := algebra.thetaselect(X_20, C_5, 2:sht, "!=");                     
                         |
+|     C_27 := sql.subdelta(C_84, C_5, C_21, C_85, C_87);                       
                         |
 |     X_8:bat[:int] := sql.bind(X_4, "sys", "_tables", "id", 0:int);           
                         |
 |     (C_13:bat[:oid], X_14:bat[:int]) := sql.bind(X_4, "sys", "_tables", 
"id", 2:int);                 |
 |     X_11:bat[:int] := sql.bind(X_4, "sys", "_tables", "id", 1:int);          
                         |
@@ -72,29 +74,29 @@ Operation successful
 |     sql.resultSet(".L42", "L41", "bigint", 64:int, 0:int, 7:int, X_43);      
                         |
 | end user.s4_1;                                                               
                    |
 | #inline               actions= 0 time=1 usec                                 
                         |
-| #remap                actions= 0 time=1 usec                                 
                         |
-| #costmodel            actions= 1 time=1 usec                                 
                         |
-| #coercion             actions= 1 time=2 usec                                 
                         |
-| #evaluate             actions= 0 time=2 usec                                 
                         |
-| #emptybind            actions= 0 time=0 usec                                 
                         |
-| #pushselect           actions= 5 time=9 usec                                 
                         |
-| #aliases              actions= 2 time=3 usec                                 
                         |
-| #mergetable           actions= 0 time=11 usec                                
                         |
-| #deadcode             actions= 2 time=3 usec                                 
                         |
+| #remap                actions= 0 time=3 usec                                 
                         |
+| #costmodel            actions= 1 time=3 usec                                 
                         |
+| #coercion             actions= 1 time=9 usec                                 
                         |
+| #evaluate             actions= 0 time=5 usec                                 
                         |
+| #emptybind            actions= 0 time=1 usec                                 
                         |
+| #pushselect           actions= 5 time=43 usec                                
                         |
+| #aliases              actions= 2 time=14 usec                                
                         |
+| #mergetable           actions= 0 time=56 usec                                
                         |
+| #deadcode             actions= 3 time=13 usec                                
                         |
 | #aliases              actions= 0 time=0 usec                                 
                         |
-| #constants            actions= 1 time=3 usec                                 
                         |
-| #commonTerms          actions= 0 time=2 usec                                 
                         |
-| #projectionpath       actions= 0 time=1 usec                                 
                         |
-| #reorder              actions= 1 time=9 usec                                 
                         |
-| #deadcode             actions= 0 time=1 usec                                 
                         |
+| #constants            actions= 1 time=11 usec                                
                         |
+| #commonTerms          actions= 0 time=10 usec                                
                         |
+| #projectionpath       actions= 0 time=6 usec                                 
                         |
+| #reorder              actions= 1 time=42 usec                                
                         |
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to