Changeset: 467c44ce6099 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/467c44ce6099
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        gdk/gdk_aggr.c
        gdk/gdk_string.c
        monetdb5/modules/atoms/json.c
        monetdb5/modules/mal/pcre.c
        monetdb5/optimizer/opt_mergetable.c
        monetdb5/optimizer/opt_remap.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_rank.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
        sql/backends/monet5/sql_subquery.c
        sql/server/rel_optimizer.c
        sql/test/SQLancer/Tests/sqlancer18.test
Branch: pushcands
Log Message:

Merged with default


diffs (truncated from 3565 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
@@ -5004,6 +5004,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batmtime",  "year", "pattern batmtime.year(X_0:bat[:timestamp], 
X_1:bat[:oid]):bat[:int] ", "MTIMEtimestamp_year_bulk;",    ""      ]
 [ "batpcre",   "replace",      "command batpcre.replace(X_0:bat[:str], 
X_1:str, X_2:str, X_3:str):bat[:str] ", "PCREreplace_bat_wrap;",        ""      
]
 [ "batpcre",   "replace_first",        "command 
batpcre.replace_first(X_0:bat[:str], X_1:str, X_2:str, X_3:str):bat[:str] ",   
"PCREreplacefirst_bat_wrap;",   ""      ]
+[ "batpyapi3", "eval", "unsafe pattern batpyapi3.eval(X_0:lng, X_1:ptr, 
X_2:str):any... ",     "PYAPI3PyAPIevalStd;",  "Execute a simple Python script 
value"  ]
 [ "batpyapi3", "eval", "unsafe pattern batpyapi3.eval(X_0:ptr, X_1:str, 
X_2:any...):any... ",  "PYAPI3PyAPIevalStd;",  "Execute a simple Python script 
value"  ]
 [ "batpyapi3", "eval_aggr",    "unsafe pattern batpyapi3.eval_aggr(X_0:ptr, 
X_1:str, X_2:any...):any... ",     "PYAPI3PyAPIevalAggr;", "grouped aggregates 
through Python"     ]
 [ "batpyapi3", "eval_loader",  "unsafe pattern batpyapi3.eval_loader(X_0:ptr, 
X_1:str):any... ",       "PYAPI3PyAPIevalLoader;",       "loader functions 
through Python"       ]
@@ -5012,6 +5013,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batpyapi3map",      "eval", "pattern batpyapi3map.eval(X_0:ptr, X_1:str, 
X_2:any...):any... ",      "PYAPI3PyAPIevalStdMap;",       "Execute a simple 
Python script value"  ]
 [ "batpyapi3map",      "eval_aggr",    "pattern 
batpyapi3map.eval_aggr(X_0:ptr, X_1:str, X_2:any...):any... ", 
"PYAPI3PyAPIevalAggrMap;",      "grouped aggregates through Python"     ]
 [ "batpyapi3map",      "subeval_aggr", "pattern 
batpyapi3map.subeval_aggr(X_0:ptr, X_1:str, X_2:any...):any... ",      
"PYAPI3PyAPIevalAggrMap;",      "grouped aggregates through Python"     ]
+[ "batrapi",   "eval", "pattern batrapi.eval(X_0:lng, X_1:ptr, X_2:str):any... 
",      "RAPIevalStd;", "Execute a simple R script value"       ]
 [ "batrapi",   "eval", "pattern batrapi.eval(X_0:ptr, X_1:str, 
X_2:any...):any... ",   "RAPIevalStd;", "Execute a simple R script value"       
]
 [ "batrapi",   "eval_aggr",    "pattern batrapi.eval_aggr(X_0:ptr, X_1:str, 
X_2:any...):any... ",      "RAPIevalAggr;",        "grouped aggregates through 
R"  ]
 [ "batrapi",   "subeval_aggr", "pattern batrapi.subeval_aggr(X_0:ptr, X_1:str, 
X_2:any...):any... ",   "RAPIevalAggr;",        "grouped aggregates through R"  
]
@@ -5103,9 +5105,6 @@ stdout of test 'MAL-signatures` in direc
 [ "batsql",    "diff", "pattern batsql.diff(X_0:bat[:bit], 
X_1:bat[:any_1]):bat[:bit] ",       "SQLdiff;",     "return true if cur != prev 
row"        ]
 [ "batsql",    "diff", "pattern batsql.diff(X_0:bit, 
X_1:bat[:any_1]):bat[:bit] ",     "SQLdiff;",     "return true if cur != prev 
row"        ]
 [ "batsql",    "first_value",  "pattern batsql.first_value(X_0:bat[:any_1], 
X_1:any, X_2:any, X_3:int, X_4:any, X_5:any):bat[:any_1] ",        
"SQLfirst_value;",      "return the first value of groups"      ]
-[ "batsql",    "get_value",    "pattern batsql.get_value(X_0:bat[:str], 
X_1:bat[:str]):bat[:lng] ",    "mvc_bat_get_value;",   "return the current 
value of sequences" ]
-[ "batsql",    "get_value",    "pattern batsql.get_value(X_0:bat[:str], 
X_1:str):bat[:lng] ",  "mvc_bat_get_value;",   "return the current value of the 
sequence"      ]
-[ "batsql",    "get_value",    "pattern batsql.get_value(X_0:str, 
X_1:bat[:str]):bat[:lng] ",  "mvc_bat_get_value;",   "return the current value 
of sequences" ]
 [ "batsql",    "lag",  "pattern batsql.lag(X_0:any_1, X_1:any, 
X_2:bat[:any_1], X_3:any_2, X_4:any_3):bat[:any_1] ",   "SQLlag;",      "return 
the value in the previous 'l' row in the partition or 'd' if non existent"      
]
 [ "batsql",    "lag",  "pattern batsql.lag(X_0:any_1, X_1:bat[:any], 
X_2:any_1, X_3:any_2, X_4:any_3):bat[:any_1] ",   "SQLlag;",      "return the 
value in the previous 'l' row in the partition or 'd' if non existent"      ]
 [ "batsql",    "lag",  "pattern batsql.lag(X_0:any_1, X_1:bat[:any], 
X_2:any_2, X_3:any_3):bat[:any_1] ",      "SQLlag;",      "return the value in 
the previous 'l' row in the partition or NULL if non existent"     ]
@@ -5131,9 +5130,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batsql",    "lead", "pattern batsql.lead(X_0:bat[:any_1], X_1:bat[:any], 
X_2:bat[:any_1], X_3:any_2, X_4:any_3):bat[:any_1] ",      "SQLlead;",     
"return the value in the next 'l' row in the partition or 'd' if non existent"  
]
 [ "batsql",    "max",  "pattern batsql.max(X_0:bat[:any_1], X_1:any, X_2:any, 
X_3:int, X_4:any, X_5:any):bat[:any_1] ",        "SQLmax;",      "return the 
maximum of groups"  ]
 [ "batsql",    "min",  "pattern batsql.min(X_0:bat[:any_1], X_1:any, X_2:any, 
X_3:int, X_4:any, X_5:any):bat[:any_1] ",        "SQLmin;",      "return the 
minimum of groups"  ]
-[ "batsql",    "next_value",   "pattern batsql.next_value(X_0:bat[:str], 
X_1:bat[:str]):bat[:lng] ",   "mvc_bat_next_value;",  "return the next value of 
sequences"    ]
-[ "batsql",    "next_value",   "pattern batsql.next_value(X_0:bat[:str], 
X_1:str):bat[:lng] ", "mvc_bat_next_value;",  "return the next value of the 
sequence" ]
-[ "batsql",    "next_value",   "pattern batsql.next_value(X_0:str, 
X_1:bat[:str]):bat[:lng] ", "mvc_bat_next_value;",  "return the next value of 
sequences"    ]
+[ "batsql",    "next_value",   "unsafe pattern batsql.next_value(X_0:lng, 
X_1:str, X_2:str):bat[:lng] ",       "mvc_next_value_bulk;", "return the next 
value of the sequence" ]
 [ "batsql",    "nth_value",    "pattern batsql.nth_value(X_0:any_1, 
X_1:bat[:lng], X_2:any, X_3:any, X_4:int, X_5:any, X_6:any):bat[:any_1] ", 
"SQLnth_value;",        "return the nth value of each group"    ]
 [ "batsql",    "nth_value",    "pattern batsql.nth_value(X_0:bat[:any_1], 
X_1:bat[:lng], X_2:any, X_3:any, X_4:int, X_5:any, X_6:any):bat[:any_1] ",   
"SQLnth_value;",        "return the nth value of each group"    ]
 [ "batsql",    "nth_value",    "pattern batsql.nth_value(X_0:bat[:any_1], 
X_1:lng, X_2:any, X_3:any, X_4:int, X_5:any, X_6:any):bat[:any_1] ", 
"SQLnth_value;",        "return the nth value of each group"    ]
@@ -5150,13 +5147,6 @@ stdout of test 'MAL-signatures` in direc
 [ "batsql",    "prod", "pattern batsql.prod(X_0:bat[:lng], X_1:any, X_2:any, 
X_3:int, X_4:any, X_5:any):bat[:lng] ",   "SQLprod;",     "return the product 
of groups"  ]
 [ "batsql",    "prod", "pattern batsql.prod(X_0:bat[:sht], X_1:any, X_2:any, 
X_3:int, X_4:any, X_5:any):bat[:lng] ",   "SQLprod;",     "return the product 
of groups"  ]
 [ "batsql",    "rank", "pattern batsql.rank(X_0:bat[:any_1], X_1:any_2, 
X_2:any_3):bat[:int] ",        "SQLrank;",     "return the ranked groups"      ]
-[ "batsql",    "restart",      "unsafe pattern batsql.restart(X_0:bat[:str], 
X_1:bat[:str], X_2:bat[:lng]):bat[:lng] ",        "mvc_bat_restart_seq;", 
"restart the sequence with value start" ]
-[ "batsql",    "restart",      "unsafe pattern batsql.restart(X_0:bat[:str], 
X_1:bat[:str], X_2:lng):bat[:lng] ",      "mvc_bat_restart_seq;", "restart the 
sequence with value start" ]
-[ "batsql",    "restart",      "unsafe pattern batsql.restart(X_0:bat[:str], 
X_1:str, X_2:bat[:lng]):bat[:lng] ",      "mvc_bat_restart_seq;", "restart the 
sequence with value start" ]
-[ "batsql",    "restart",      "unsafe pattern batsql.restart(X_0:bat[:str], 
X_1:str, X_2:lng):bat[:lng] ",    "mvc_bat_restart_seq;", "restart the sequence 
with value start" ]
-[ "batsql",    "restart",      "unsafe pattern batsql.restart(X_0:str, 
X_1:bat[:str], X_2:bat[:lng]):bat[:lng] ",      "mvc_bat_restart_seq;", 
"restart the sequence with value start" ]
-[ "batsql",    "restart",      "unsafe pattern batsql.restart(X_0:str, 
X_1:bat[:str], X_2:lng):bat[:lng] ",    "mvc_bat_restart_seq;", "restart the 
sequence with value start" ]
-[ "batsql",    "restart",      "unsafe pattern batsql.restart(X_0:str, 
X_1:str, X_2:bat[:lng]):bat[:lng] ",    "mvc_bat_restart_seq;", "restart the 
sequence with value start" ]
 [ "batsql",    "row_number",   "pattern batsql.row_number(X_0:bat[:any_1], 
X_1:any_2, X_2:any_3):bat[:int] ",  "SQLrow_number;",       "return the 
row_numer-ed groups"        ]
 [ "batsql",    "stdev",        "pattern batsql.stdev(X_0:bat[:bte], X_1:any, 
X_2:any, X_3:int, X_4:any, X_5:any):bat[:dbl] ",  "SQLstddev_samp;",      
"return the standard deviation sample of groups"        ]
 [ "batsql",    "stdev",        "pattern batsql.stdev(X_0:bat[:dbl], X_1:any, 
X_2:any, X_3:int, X_4:any, X_5:any):bat[:dbl] ",  "SQLstddev_samp;",      
"return the standard deviation sample of groups"        ]
@@ -7147,7 +7137,7 @@ stdout of test 'MAL-signatures` in direc
 [ "fits",      "listdir",      "unsafe pattern fits.listdir(X_0:str):void ",   
"FITSdir;",     "Attach all FITS files in the directory"        ]
 [ "fits",      "listdirpattern",       "unsafe pattern 
fits.listdirpattern(X_0:str, X_1:str):void ",   "FITSdirpat;",  "Attach all 
FITS file in the directory, giving a pattern"       ]
 [ "fits",      "load", "unsafe pattern fits.load(X_0:str):void ",      
"FITSloadTable;",       "Load a FITS table from an attached file"       ]
-[ "for",       "compress",     "pattern for.compress(X_0:str, X_1:str, 
X_2:str):void ",        "FORcompress_col;",     "compress a sql column"]
+[ "for",       "compress",     "pattern for.compress(X_0:str, X_1:str, 
X_2:str):void ",        "FORcompress_col;",     "compress a sql column" ]
 [ "for",       "decompress",   "pattern for.decompress(X_0:bat[:any], 
X_1:any_1):bat[:any_1] ",        "FORdecompress;",       "decompress a for 
compressed (sub)column"       ]
 [ "generator", "join", "pattern generator.join(X_0:bat[:bte], X_1:bat[:bte]) 
(X_2:bat[:oid], X_3:bat[:oid]) ", "VLTgenerator_join;",   ""      ]
 [ "generator", "join", "pattern generator.join(X_0:bat[:dbl], X_1:bat[:dbl]) 
(X_2:bat[:oid], X_3:bat[:oid]) ", "VLTgenerator_join;",   "Overloaded join 
operation"     ]
@@ -7530,6 +7520,8 @@ stdout of test 'MAL-signatures` in direc
 [ "logging",   "setflushlevel",        "unsafe command 
logging.setflushlevel(X_0:str):void ",  "TRACERset_flush_level;",       "Sets 
the flush level"  ]
 [ "logging",   "setlayerlevel",        "unsafe command 
logging.setlayerlevel(X_0:str, X_1:str):void ", "TRACERset_layer_level;",       
"Sets the log level for a specific layer"       ]
 [ "mal",       "manifold",     "pattern mal.manifold(X_0:str, X_1:str, 
X_2:any...):bat[:any] ",        "MANIFOLDevaluate;",    ""      ]
+[ "mal",       "multiplex",    "pattern mal.multiplex(X_0:lng, X_1:str, 
X_2:str):any... ",     "MANIFOLDremapMultiplex;",      ""      ]
+[ "mal",       "multiplex",    "pattern mal.multiplex(X_0:lng, X_1:str, 
X_2:str, X_3:any...):any... ", "MANIFOLDremapMultiplex;",      ""      ]
 [ "mal",       "multiplex",    "pattern mal.multiplex(X_0:str, X_1:str, 
X_2:any...):any... ",  "MANIFOLDremapMultiplex;",      ""      ]
 [ "manual",    "functions",    "pattern manual.functions() (X_0:bat[:str], 
X_1:bat[:str], X_2:bat[:str], X_3:bat[:str], X_4:bat[:str]) ",      
"MANUALcreateOverview;",        "Produces a table with all MAL functions known" 
]
 [ "mapi",      "bind", "pattern mapi.bind(X_0:int, X_1:str):bat[:any_2] ",     
"SERVERbindBAT;",       "Bind a remote variable to a local one."        ]
@@ -8049,7 +8041,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "ms_trunc",     "command sql.ms_trunc(X_0:dbl, X_1:int):dbl ",  
"dbl_trunc_wrap;",      "truncate the floating point v to r digits behind the 
dot (if r < 0, before the dot)"   ]
 [ "sql",       "ms_trunc",     "command sql.ms_trunc(X_0:flt, X_1:int):flt ",  
"flt_trunc_wrap;",      "truncate the floating point v to r digits behind the 
dot (if r < 0, before the dot)"   ]
 [ "sql",       "mvc",  "pattern sql.mvc():int ",       "SQLmvc;",      "Get 
the multiversion catalog context. \nNeeded for correct statement 
dependencies\n(ie sql.update, should be after sql.bind in concurrent 
execution)"  ]
-[ "sql",       "next_value",   "pattern sql.next_value(X_0:str, X_1:str):lng 
",        "mvc_next_value;",      "return the next value of the sequence" ]
+[ "sql",       "next_value",   "unsafe pattern sql.next_value(X_0:str, 
X_1:str):lng ", "mvc_next_value;",      "return the next value of the sequence" 
]
 [ "sql",       "nth_value",    "pattern sql.nth_value(X_0:any_1, X_1:lng, 
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):any_1 ",        "SQLnth_value;",   
     "return the nth value of each group"    ]
 [ "sql",       "ntile",        "pattern sql.ntile(X_0:any, X_1:any_1, X_2:bit, 
X_3:bit):any_1 ",       "SQLntile;",    "return the groups divided as equally 
as possible"      ]
 [ "sql",       "optimizer_updates",    "pattern sql.optimizer_updates():void 
",        "SQLoptimizersUpdate;", ""      ]
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
@@ -7132,6 +7132,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batmtime",  "year", "pattern batmtime.year(X_0:bat[:timestamp], 
X_1:bat[:oid]):bat[:int] ", "MTIMEtimestamp_year_bulk;",    ""      ]
 [ "batpcre",   "replace",      "command batpcre.replace(X_0:bat[:str], 
X_1:str, X_2:str, X_3:str):bat[:str] ", "PCREreplace_bat_wrap;",        ""      
]
 [ "batpcre",   "replace_first",        "command 
batpcre.replace_first(X_0:bat[:str], X_1:str, X_2:str, X_3:str):bat[:str] ",   
"PCREreplacefirst_bat_wrap;",   ""      ]
+[ "batpyapi3", "eval", "unsafe pattern batpyapi3.eval(X_0:lng, X_1:ptr, 
X_2:str):any... ",     "PYAPI3PyAPIevalStd;",  "Execute a simple Python script 
value"  ]
 [ "batpyapi3", "eval", "unsafe pattern batpyapi3.eval(X_0:ptr, X_1:str, 
X_2:any...):any... ",  "PYAPI3PyAPIevalStd;",  "Execute a simple Python script 
value"  ]
 [ "batpyapi3", "eval_aggr",    "unsafe pattern batpyapi3.eval_aggr(X_0:ptr, 
X_1:str, X_2:any...):any... ",     "PYAPI3PyAPIevalAggr;", "grouped aggregates 
through Python"     ]
 [ "batpyapi3", "eval_loader",  "unsafe pattern batpyapi3.eval_loader(X_0:ptr, 
X_1:str):any... ",       "PYAPI3PyAPIevalLoader;",       "loader functions 
through Python"       ]
@@ -7140,6 +7141,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batpyapi3map",      "eval", "pattern batpyapi3map.eval(X_0:ptr, X_1:str, 
X_2:any...):any... ",      "PYAPI3PyAPIevalStdMap;",       "Execute a simple 
Python script value"  ]
 [ "batpyapi3map",      "eval_aggr",    "pattern 
batpyapi3map.eval_aggr(X_0:ptr, X_1:str, X_2:any...):any... ", 
"PYAPI3PyAPIevalAggrMap;",      "grouped aggregates through Python"     ]
 [ "batpyapi3map",      "subeval_aggr", "pattern 
batpyapi3map.subeval_aggr(X_0:ptr, X_1:str, X_2:any...):any... ",      
"PYAPI3PyAPIevalAggrMap;",      "grouped aggregates through Python"     ]
+[ "batrapi",   "eval", "pattern batrapi.eval(X_0:lng, X_1:ptr, X_2:str):any... 
",      "RAPIevalStd;", "Execute a simple R script value"       ]
 [ "batrapi",   "eval", "pattern batrapi.eval(X_0:ptr, X_1:str, 
X_2:any...):any... ",   "RAPIevalStd;", "Execute a simple R script value"       
]
 [ "batrapi",   "eval_aggr",    "pattern batrapi.eval_aggr(X_0:ptr, X_1:str, 
X_2:any...):any... ",      "RAPIevalAggr;",        "grouped aggregates through 
R"  ]
 [ "batrapi",   "subeval_aggr", "pattern batrapi.subeval_aggr(X_0:ptr, X_1:str, 
X_2:any...):any... ",   "RAPIevalAggr;",        "grouped aggregates through R"  
]
@@ -7242,9 +7244,6 @@ stdout of test 'MAL-signatures` in direc
 [ "batsql",    "diff", "pattern batsql.diff(X_0:bat[:bit], 
X_1:bat[:any_1]):bat[:bit] ",       "SQLdiff;",     "return true if cur != prev 
row"        ]
 [ "batsql",    "diff", "pattern batsql.diff(X_0:bit, 
X_1:bat[:any_1]):bat[:bit] ",     "SQLdiff;",     "return true if cur != prev 
row"        ]
 [ "batsql",    "first_value",  "pattern batsql.first_value(X_0:bat[:any_1], 
X_1:any, X_2:any, X_3:int, X_4:any, X_5:any):bat[:any_1] ",        
"SQLfirst_value;",      "return the first value of groups"      ]
-[ "batsql",    "get_value",    "pattern batsql.get_value(X_0:bat[:str], 
X_1:bat[:str]):bat[:lng] ",    "mvc_bat_get_value;",   "return the current 
value of sequences" ]
-[ "batsql",    "get_value",    "pattern batsql.get_value(X_0:bat[:str], 
X_1:str):bat[:lng] ",  "mvc_bat_get_value;",   "return the current value of the 
sequence"      ]
-[ "batsql",    "get_value",    "pattern batsql.get_value(X_0:str, 
X_1:bat[:str]):bat[:lng] ",  "mvc_bat_get_value;",   "return the current value 
of sequences" ]
 [ "batsql",    "lag",  "pattern batsql.lag(X_0:any_1, X_1:any, 
X_2:bat[:any_1], X_3:any_2, X_4:any_3):bat[:any_1] ",   "SQLlag;",      "return 
the value in the previous 'l' row in the partition or 'd' if non existent"      
]
 [ "batsql",    "lag",  "pattern batsql.lag(X_0:any_1, X_1:bat[:any], 
X_2:any_1, X_3:any_2, X_4:any_3):bat[:any_1] ",   "SQLlag;",      "return the 
value in the previous 'l' row in the partition or 'd' if non existent"      ]
 [ "batsql",    "lag",  "pattern batsql.lag(X_0:any_1, X_1:bat[:any], 
X_2:any_2, X_3:any_3):bat[:any_1] ",      "SQLlag;",      "return the value in 
the previous 'l' row in the partition or NULL if non existent"     ]
@@ -7270,9 +7269,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batsql",    "lead", "pattern batsql.lead(X_0:bat[:any_1], X_1:bat[:any], 
X_2:bat[:any_1], X_3:any_2, X_4:any_3):bat[:any_1] ",      "SQLlead;",     
"return the value in the next 'l' row in the partition or 'd' if non existent"  
]
 [ "batsql",    "max",  "pattern batsql.max(X_0:bat[:any_1], X_1:any, X_2:any, 
X_3:int, X_4:any, X_5:any):bat[:any_1] ",        "SQLmax;",      "return the 
maximum of groups"  ]
 [ "batsql",    "min",  "pattern batsql.min(X_0:bat[:any_1], X_1:any, X_2:any, 
X_3:int, X_4:any, X_5:any):bat[:any_1] ",        "SQLmin;",      "return the 
minimum of groups"  ]
-[ "batsql",    "next_value",   "pattern batsql.next_value(X_0:bat[:str], 
X_1:bat[:str]):bat[:lng] ",   "mvc_bat_next_value;",  "return the next value of 
sequences"    ]
-[ "batsql",    "next_value",   "pattern batsql.next_value(X_0:bat[:str], 
X_1:str):bat[:lng] ", "mvc_bat_next_value;",  "return the next value of the 
sequence" ]
-[ "batsql",    "next_value",   "pattern batsql.next_value(X_0:str, 
X_1:bat[:str]):bat[:lng] ", "mvc_bat_next_value;",  "return the next value of 
sequences"    ]
+[ "batsql",    "next_value",   "unsafe pattern batsql.next_value(X_0:lng, 
X_1:str, X_2:str):bat[:lng] ",       "mvc_next_value_bulk;", "return the next 
value of the sequence" ]
 [ "batsql",    "nth_value",    "pattern batsql.nth_value(X_0:any_1, 
X_1:bat[:lng], X_2:any, X_3:any, X_4:int, X_5:any, X_6:any):bat[:any_1] ", 
"SQLnth_value;",        "return the nth value of each group"    ]
 [ "batsql",    "nth_value",    "pattern batsql.nth_value(X_0:bat[:any_1], 
X_1:bat[:lng], X_2:any, X_3:any, X_4:int, X_5:any, X_6:any):bat[:any_1] ",   
"SQLnth_value;",        "return the nth value of each group"    ]
 [ "batsql",    "nth_value",    "pattern batsql.nth_value(X_0:bat[:any_1], 
X_1:lng, X_2:any, X_3:any, X_4:int, X_5:any, X_6:any):bat[:any_1] ", 
"SQLnth_value;",        "return the nth value of each group"    ]
@@ -7294,13 +7291,6 @@ stdout of test 'MAL-signatures` in direc
 [ "batsql",    "prod", "pattern batsql.prod(X_0:bat[:sht], X_1:any, X_2:any, 
X_3:int, X_4:any, X_5:any):bat[:hge] ",   "SQLprod;",     "return the product 
of groups"  ]
 [ "batsql",    "prod", "pattern batsql.prod(X_0:bat[:sht], X_1:any, X_2:any, 
X_3:int, X_4:any, X_5:any):bat[:lng] ",   "SQLprod;",     "return the product 
of groups"  ]
 [ "batsql",    "rank", "pattern batsql.rank(X_0:bat[:any_1], X_1:any_2, 
X_2:any_3):bat[:int] ",        "SQLrank;",     "return the ranked groups"      ]
-[ "batsql",    "restart",      "unsafe pattern batsql.restart(X_0:bat[:str], 
X_1:bat[:str], X_2:bat[:lng]):bat[:lng] ",        "mvc_bat_restart_seq;", 
"restart the sequence with value start" ]
-[ "batsql",    "restart",      "unsafe pattern batsql.restart(X_0:bat[:str], 
X_1:bat[:str], X_2:lng):bat[:lng] ",      "mvc_bat_restart_seq;", "restart the 
sequence with value start" ]
-[ "batsql",    "restart",      "unsafe pattern batsql.restart(X_0:bat[:str], 
X_1:str, X_2:bat[:lng]):bat[:lng] ",      "mvc_bat_restart_seq;", "restart the 
sequence with value start" ]
-[ "batsql",    "restart",      "unsafe pattern batsql.restart(X_0:bat[:str], 
X_1:str, X_2:lng):bat[:lng] ",    "mvc_bat_restart_seq;", "restart the sequence 
with value start" ]
-[ "batsql",    "restart",      "unsafe pattern batsql.restart(X_0:str, 
X_1:bat[:str], X_2:bat[:lng]):bat[:lng] ",      "mvc_bat_restart_seq;", 
"restart the sequence with value start" ]
-[ "batsql",    "restart",      "unsafe pattern batsql.restart(X_0:str, 
X_1:bat[:str], X_2:lng):bat[:lng] ",    "mvc_bat_restart_seq;", "restart the 
sequence with value start" ]
-[ "batsql",    "restart",      "unsafe pattern batsql.restart(X_0:str, 
X_1:str, X_2:bat[:lng]):bat[:lng] ",    "mvc_bat_restart_seq;", "restart the 
sequence with value start" ]
 [ "batsql",    "row_number",   "pattern batsql.row_number(X_0:bat[:any_1], 
X_1:any_2, X_2:any_3):bat[:int] ",  "SQLrow_number;",       "return the 
row_numer-ed groups"        ]
 [ "batsql",    "stdev",        "pattern batsql.stdev(X_0:bat[:bte], X_1:any, 
X_2:any, X_3:int, X_4:any, X_5:any):bat[:dbl] ",  "SQLstddev_samp;",      
"return the standard deviation sample of groups"        ]
 [ "batsql",    "stdev",        "pattern batsql.stdev(X_0:bat[:dbl], X_1:any, 
X_2:any, X_3:int, X_4:any, X_5:any):bat[:dbl] ",  "SQLstddev_samp;",      
"return the standard deviation sample of groups"        ]
@@ -10026,10 +10016,10 @@ stdout of test 'MAL-signatures` in direc
 [ "fits",      "attach",       "unsafe pattern fits.attach(X_0:str):void ",    
"FITSattach;",  "Open a FITS file and return catalog of the table HDUs" ]
 [ "fits",      "export",       "pattern fits.export(X_0:str):void ",   
"FITSexportTable;",     "Export a table to a FITS file" ]
 [ "fits",      "fitstest",     "command fits.fitstest(X_0:str):int ",  
"FITStest;",    "Returns the type of first extension in the FITS file filename" 
]
-[ "fits",      "listdir",      "pattern fits.listdir(X_0:str):void ",  
"FITSdir;",     "Attach all FITS files in the directory"        ]
-[ "fits",      "listdirpattern",       "pattern fits.listdirpattern(X_0:str, 
X_1:str):void ",  "FITSdirpat;",  "Attach all FITS file in the directory, 
giving a pattern"       ]
-[ "fits",      "load", "pattern fits.load(X_0:str):void ",     
"FITSloadTable;",       "Load a FITS table from an attached file"       ]
-[ "for",       "compress",     "pattern for.compress(X_0:str, X_1:str, 
X_2:str):void ",        "FORcompress_col;",     "compress a sql column"]
+[ "fits",      "listdir",      "unsafe pattern fits.listdir(X_0:str):void ",   
"FITSdir;",     "Attach all FITS files in the directory"        ]
+[ "fits",      "listdirpattern",       "unsafe pattern 
fits.listdirpattern(X_0:str, X_1:str):void ",   "FITSdirpat;",  "Attach all 
FITS file in the directory, giving a pattern"       ]
+[ "fits",      "load", "unsafe pattern fits.load(X_0:str):void ",      
"FITSloadTable;",       "Load a FITS table from an attached file"       ]
+[ "for",       "compress",     "pattern for.compress(X_0:str, X_1:str, 
X_2:str):void ",        "FORcompress_col;",     "compress a sql column" ]
 [ "for",       "decompress",   "pattern for.decompress(X_0:bat[:any], 
X_1:any_1):bat[:any_1] ",        "FORdecompress;",       "decompress a for 
compressed (sub)column"       ]
 [ "generator", "join", "pattern generator.join(X_0:bat[:bte], X_1:bat[:bte]) 
(X_2:bat[:oid], X_3:bat[:oid]) ", "VLTgenerator_join;",   ""      ]
 [ "generator", "join", "pattern generator.join(X_0:bat[:dbl], X_1:bat[:dbl]) 
(X_2:bat[:oid], X_3:bat[:oid]) ", "VLTgenerator_join;",   "Overloaded join 
operation"     ]
@@ -10425,6 +10415,8 @@ stdout of test 'MAL-signatures` in direc
 [ "logging",   "setflushlevel",        "unsafe command 
logging.setflushlevel(X_0:str):void ",  "TRACERset_flush_level;",       "Sets 
the flush level"  ]
 [ "logging",   "setlayerlevel",        "unsafe command 
logging.setlayerlevel(X_0:str, X_1:str):void ", "TRACERset_layer_level;",       
"Sets the log level for a specific layer"       ]
 [ "mal",       "manifold",     "pattern mal.manifold(X_0:str, X_1:str, 
X_2:any...):bat[:any] ",        "MANIFOLDevaluate;",    ""      ]
+[ "mal",       "multiplex",    "pattern mal.multiplex(X_0:lng, X_1:str, 
X_2:str):any... ",     "MANIFOLDremapMultiplex;",      ""      ]
+[ "mal",       "multiplex",    "pattern mal.multiplex(X_0:lng, X_1:str, 
X_2:str, X_3:any...):any... ", "MANIFOLDremapMultiplex;",      ""      ]
 [ "mal",       "multiplex",    "pattern mal.multiplex(X_0:str, X_1:str, 
X_2:any...):any... ",  "MANIFOLDremapMultiplex;",      ""      ]
 [ "manual",    "functions",    "pattern manual.functions() (X_0:bat[:str], 
X_1:bat[:str], X_2:bat[:str], X_3:bat[:str], X_4:bat[:str]) ",      
"MANUALcreateOverview;",        "Produces a table with all MAL functions known" 
]
 [ "mapi",      "bind", "pattern mapi.bind(X_0:int, X_1:str):bat[:any_2] ",     
"SERVERbindBAT;",       "Bind a remote variable to a local one."        ]
@@ -10950,7 +10942,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "ms_trunc",     "command sql.ms_trunc(X_0:dbl, X_1:int):dbl ",  
"dbl_trunc_wrap;",      "truncate the floating point v to r digits behind the 
dot (if r < 0, before the dot)"   ]
 [ "sql",       "ms_trunc",     "command sql.ms_trunc(X_0:flt, X_1:int):flt ",  
"flt_trunc_wrap;",      "truncate the floating point v to r digits behind the 
dot (if r < 0, before the dot)"   ]
 [ "sql",       "mvc",  "pattern sql.mvc():int ",       "SQLmvc;",      "Get 
the multiversion catalog context. \nNeeded for correct statement 
dependencies\n(ie sql.update, should be after sql.bind in concurrent 
execution)"  ]
-[ "sql",       "next_value",   "pattern sql.next_value(X_0:str, X_1:str):lng 
",        "mvc_next_value;",      "return the next value of the sequence" ]
+[ "sql",       "next_value",   "unsafe pattern sql.next_value(X_0:str, 
X_1:str):lng ", "mvc_next_value;",      "return the next value of the sequence" 
]
 [ "sql",       "nth_value",    "pattern sql.nth_value(X_0:any_1, X_1:lng, 
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):any_1 ",        "SQLnth_value;",   
     "return the nth value of each group"    ]
 [ "sql",       "ntile",        "pattern sql.ntile(X_0:any, X_1:any_1, X_2:bit, 
X_3:bit):any_1 ",       "SQLntile;",    "return the groups divided as equally 
as possible"      ]
 [ "sql",       "optimizer_updates",    "pattern sql.optimizer_updates():void 
",        "SQLoptimizersUpdate;", ""      ]
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -3297,9 +3297,10 @@ BATgroupsize(BAT *b, BAT *g, BAT *e, BAT
                                i = canditer_next(ci) - hseq;   \
                                if (!skip_nils ||                       \
                                    !is_##TYPE##_nil(vals[i])) {        \
-                                       oids[gid++] = i + hseq;         \
+                                       oids[gid] = i + hseq;           \
                                        nils--;                         \
                                }                                       \
+                               gid++;                                  \
                        }                                               \
                        TIMEOUT_CHECK(timeoffset,                       \
                                      TIMEOUT_HANDLER(BUN_NONE));       \
@@ -3419,9 +3420,10 @@ do_groupmin(oid *restrict oids, BATiter 
                                i = canditer_next(ci) - hseq;
                                if (!skip_nils ||
                                    (*atomcmp)(BUNtail(*bi, i), nil) != 0) {
-                                       oids[gid++] = i + hseq;
+                                       oids[gid] = i + hseq;
                                        nils--;
                                }
+                               gid++;
                        }
                        TIMEOUT_CHECK(timeoffset,
                                      TIMEOUT_HANDLER(BUN_NONE));
@@ -3549,9 +3551,10 @@ do_groupmax(oid *restrict oids, BATiter 
                                i = canditer_next(ci) - hseq;
                                if (!skip_nils ||
                                    (*atomcmp)(BUNtail(*bi, i), nil) != 0) {
-                                       oids[gid++] = i + hseq;
+                                       oids[gid] = i + hseq;
                                        nils--;
                                }
+                               gid++;
                        }
                        TIMEOUT_CHECK(timeoffset,
                                      TIMEOUT_HANDLER(BUN_NONE));
diff --git a/gdk/gdk_string.c b/gdk/gdk_string.c
--- a/gdk/gdk_string.c
+++ b/gdk/gdk_string.c
@@ -1091,9 +1091,12 @@ BATstr_group_concat(ValPtr res, BAT *b, 
        BUN ncand;
        struct canditer ci1 = {0}, ci2 = {0};
        oid bhseq = b->hseqbase, shseq = sep ? sep->hseqbase : 0;
+       gdk_return r = GDK_SUCCEED;
+       bool free_nseparator = false;
+       char *nseparator = (char *)separator;
 
        (void) abort_on_error;
-       assert((separator && !sep) || (!separator && sep)); /* only one of them 
must be set */
+       assert((nseparator && !sep) || (!nseparator && sep)); /* only one of 
them must be set */
        res->vtype = TYPE_str;
 
        ncand = canditer_init(&ci1, b, s1);
@@ -1107,20 +1110,28 @@ BATstr_group_concat(ValPtr res, BAT *b, 
                if (ncand2 == 1) { /* Only one element in sep */
                        BATiter bi = bat_iterator(sep);
                        BUN p = canditer_next(&ci2) - shseq;
-                       separator = BUNtvar(bi, p);
+                       nseparator = GDKstrdup(BUNtvar(bi, p));
                        bat_iterator_end(&bi);
+                       if (!nseparator)
+                               return GDK_FAIL;
+                       free_nseparator = true;
                        sep = NULL;
                }
        }
 
-       if (ncand == 0 || (separator && strNil(separator))) {
+       if (ncand == 0 || (nseparator && strNil(nseparator))) {
                if (VALinit(res, TYPE_str, nil_if_empty ? str_nil : "") == NULL)
-                       return GDK_FAIL;
-               return GDK_SUCCEED;
+                       r = GDK_FAIL;
+               if (free_nseparator)
+                       GDKfree(nseparator);
+               return r;
        }
 
-       return concat_strings(NULL, res, b, bhseq, 1, &ci1, &ci2, ncand, NULL, 
0, 0,
-                             skip_nils, sep, shseq, separator, NULL);
+       r = concat_strings(NULL, res, b, bhseq, 1, &ci1, &ci2, ncand, NULL, 0, 
0,
+                             skip_nils, sep, shseq, nseparator, NULL);
+       if (free_nseparator)
+               GDKfree(nseparator);
+       return r;
 }
 
 BAT *
@@ -1133,8 +1144,10 @@ BATgroupstr_group_concat(BAT *b, BAT *g,
        struct canditer ci1 = {0}, ci2 = {0};
        const char *err;
        gdk_return res;
+       bool free_nseparator = false;
+       char *nseparator = (char *)separator;
 
-       assert((separator && !sep) || (!separator && sep)); /* only one of them 
must be set */
+       assert((nseparator && !sep) || (!nseparator && sep)); /* only one of 
them must be set */
        (void) skip_nils;
 
        if ((err = BATgroupaggrinit(b, g, e, s1, &min, &max, &ngrp,
@@ -1151,8 +1164,11 @@ BATgroupstr_group_concat(BAT *b, BAT *g,
                if (ncand2 == 1) { /* Only one element in sep */
                        BATiter bi = bat_iterator(sep);
                        BUN p = canditer_next(&ci2) - shseq;
-                       separator = BUNtvar(bi, p);
+                       nseparator = GDKstrdup(BUNtvar(bi, p));
                        bat_iterator_end(&bi);
+                       if (!nseparator)
+                               return GDK_FAIL;
+                       free_nseparator = true;
                        sep = NULL;
                }
        } else if (g == NULL) {
@@ -1160,24 +1176,29 @@ BATgroupstr_group_concat(BAT *b, BAT *g,
                return NULL;
        }
 
-       if (ncand == 0 || ngrp == 0 || (separator && strNil(separator))) {
+       if (ncand == 0 || ngrp == 0 || (nseparator && strNil(nseparator))) {
                /* trivial: no strings to concat, so return bat
                 * aligned with g with nil in the tail */
-               return BATconstant(ngrp == 0 ? 0 : min, TYPE_str, str_nil, 
ngrp, TRANSIENT);
+               bn = BATconstant(ngrp == 0 ? 0 : min, TYPE_str, str_nil, ngrp, 
TRANSIENT);
+               goto done;
        }
 
        if (BATtdense(g) || (g->tkey && g->tnonil)) {
                /* trivial: singleton groups, so all results are equal
                 * to the inputs (but possibly a different type) */
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to