Changeset: 13b999efbd71 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=13b999efbd71
Removed Files:
        monetdb5/optimizer/opt_emptybind.c
Modified Files:
        monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
        
monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.single
        monetdb5/optimizer/opt_aliases.c
        monetdb5/optimizer/opt_evaluate.c
        sql/backends/monet5/sql.mal
Branch: jit
Log Message:

Add missing signature
This causes optimizers to fail and indirectly cause a
segfault on double free of instructions.


diffs (truncated from 303 to 300 lines):

diff --git 
a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out 
b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
--- a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
+++ b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
@@ -55,8 +55,8 @@ Ready.
 % .L # table_name
 % def # name
 % clob # type
-% 563 # length
-[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.garbageCollector();"
        ]
+% 565 # length
+[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptycolumn();optimizer.pushselect();optimizer.aliases();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.garbageCollector();"
      ]
 #explain copy into ttt from '/tmp/xyz';
 % .explain # table_name
 % mal # name
@@ -116,8 +116,8 @@ end user.s8_1;
 % .L # table_name
 % def # name
 % clob # type
-% 586 # length
-[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.sql_append();optimizer.garbageCollector();"
 ]
+% 588 # length
+[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptycolumn();optimizer.pushselect();optimizer.aliases();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.sql_append();optimizer.garbageCollector();"
       ]
 #explain copy into ttt from '/tmp/xyz';
 % .explain # table_name
 % mal # name
diff --git 
a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.single 
b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.single
--- 
a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.single
+++ 
b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.single
@@ -55,8 +55,8 @@ Ready.
 % .L # table_name
 % def # name
 % clob # type
-% 563 # length
-[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.garbageCollector();"
        ]
+% 565 # length
+[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptycolumn();optimizer.pushselect();optimizer.aliases();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.garbageCollector();"
      ]
 #explain copy into ttt from '/tmp/xyz';
 % .explain # table_name
 % mal # name
@@ -114,8 +114,8 @@ end user.s8_1;
 % .L # table_name
 % def # name
 % clob # type
-% 586 # length
-[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.sql_append();optimizer.garbageCollector();"
 ]
+% 588 # length
+[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptycolumn();optimizer.pushselect();optimizer.aliases();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.sql_append();optimizer.garbageCollector();"
       ]
 #explain copy into ttt from '/tmp/xyz';
 % .explain # table_name
 % mal # name
diff --git a/monetdb5/optimizer/opt_aliases.c b/monetdb5/optimizer/opt_aliases.c
--- a/monetdb5/optimizer/opt_aliases.c
+++ b/monetdb5/optimizer/opt_aliases.c
@@ -57,6 +57,7 @@ OPTaliasesImplementation(Client cntxt, M
                                freeInstruction(p);
                                actions++;
                                k--;
+                               mb->stmt[k]= 0;
                        } else 
                                OPTaliasRemap(p,alias);
                } else 
diff --git a/monetdb5/optimizer/opt_emptybind.c 
b/monetdb5/optimizer/opt_emptybind.c
deleted file mode 100644
--- a/monetdb5/optimizer/opt_emptybind.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * The contents of this file are subject to the MonetDB Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.monetdb.org/Legal/MonetDBLicense
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
- * License for the specific language governing rights and limitations
- * under the License.
- *
- * The Original Code is the MonetDB Database System.
- *
- * The Initial Developer of the Original Code is CWI.
- * Portions created by CWI are Copyright (C) 1997-July 2008 CWI.
- * Copyright August 2008-2016 MonetDB B.V.
- * All Rights Reserved.
- */
-
-/* author M.Kersten
- * This optimizer hunts for the empty persistent tables accessed
- * and propagates them.
- */
-#include "monetdb_config.h"
-#include "opt_emptybind.h"
-#include "opt_aliases.h"
-#include "opt_deadcode.h"
-#include "mal_builder.h"
-
-#define propagate(X)                                                           
        \
-       do {                                                                    
                        \
-               clrFunction(p);                                                 
                \
-               getArg(p,1)= getArg(p,X);                                       
        \
-               p->argc = 2;                                                    
                \
-               actions++;                                                      
                        \
-       } while (0)
-
-#define emptyresult(TPE)                                                       
        \
