Changeset: 967c2584fdea for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=967c2584fdea Added Files: monetdb5/optimizer/opt_postfix.c monetdb5/optimizer/opt_postfix.h sql/test/BugTracker-2017/Tests/createorreplace-system-func.Bug-6499.sql sql/test/BugTracker-2017/Tests/createorreplace-system-func.Bug-6499.stable.err sql/test/BugTracker-2017/Tests/createorreplace-system-func.Bug-6499.stable.out sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.sql sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.stable.err sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.stable.out sql/test/BugTracker-2017/Tests/sqlitelogictest-algebra-operators.Bug-6494.stable.err sql/test/BugTracker-2017/Tests/sqlitelogictest-algebra-operators.Bug-6494.stable.out sql/test/BugTracker-2017/Tests/sqlitelogictest-comparisons-between-floating-points-and-NULL.Bug-6496.stable.err sql/test/BugTracker-2017/Tests/sqlitelogictest-comparisons-between-floating-points-and-NULL.Bug-6496.stable.out sql/test/BugTracker-2017/Tests/sqlitelogictest-hidden-alias.Bug-6495.stable.err sql/test/BugTracker-2017/Tests/sqlitelogictest-hidden-alias.Bug-6495.stable.out sql/test/BugTracker-2017/Tests/sqlitelogictest-min-distinct-empty-table.Bug-6493.stable.err sql/test/BugTracker-2017/Tests/sqlitelogictest-min-distinct-empty-table.Bug-6493.stable.out sql/test/BugTracker-2017/Tests/sqlitelogictest-not-between.Bug-6497.stable.err sql/test/BugTracker-2017/Tests/sqlitelogictest-not-between.Bug-6497.stable.out sql/test/BugTracker-2017/Tests/union_all_null.Bug-6487.sql sql/test/BugTracker-2017/Tests/union_all_null.Bug-6487.stable.err sql/test/BugTracker-2017/Tests/union_all_null.Bug-6487.stable.out Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 clients/Tests/exports.stable.out gdk/gdk_search.c monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out monetdb5/modules/kernel/algebra.c monetdb5/modules/kernel/algebra.h monetdb5/modules/kernel/algebra.mal monetdb5/optimizer/Makefile.ag monetdb5/optimizer/opt_deadcode.c monetdb5/optimizer/opt_pipes.c monetdb5/optimizer/opt_support.c monetdb5/optimizer/opt_wrapper.c monetdb5/optimizer/optimizer.mal sql/backends/monet5/UDF/udf/Tests/udf-fuse.stable.out sql/backends/monet5/UDF/udf/Tests/udf-reverse.stable.out sql/backends/monet5/sql_scenario.c sql/backends/monet5/sql_statement.c sql/backends/monet5/sql_upgrades.c sql/common/sql_types.c sql/jdbc/tests/Tests/Test_Rtimedate.stable.out sql/server/rel_optimizer.c sql/server/rel_psm.c sql/server/rel_select.c sql/server/sql_atom.c sql/server/sql_parser.y sql/server/sql_qc.c sql/server/sql_qc.h sql/server/sql_semantic.h sql/test/BugDay_2005-10-06_2.9.3/Tests/simple_union.SF-1005596.stable.out sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out sql/test/BugTracker-2012/Tests/null_except_null.Bug-3040.stable.out sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out sql/test/BugTracker-2014/Tests/hexadecimal_literals.Bug-3621.stable.err.int128 sql/test/BugTracker-2014/Tests/hexadecimal_literals.Bug-3621.stable.out sql/test/BugTracker-2014/Tests/hexadecimal_literals.Bug-3621.stable.out.int128 sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out sql/test/BugTracker-2015/Tests/crash_in_reduce_groupby.Bug-3818.stable.out.int128 sql/test/BugTracker-2016/Tests/select-in-from.Bug-6121.stable.out sql/test/BugTracker-2017/Tests/All sql/test/BugTracker-2017/Tests/distinct_minus_count_distinct.Bug-6296.stable.out sql/test/BugTracker-2017/Tests/limit.Bug-6322.stable.out sql/test/BugTracker-2017/Tests/spurious_error.Bug-6344.stable.out sql/test/BugTracker-2017/Tests/sqlitelogictest-comparisons-between-floating-points-and-NULL.Bug-6496.sql sql/test/BugTracker-2017/Tests/sqlitelogictest-select-in-column.Bug-6490.stable.out sql/test/BugTracker-2017/Tests/sqllitelogistest_case.Bug-6335.stable.err sql/test/BugTracker-2017/Tests/sqllitelogistest_case.Bug-6335.stable.out sql/test/BugTracker-2017/Tests/type-resolution-error.Bugs-6313.stable.err sql/test/Tests/setoptimizer.stable.out sql/test/bugs/Tests/subselect_multiple_unionall_where_1=1-bug-sf-1005596.stable.out sql/test/bugs/Tests/union_all-bug-sf-941788.stable.out sql/test/mapi/Tests/sql_int128.stable.out.int128 sql/test/mergetables/Tests/mergequery.stable.out sql/test/mergetables/Tests/sqlsmith.Bug-6480.stable.err sql/test/mosaic/Tests/compression.stable.out sql/test/mosaic/Tests/compressionRLE2.stable.out sql/test/mosaic/Tests/session_exit.stable.out sql/test/mosaic/Tests/xqueries.stable.out sql/test/mosaic/Tests/xqueries_delta.stable.out sql/test/remote/Tests/partition_elim.stable.out Branch: mosaic Log Message:
Merge with default diffs (truncated from 2984 to 300 lines): diff --git a/clients/Tests/MAL-signatures.stable.out b/clients/Tests/MAL-signatures.stable.out --- a/clients/Tests/MAL-signatures.stable.out +++ b/clients/Tests/MAL-signatures.stable.out @@ -83,9 +83,12 @@ Ready. [ "aggr", "corr", "function aggr.corr(e1:bat[:sht], e2:bat[:sht]):dbl;", "", "" ] [ "aggr", "count", "command aggr.count(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], ignorenils:bit):bat[:lng] ", "AGGRcount3;", "" ] [ "aggr", "count", "command aggr.count(b:bat[:any_1], g:bat[:oid], e:bat[:any_2]):bat[:lng] ", "AGGRcount3nils;", "Grouped count" ] +[ "aggr", "count", "command aggr.count(b:bat[:any], cnd:bat[:oid]):lng ", "ALGcountCND_bat;", "Return the current size (in number of elements) in a BAT." ] +[ "aggr", "count", "command aggr.count(b:bat[:any], cnd:bat[:oid], ignore_nils:bit):lng ", "ALGcountCND_nil;", "Return the number of elements currently in a BAT ignores\n\t\tBUNs with nil-tail iff ignore_nils==TRUE." ] [ "aggr", "count", "command aggr.count(b:bat[:any]):lng ", "ALGcount_bat;", "Return the current size (in number of elements) in a BAT." ] [ "aggr", "count", "command aggr.count(b:bat[:any], ignore_nils:bit):lng ", "ALGcount_nil;", "Return the number of elements currently in a BAT ignores\n\t\tBUNs with nil-tail iff ignore_nils==TRUE." ] [ "aggr", "count_no_nil", "command aggr.count_no_nil(b:bat[:any_1], g:bat[:oid], e:bat[:any_2]):bat[:lng] ", "AGGRcount3nonils;", "" ] +[ "aggr", "count_no_nil", "command aggr.count_no_nil(b:bat[:any_2], cnd:bat[:oid]):lng ", "ALGcountCND_no_nil;", "Return the number of elements currently\n\tin a BAT ignoring BUNs with nil-tail" ] [ "aggr", "count_no_nil", "command aggr.count_no_nil(b:bat[:any_2]):lng ", "ALGcount_no_nil;", "Return the number of elements currently\n\tin a BAT ignoring BUNs with nil-tail" ] [ "aggr", "covar", "function aggr.covar(e1:bat[:bte], e2:bat[:bte]):dbl;", "", "" ] [ "aggr", "covar", "function aggr.covar(e1:bat[:dbl], e2:bat[:dbl]):dbl;", "", "" ] @@ -8271,6 +8274,8 @@ Ready. [ "optimizer", "optimize", "pattern optimizer.optimize(mod:str, fcn:str):void ", "QOToptimize;", "Optimize a specific operation" ] [ "optimizer", "orcam", "pattern optimizer.orcam(mod:str, fcn:str, targetmod:str, targetfcn:str):void ", "OPTorcam;", "Inverse macro, find pattern and replace with a function call." ] [ "optimizer", "orcam", "pattern optimizer.orcam(targetmod:str, targetfcn:str):void ", "OPTorcam;", "Inverse macro processor for current function" ] +[ "optimizer", "postfix", "pattern optimizer.postfix():str ", "OPTwrapper;", "" ] +[ "optimizer", "postfix", "pattern optimizer.postfix(mod:str, fcn:str):str ", "OPTwrapper;", "Postfix the plan,e.g. pushing projections" ] [ "optimizer", "prelude", "pattern optimizer.prelude():void ", "optimizer_prelude;", "Initialize the optimizer" ] [ "optimizer", "profiler", "pattern optimizer.profiler():str ", "OPTwrapper;", "" ] [ "optimizer", "profiler", "pattern optimizer.profiler(mod:str, fcn:str):str ", "OPTwrapper;", "Collect properties for the profiler" ] diff --git a/clients/Tests/MAL-signatures.stable.out.int128 b/clients/Tests/MAL-signatures.stable.out.int128 --- a/clients/Tests/MAL-signatures.stable.out.int128 +++ b/clients/Tests/MAL-signatures.stable.out.int128 @@ -90,9 +90,12 @@ Ready. [ "aggr", "corr", "function aggr.corr(e1:bat[:sht], e2:bat[:sht]):dbl;", "", "" ] [ "aggr", "count", "command aggr.count(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], ignorenils:bit):bat[:lng] ", "AGGRcount3;", "" ] [ "aggr", "count", "command aggr.count(b:bat[:any_1], g:bat[:oid], e:bat[:any_2]):bat[:lng] ", "AGGRcount3nils;", "Grouped count" ] +[ "aggr", "count", "command aggr.count(b:bat[:any], cnd:bat[:oid]):lng ", "ALGcountCND_bat;", "Return the current size (in number of elements) in a BAT." ] +[ "aggr", "count", "command aggr.count(b:bat[:any], cnd:bat[:oid], ignore_nils:bit):lng ", "ALGcountCND_nil;", "Return the number of elements currently in a BAT ignores\n\t\tBUNs with nil-tail iff ignore_nils==TRUE." ] [ "aggr", "count", "command aggr.count(b:bat[:any]):lng ", "ALGcount_bat;", "Return the current size (in number of elements) in a BAT." ] [ "aggr", "count", "command aggr.count(b:bat[:any], ignore_nils:bit):lng ", "ALGcount_nil;", "Return the number of elements currently in a BAT ignores\n\t\tBUNs with nil-tail iff ignore_nils==TRUE." ] [ "aggr", "count_no_nil", "command aggr.count_no_nil(b:bat[:any_1], g:bat[:oid], e:bat[:any_2]):bat[:lng] ", "AGGRcount3nonils;", "" ] +[ "aggr", "count_no_nil", "command aggr.count_no_nil(b:bat[:any_2], cnd:bat[:oid]):lng ", "ALGcountCND_no_nil;", "Return the number of elements currently\n\tin a BAT ignoring BUNs with nil-tail" ] [ "aggr", "count_no_nil", "command aggr.count_no_nil(b:bat[:any_2]):lng ", "ALGcount_no_nil;", "Return the number of elements currently\n\tin a BAT ignoring BUNs with nil-tail" ] [ "aggr", "covar", "function aggr.covar(e1:bat[:bte], e2:bat[:bte]):dbl;", "", "" ] [ "aggr", "covar", "function aggr.covar(e1:bat[:dbl], e2:bat[:dbl]):dbl;", "", "" ] @@ -10633,6 +10636,8 @@ Ready. [ "optimizer", "optimize", "pattern optimizer.optimize(mod:str, fcn:str):void ", "QOToptimize;", "Optimize a specific operation" ] [ "optimizer", "orcam", "pattern optimizer.orcam(mod:str, fcn:str, targetmod:str, targetfcn:str):void ", "OPTorcam;", "Inverse macro, find pattern and replace with a function call." ] [ "optimizer", "orcam", "pattern optimizer.orcam(targetmod:str, targetfcn:str):void ", "OPTorcam;", "Inverse macro processor for current function" ] +[ "optimizer", "postfix", "pattern optimizer.postfix():str ", "OPTwrapper;", "" ] +[ "optimizer", "postfix", "pattern optimizer.postfix(mod:str, fcn:str):str ", "OPTwrapper;", "Postfix the plan,e.g. pushing projections" ] [ "optimizer", "prelude", "pattern optimizer.prelude():void ", "optimizer_prelude;", "Initialize the optimizer" ] [ "optimizer", "profiler", "pattern optimizer.profiler():str ", "OPTwrapper;", "" ] [ "optimizer", "profiler", "pattern optimizer.profiler(mod:str, fcn:str):str ", "OPTwrapper;", "Collect properties for the profiler" ] diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -693,6 +693,9 @@ str ALARMusec(lng *ret); str ALGbandjoin(bat *r1, bat *r2, const bat *lid, const bat *rid, const bat *slid, const bat *srid, const void *low, const void *high, const bit *li, const bit *hi, const lng *estimate); str ALGcard(lng *result, const bat *bid); str ALGcopy(bat *result, const bat *bid); +str ALGcountCND_bat(lng *result, const bat *bid, const bat *cnd); +str ALGcountCND_nil(lng *result, const bat *bid, const bat *cnd, const bit *ignore_nils); +str ALGcountCND_no_nil(lng *result, const bat *bid, const bat *cnd); str ALGcount_bat(lng *result, const bat *bid); str ALGcount_nil(lng *result, const bat *bid, const bit *ignore_nils); str ALGcount_no_nil(lng *result, const bat *bid); @@ -1710,6 +1713,7 @@ str OPTmultiplexSimple(Client cntxt, Mal str OPToltpImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str OPTorcam(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str OPTorcamImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); +str OPTpostfixImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str OPTprofilerImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str OPTprojectionpathImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str OPTpushselectImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); diff --git a/gdk/gdk_search.c b/gdk/gdk_search.c --- a/gdk/gdk_search.c +++ b/gdk/gdk_search.c @@ -458,8 +458,6 @@ SORTfndlast(BAT *b, const void *v) } if (b->ttype == TYPE_void) { assert(is_oid_nil(b->tseqbase)); - if (is_oid_nil(*(const oid *) v)) - return 0; return BATcount(b); } return binsearch(NULL, 0, b->ttype, Tloc(b, 0), 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. % .L1 # table_name % def # name % clob # type -% 538 # length -[ "optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.reorder();optimizer.deadcode();optimizer.matpack();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.mosaic();optimizer.profiler();optimizer.candidates();optimizer.wlc();optimizer.garbageCollector();" ] +% 579 # length +[ "optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.reorder();optimizer.deadcode();optimizer.matpack();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.mosaic();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.garbageCollector();" ] #explain copy into ttt from '/tmp/xyz'; % .explain # table_name % mal # name @@ -114,8 +114,8 @@ end user.s10_1; % .L1 # table_name % def # name % clob # type -% 561 # length -[ "optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.reorder();optimizer.deadcode();optimizer.matpack();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.mosaic();optimizer.profiler();optimizer.candidates();optimizer.wlc();optimizer.sql_append();optimizer.garbageCollector();" ] +% 602 # length +[ "optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.reorder();optimizer.deadcode();optimizer.matpack();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.mosaic();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.sql_append();optimizer.garbageCollector();" ] #explain copy into ttt from '/tmp/xyz'; % .explain # table_name % mal # name diff --git a/monetdb5/modules/kernel/algebra.c b/monetdb5/modules/kernel/algebra.c --- a/monetdb5/modules/kernel/algebra.c +++ b/monetdb5/modules/kernel/algebra.c @@ -816,6 +816,65 @@ ALGcount_no_nil(lng *result, const bat * } str +ALGcountCND_bat(lng *result, const bat *bid, const bat *cnd) +{ + BAT *b; + + if ( *cnd) { + if ((b = BATdescriptor(*cnd)) == NULL) { + throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + } + *result = (lng) BATcount(b); + BBPunfix(b->batCacheid); + return MAL_SUCCEED; + } + if ((b = BATdescriptor(*bid)) == NULL) { + throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + } + *result = (lng) BATcount(b); + BBPunfix(b->batCacheid); + return MAL_SUCCEED; +} + +str +ALGcountCND_nil(lng *result, const bat *bid, const bat *cnd, const bit *ignore_nils) +{ + BAT *b; + BUN cnt; + + if (*ignore_nils){ + if ((b = BATdescriptor(*bid)) == NULL) { + throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + } + cnt = BATcount_no_nil(b); + } else{ + if ( *cnd) { + if ((b = BATdescriptor(*cnd)) == NULL) { + throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + } + *result = (lng) BATcount(b); + BBPunfix(b->batCacheid); + return MAL_SUCCEED; + } + if ((b = BATdescriptor(*bid)) == NULL) { + throw(MAL, "aggr.count", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + } + cnt = BATcount(b); + } + *result = (lng) cnt; + BBPunfix(b->batCacheid); + return MAL_SUCCEED; +} + +str +ALGcountCND_no_nil(lng *result, const bat *bid, const bat *cnd) +{ + bit ignore_nils = 1; + + return ALGcountCND_nil(result, bid, cnd, &ignore_nils); +} + +str ALGslice(bat *ret, const bat *bid, const lng *start, const lng *end) { BAT *b, *bn = NULL; diff --git a/monetdb5/modules/kernel/algebra.h b/monetdb5/modules/kernel/algebra.h --- a/monetdb5/modules/kernel/algebra.h +++ b/monetdb5/modules/kernel/algebra.h @@ -60,6 +60,9 @@ mal_export str ALGsort33(bat *result, ba mal_export str ALGcount_bat(lng *result, const bat *bid); mal_export str ALGcount_nil(lng *result, const bat *bid, const bit *ignore_nils); mal_export str ALGcount_no_nil(lng *result, const bat *bid); +mal_export str ALGcountCND_bat(lng *result, const bat *bid, const bat *cnd); +mal_export str ALGcountCND_nil(lng *result, const bat *bid, const bat *cnd, const bit *ignore_nils); +mal_export str ALGcountCND_no_nil(lng *result, const bat *bid, const bat *cnd); mal_export str ALGslice(bat *ret, const bat *bid, const lng *start, const lng *end); mal_export str ALGslice_int(bat *ret, const bat *bid, const int *start, const int *end); mal_export str ALGslice_lng(bat *ret, const bat *bid, const lng *start, const lng *end); diff --git a/monetdb5/modules/kernel/algebra.mal b/monetdb5/modules/kernel/algebra.mal --- a/monetdb5/modules/kernel/algebra.mal +++ b/monetdb5/modules/kernel/algebra.mal @@ -286,6 +286,19 @@ address ALGcount_no_nil comment "Return the number of elements currently in a BAT ignoring BUNs with nil-tail"; +# the variants with a candidate list +command count( b:bat[:any], cnd:bat[:oid] ) :lng +address ALGcountCND_bat +comment "Return the current size (in number of elements) in a BAT."; +command count ( b:bat[:any], cnd:bat[:oid], ignore_nils:bit ) :lng +address ALGcountCND_nil +comment "Return the number of elements currently in a BAT ignores + BUNs with nil-tail iff ignore_nils==TRUE."; +command count_no_nil ( b:bat[:any_2], cnd:bat[:oid]) :lng +address ALGcountCND_no_nil +comment "Return the number of elements currently + in a BAT ignoring BUNs with nil-tail"; + # Default Min and Max # Implementations a generic Min and Max routines get declared first. The # @emph{min()} and @emph{max()} routines below catch any tail-type. diff --git a/monetdb5/optimizer/Makefile.ag b/monetdb5/optimizer/Makefile.ag --- a/monetdb5/optimizer/Makefile.ag +++ b/monetdb5/optimizer/Makefile.ag @@ -52,6 +52,7 @@ lib_optimizer = { opt_support.c opt_support.h \ opt_pushselect.c opt_pushselect.h \ opt_profiler.c opt_profiler.h \ + opt_postfix.c opt_postfix.h \ opt_volcano.c opt_volcano.h \ opt_wrapper.c } diff --git a/monetdb5/optimizer/opt_deadcode.c b/monetdb5/optimizer/opt_deadcode.c --- a/monetdb5/optimizer/opt_deadcode.c +++ b/monetdb5/optimizer/opt_deadcode.c @@ -63,7 +63,9 @@ OPTdeadcodeImplementation(Client cntxt, } if ( getModuleId(p) == batRef && isUpdateInstruction(p) && !p->barrier){ /* bat.append and friends are intermediates that need not be retained - * unless they are used */ + * unless they are not used outside of an update */ + if( varused[getArg(p,1)] > 1 ) + varused[getArg(p,0)]++; // force keeping it } else if (hasSideEffects(mb, p, FALSE) || !isLinearFlow(p) || (p->retc == 1 && mb->unsafeProp) || p->barrier /* ==side-effect */){ diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c --- a/monetdb5/optimizer/opt_pipes.c +++ b/monetdb5/optimizer/opt_pipes.c @@ -91,6 +91,8 @@ static struct PIPELINES { "optimizer.mosaic();" "optimizer.profiler();" "optimizer.candidates();" + "optimizer.postfix();" + "optimizer.deadcode();" // "optimizer.jit();" awaiting the new batcalc api // "optimizer.oltp();"awaiting the autocommit front-end changes "optimizer.wlc();" @@ -127,6 +129,8 @@ static struct PIPELINES { "optimizer.mosaic();" "optimizer.profiler();" "optimizer.candidates();" + "optimizer.postfix();" + "optimizer.deadcode();" // "optimizer.jit();" awaiting the new batcalc api // "optimizer.oltp();"awaiting the autocommit front-end changes "optimizer.wlc();" @@ -167,6 +171,8 @@ static struct PIPELINES { "optimizer.generator();" "optimizer.profiler();" "optimizer.candidates();" + "optimizer.postfix();" + "optimizer.deadcode();" // "optimizer.jit();" awaiting the new batcalc api // "optimizer.oltp();"awaiting the autocommit front-end changes "optimizer.mosaic();" @@ -208,6 +214,8 @@ static struct PIPELINES { "optimizer.mosaic();" "optimizer.profiler();" "optimizer.candidates();" + "optimizer.postfix();" + "optimizer.deadcode();" // "optimizer.jit();" awaiting the new batcalc api // "optimizer.oltp();"awaiting the autocommit front-end changes "optimizer.wlc();" diff --git a/monetdb5/optimizer/opt_postfix.c b/monetdb5/optimizer/opt_postfix.c new file mode 100644 --- /dev/null +++ b/monetdb5/optimizer/opt_postfix.c @@ -0,0 +1,92 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 1997 - July 2008 CWI, August 2008 - 2017 MonetDB B.V. + */ + +/* The SQL code generator can not always look ahead to avoid + * generation of intermediates. + * Some of these patterns are captured in a postfix optimalisation. + */ +#include "monetdb_config.h" +#include "mal_instruction.h" +#include "opt_postfix.h" + +#define isCandidateList(M,P,I) ((M)->var[getArg(P,I)].id[0]== 'C') +str _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list