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

Reply via email to