-       do {                                                                    
                        \
-               clrFunction(p);                                                 
                \
-               setModuleId(p, batRef);                                         
        \
-               setFunctionId(p,newRef);                                        
        \
-               p->argc = 1;                                                    
                \
-               cst.vtype=TYPE_void;                                            
        \
-               cst.val.oval= oid_nil;                                          
        \
-               cst.len = 0;                                                    
                \
-               (void) convertConstant(TPE, &cst);                              
\
-               tmp = defConstant(mb,TPE,&cst);                                 
\
-               p= pushArgument(mb, p, tmp);                                    
        \
-               actions++;                                                      
                        \
-       } while (0)
-
-
-//#undef       OPTDEBUGemptybind
-//#define      OPTDEBUGemptybind
-int
-OPTemptybindImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci)
-{
-       int i, actions = 0;
-       int *marked;
-       int limit = mb->stop, slimit= mb->ssize;
-       InstrPtr p, *old = mb->stmt;
-
-       // use an instruction reference table to keep
-       // track of where 'emptybind' results are produced
-       marked = (int *) GDKzalloc(mb->vsize * sizeof(int));
-       if ( marked == NULL)
-               return 0;
-       (void) stk;
-       /* Got an instructions V:= bat.new(:tpe) 
-        * The form the initial family of marked sets.
-        */
-
-       (void) cntxt;
-       (void) pci;
-
-       OPTDEBUGemptybind{
-               mnstr_printf(GDKout, "Optimize Query Emptybind\n");
-               printFunction(GDKout, mb, 0, LIST_MAL_DEBUG);
-       }
-
-       if ( newMalBlkStmt(mb, mb->ssize) < 0)
-               return 0;
-
-       /* Symbolic evaluation of the empty BAT variables */
-       /* by looking at empty BAT arguments */
-       for (i = 0; i < limit; i++) {
-               p = old[i];
-
-               pushInstruction(mb,p);
-               if (p->token == ENDsymbol){
-                       for(i++; i<limit; i++)
-                               if (old[i])
-                                       pushInstruction(mb,old[i]);
-                       break;
-               }
-
-               /*
-                * The bulk of the intelligence lies in inspecting calling
-                * sequences to filter and replace results 
-                */
-               if ( getModuleId(p) == batRef && getFunctionId(p) == newRef){
-                       OPTDEBUGemptybind
-                               mnstr_printf(cntxt->fdout, "#empty bat  pc %d 
var %d\n",i , getArg(p,0) );
-                       marked[getArg(p,0)] = i;
-                       continue;
-               } 
-
-               /* restore the naming, dropping the runtime property 'marked' */
-               if (getFunctionId(p) == emptybindRef) {
-                       OPTDEBUGemptybind
-                               mnstr_printf(cntxt->fdout, "#empty bind  pc %d 
var %d\n",i , getArg(p,0) );
-                       setFunctionId(p,bindRef);
-                       marked[getArg(p,0)] = i;
-                       if( p->retc == 2){
-                               marked[getArg(p,1)] = i;
-                               OPTDEBUGemptybind
-                                       mnstr_printf(cntxt->fdout, "#empty bind 
 pc %d var %d\n",i , getArg(p,1) );
-                       }
-                       continue;
-               }
-
-               if (getFunctionId(p) == emptybindidxRef) {
-                       OPTDEBUGemptybind
-                               mnstr_printf(cntxt->fdout, "#empty bindidx  pc 
%d var %d\n",i , getArg(p,0) );
-                       setFunctionId(p,bindidxRef);
-                       marked[getArg(p,0)] = i;
-                       continue;
-               }
-
-               // delta operations without updates+ insert can be replaced by 
an assignment
-               if (getModuleId(p)== sqlRef && getFunctionId(p) == deltaRef  && 
p->argc ==5){
-                       OPTDEBUGemptybind
-                               mnstr_printf(cntxt->fdout, "#empty delta  pc %d 
var %d,%d,%d\n",i ,marked[getArg(p,2)], marked[getArg(p,3)], 
marked[getArg(p,4)] );
-                       if( marked[getArg(p,2)] && marked[getArg(p,3)] && 
marked[getArg(p,4)] ){
-                               OPTDEBUGemptybind
-                                       mnstr_printf(cntxt->fdout, "#empty 
delta  pc %d var %d\n",i , getArg(p,0) );
-                               clrFunction(p);
-                               p->argc = 2;
-                               marked[getArg(p,0)] = i;
-                       }
-                       continue;
-               }
-
-               if (getModuleId(p)== sqlRef && getFunctionId(p) == 
projectdeltaRef) {
-                       if( marked[getArg(p,3)] && marked[getArg(p,4)] ){
-                               OPTDEBUGemptybind
-                                       mnstr_printf(cntxt->fdout, "#empty 
projectdelta  pc %d var %d\n",i , getArg(p,0) );
-                                       setModuleId(p,algebraRef);
-                                       setFunctionId(p,projectionRef);
-                                       p->argc = 3;
-                       }
-                       continue;
-               }
-       }
-       for(; i<slimit; i++)
-               if (old[i])
-                       freeInstruction(old[i]);
-
-       OPTDEBUGemptybind{
-               mnstr_printf(GDKout, "Optimize Query Emptybind done\n");
-               printFunction(GDKout, mb, 0, LIST_MAL_DEBUG);
-       }
-
-       GDKfree(old);
-       GDKfree(marked);
-       return actions;
-}
diff --git a/monetdb5/optimizer/opt_evaluate.c 
b/monetdb5/optimizer/opt_evaluate.c
--- a/monetdb5/optimizer/opt_evaluate.c
+++ b/monetdb5/optimizer/opt_evaluate.c
@@ -74,6 +74,7 @@ OPTremoveUnusedBlocks(Client cntxt, MalB
                                        block = -1;
                                        skip = 0;
                                        freeInstruction(p);
+                                       mb->stmt[i]= 0;
                                        continue;
                        }
                        if (p->argc == 2 && blockStart(p) && block < 0 && 
isVarConstant(mb, getArg(p, 1)) && getArgType(mb, p, 1) == TYPE_bit ){
@@ -90,14 +91,16 @@ OPTremoveUnusedBlocks(Client cntxt, MalB
                                        skip = 0;
                                        action++;
                                        freeInstruction(p);
+                                       mb->stmt[i]= 0;
                                        continue;
                                }
                        } else 
                        if( p->argc == 2 &&  blockStart(p) && block >= 0 && 
skip == 0 && isVarConstant(mb, getArg(p, 1)) && getArgType(mb, p, 1) == 
TYPE_bit && multipass == 0)
                                multipass++;
-                       if (skip)
+                       if (skip){
                                freeInstruction(p);
-                       else
+                               mb->stmt[i]= 0;
+                       } else
                                mb->stmt[j++] = p;
                }
                mb->stop = j;
diff --git a/sql/backends/monet5/sql.mal b/sql/backends/monet5/sql.mal
--- a/sql/backends/monet5/sql.mal
+++ b/sql/backends/monet5/sql.mal
@@ -176,6 +176,8 @@ unsafe pattern restart( sname:str, seque
 address mvc_restart_seq
 comment "restart the sequence with value start";
 
+pattern emptycolumnidx(mvc:int, schema:str, table:str, index:str, 
access:int):bat[:any_1]
+address mvc_bind_idxbat_wrap;
 pattern bind_idxbat(mvc:int, schema:str, table:str, index:str, 
access:int):bat[:any_1]
 address mvc_bind_idxbat_wrap
 comment "Bind the 'schema.table.index' BAT with access kind:
@@ -183,6 +185,8 @@ comment "Bind the 'schema.table.index' B
        1 - inserts
        2 - updates";
 
+pattern emptycolumnidx(mvc:int, schema:str, table:str, index:str, 
access:int)(uid:bat[:oid],uval:bat[:any_1])
+address mvc_bind_idxbat_wrap;
 pattern bind_idxbat(mvc:int, schema:str, table:str, index:str, 
access:int)(uid:bat[:oid],uval:bat[:any_1])
 address mvc_bind_idxbat_wrap
 comment "Bind the 'schema.table.index' BAT with access kind:
@@ -190,6 +194,8 @@ comment "Bind the 'schema.table.index' B
        1 - inserts
        2 - updates";
 
+pattern emptycolumnidx(mvc:int, schema:str, table:str, index:str, access:int, 
part_nr:int, nr_parts:int):bat[:any_1]
+address mvc_bind_idxbat_wrap;
 pattern bind_idxbat(mvc:int, schema:str, table:str, index:str, access:int, 
part_nr:int, nr_parts:int):bat[:any_1]
 address mvc_bind_idxbat_wrap
 comment "Bind the 'schema.table.index' BAT with access kind:
@@ -197,6 +203,8 @@ comment "Bind the 'schema.table.index' B
        1 - inserts
        2 - updates";
 
+pattern emptycolumnidx(mvc:int, schema:str, table:str, index:str, access:int, 
part_nr:int, nr_parts:int)(uid:bat[:oid],uval:bat[:any_1])
+address mvc_bind_idxbat_wrap;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to