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