Changeset: b5d6f0e3ae7a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b5d6f0e3ae7a
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/server/rel_optimizer.c
Branch: unlock
Log Message:

merged


diffs (truncated from 1216 to 300 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -5383,16 +5383,22 @@ static mel_func sql_init_funcs[] = {
  pattern("calc", "timestamp", str_2time_timestamptz, false, "cast to timestamp 
and check for overflow", args(1,4, 
arg("",timestamp),arg("v",str),arg("digits",int),arg("has_tz",int))),
  pattern("calc", "timestamp", timestamp_2time_timestamp, false, "cast 
timestamp to timestamp and check for overflow", args(1,3, 
arg("",timestamp),arg("v",timestamp),arg("digits",int))),
  command("batcalc", "timestamp", batstr_2time_timestamp, false, "cast to 
timestamp and check for overflow", args(1,3, 
batarg("",timestamp),batarg("v",str),arg("digits",int))),
+ command("batcalc", "timestamp", batstr_2time_timestamp_cand, false, "cast to 
timestamp and check for overflow", args(1,4, 
batarg("",timestamp),batarg("v",str),batarg("s",oid),arg("digits",int))),
  command("batcalc", "timestamp", batstr_2time_timestamptz, false, "cast to 
timestamp and check for overflow", args(1,4, 
batarg("",timestamp),batarg("v",str),arg("digits",int),arg("has_tz",int))),
+ command("batcalc", "timestamp", batstr_2time_timestamptz_cand, false, "cast 
to timestamp and check for overflow", args(1,5, 
batarg("",timestamp),batarg("v",str),batarg("s",oid),arg("digits",int),arg("has_tz",int))),
  pattern("batcalc", "timestamp", timestamp_2time_timestamp, false, "cast 
timestamp to timestamp and check for overflow", args(1,3, 
batarg("",timestamp),batarg("v",timestamp),arg("digits",int))),
+ pattern("batcalc", "timestamp", timestamp_2time_timestamp, false, "cast 
timestamp to timestamp and check for overflow", args(1,4, 
batarg("",timestamp),batarg("v",timestamp),batarg("s",oid),arg("digits",int))),
  pattern("calc", "daytime", nil_2time_daytime, false, "cast to daytime and 
check for overflow", args(1,3, 
arg("",daytime),arg("v",void),arg("digits",int))),
  pattern("batcalc", "daytime", nil_2time_daytime, false, "cast to daytime and 
check for overflow", args(1,3, 
batarg("",daytime),batarg("v",oid),arg("digits",int))),
  pattern("calc", "daytime", str_2time_daytime, false, "cast to daytime and 
check for overflow", args(1,3, arg("",daytime),arg("v",str),arg("digits",int))),
  pattern("calc", "daytime", str_2time_daytimetz, false, "cast to daytime and 
check for overflow", args(1,4, 
arg("",daytime),arg("v",str),arg("digits",int),arg("has_tz",int))),
  pattern("calc", "daytime", daytime_2time_daytime, false, "cast daytime to 
daytime and check for overflow", args(1,3, 
arg("",daytime),arg("v",daytime),arg("digits",int))),
  command("batcalc", "daytime", batstr_2time_daytime, false, "cast to daytime 
and check for overflow", args(1,3, 
batarg("",daytime),batarg("v",str),arg("digits",int))),
- pattern("batcalc", "daytime", str_2time_daytimetz, false, "cast daytime to 
daytime and check for overflow", args(1,3, 
batarg("",daytime),batarg("v",daytime),arg("digits",int))),
+ command("batcalc", "daytime", batstr_2time_daytime_cand, false, "cast to 
daytime and check for overflow", args(1,4, 
batarg("",daytime),batarg("v",str),batarg("s",oid),arg("digits",int))),
+ pattern("batcalc", "daytime", str_2time_daytimetz, false, "cast daytime to 
daytime and check for overflow", args(1,4, 
batarg("",daytime),batarg("v",daytime),arg("digits",int),arg("has_tz",int))),
+ pattern("batcalc", "daytime", str_2time_daytimetz, false, "cast daytime to 
daytime and check for overflow", args(1,5, 
batarg("",daytime),batarg("v",daytime),batarg("s",oid),arg("digits",int),arg("has_tz",int))),
  pattern("batcalc", "daytime", daytime_2time_daytime, false, "cast daytime to 
daytime and check for overflow", args(1,3, 
batarg("",daytime),batarg("v",daytime),arg("digits",int))),
+ pattern("batcalc", "daytime", daytime_2time_daytime, false, "cast daytime to 
daytime and check for overflow", args(1,4, 
batarg("",daytime),batarg("v",daytime),batarg("s",oid),arg("digits",int))),
  command("sql", "date_trunc", bat_date_trunc, false, "Truncate a timestamp to 
(millennium, century,decade,year,quarter,month,week,day,hour,minute,second, 
milliseconds,microseconds)", args(1,3, 
batarg("",timestamp),arg("scale",str),batarg("v",timestamp))),
  command("sql", "date_trunc", date_trunc, false, "Truncate a timestamp to 
(millennium, century,decade,year,quarter,month,week,day,hour,minute,second, 
milliseconds,microseconds)", args(1,3, 
arg("",timestamp),arg("scale",str),arg("v",timestamp))),
  pattern("sql", "current_time", SQLcurrent_daytime, false, "Get the clients 
current daytime", args(1,1, arg("",daytime))),
@@ -5401,6 +5407,7 @@ static mel_func sql_init_funcs[] = {
  pattern("batcalc", "date", nil_2_date, false, "cast to date", args(1,2, 
batarg("",date),batarg("v",oid))),
  pattern("calc", "date", str_2_date, false, "cast to date", args(1,2, 
arg("",date),arg("v",str))),
  command("batcalc", "date", batstr_2_date, false, "cast to date", args(1,2, 
batarg("",date),batarg("v",str))),
+ command("batcalc", "date", batstr_2_date_cand, false, "cast to date", 
args(1,3, batarg("",date),batarg("v",str),batarg("s",oid))),
  command("calc", "blob", str_2_blob, false, "cast to blob", args(1,2, 
arg("",blob),arg("v",str))),
  command("batcalc", "blob", batstr_2_blob, false, "cast to blob", args(1,2, 
batarg("",blob),batarg("v",str))),
  command("batcalc", "blob", batstr_2_blob_cand, false, "cast to blob", 
args(1,3, batarg("",blob),batarg("v",str),batarg("s",oid))),
@@ -5412,36 +5419,50 @@ static mel_func sql_init_funcs[] = {
  command("calc", "substring", STRsubstring, false, "", args(1,4, 
arg("",str),arg("s",str),arg("offset",int),arg("count",int))),
  pattern("calc", "month_interval", month_interval_str, false, "cast str to a 
month_interval and check for overflow", args(1,4, 
arg("",int),arg("v",str),arg("ek",int),arg("sk",int))),
  pattern("batcalc", "month_interval", month_interval_str, false, "cast str to 
a month_interval and check for overflow", args(1,4, 
batarg("",int),batarg("v",str),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "month_interval", month_interval_str, false, "cast str to 
a month_interval and check for overflow", args(1,5, 
batarg("",int),batarg("v",str),batarg("s",oid),arg("ek",int),arg("sk",int))),
  pattern("calc", "second_interval", second_interval_str, false, "cast str to a 
second_interval and check for overflow", args(1,4, 
arg("",lng),arg("v",str),arg("ek",int),arg("sk",int))),
  pattern("batcalc", "second_interval", second_interval_str, false, "cast str 
to a second_interval and check for overflow", args(1,4, 
batarg("",lng),batarg("v",str),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "second_interval", second_interval_str, false, "cast str 
to a second_interval and check for overflow", args(1,5, 
batarg("",lng),batarg("v",str),batarg("s",oid),arg("ek",int),arg("sk",int))),
  pattern("calc", "month_interval", month_interval, false, "cast bte to a 
month_interval and check for overflow", args(1,4, 
arg("",int),arg("v",bte),arg("ek",int),arg("sk",int))),
  pattern("batcalc", "month_interval", month_interval, false, "cast bte to a 
month_interval and check for overflow", args(1,4, 
batarg("",int),batarg("v",bte),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "month_interval", month_interval, false, "cast bte to a 
month_interval and check for overflow", args(1,5, 
batarg("",int),batarg("v",bte),batarg("s",oid),arg("ek",int),arg("sk",int))),
  pattern("calc", "second_interval", second_interval, false, "cast bte to a 
second_interval and check for overflow", args(1,4, 
arg("",lng),arg("v",bte),arg("ek",int),arg("sk",int))),
  pattern("batcalc", "second_interval", second_interval, false, "cast bte to a 
second_interval and check for overflow", args(1,4, 
batarg("",lng),batarg("v",bte),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "second_interval", second_interval, false, "cast bte to a 
second_interval and check for overflow", args(1,5, 
batarg("",lng),batarg("v",bte),batarg("s",oid),arg("ek",int),arg("sk",int))),
  pattern("calc", "month_interval", month_interval, false, "cast sht to a 
month_interval and check for overflow", args(1,4, 
arg("",int),arg("v",sht),arg("ek",int),arg("sk",int))),
  pattern("batcalc", "month_interval", month_interval, false, "cast sht to a 
month_interval and check for overflow", args(1,4, 
batarg("",int),batarg("v",sht),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "month_interval", month_interval, false, "cast sht to a 
month_interval and check for overflow", args(1,5, 
batarg("",int),batarg("v",sht),batarg("s",oid),arg("ek",int),arg("sk",int))),
  pattern("calc", "second_interval", second_interval, false, "cast sht to a 
second_interval and check for overflow", args(1,4, 
arg("",lng),arg("v",sht),arg("ek",int),arg("sk",int))),
  pattern("batcalc", "second_interval", second_interval, false, "cast sht to a 
second_interval and check for overflow", args(1,4, 
batarg("",lng),batarg("v",sht),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "second_interval", second_interval, false, "cast sht to a 
second_interval and check for overflow", args(1,5, 
batarg("",lng),batarg("v",sht),batarg("s",oid),arg("ek",int),arg("sk",int))),
  pattern("calc", "month_interval", month_interval, false, "cast int to a 
month_interval and check for overflow", args(1,4, 
arg("",int),arg("v",int),arg("ek",int),arg("sk",int))),
  pattern("batcalc", "month_interval", month_interval, false, "cast int to a 
month_interval and check for overflow", args(1,4, 
batarg("",int),batarg("v",int),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "month_interval", month_interval, false, "cast int to a 
month_interval and check for overflow", args(1,5, 
batarg("",int),batarg("v",int),batarg("s",oid),arg("ek",int),arg("sk",int))),
  pattern("calc", "second_interval", second_interval, false, "cast int to a 
second_interval and check for overflow", args(1,4, 
arg("",lng),arg("v",int),arg("ek",int),arg("sk",int))),
  pattern("batcalc", "second_interval", second_interval, false, "cast int to a 
second_interval and check for overflow", args(1,4, 
batarg("",lng),batarg("v",int),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "second_interval", second_interval, false, "cast int to a 
second_interval and check for overflow", args(1,5, 
batarg("",lng),batarg("v",int),batarg("s",oid),arg("ek",int),arg("sk",int))),
  pattern("calc", "month_interval", month_interval, false, "cast lng to a 
month_interval and check for overflow", args(1,4, 
arg("",int),arg("v",lng),arg("ek",int),arg("sk",int))),
  pattern("batcalc", "month_interval", month_interval, false, "cast lng to a 
month_interval and check for overflow", args(1,4, 
batarg("",int),batarg("v",lng),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "month_interval", month_interval, false, "cast lng to a 
month_interval and check for overflow", args(1,5, 
batarg("",int),batarg("v",lng),batarg("s",oid),arg("ek",int),arg("sk",int))),
  pattern("calc", "second_interval", second_interval, false, "cast lng to a 
second_interval and check for overflow", args(1,4, 
arg("",lng),arg("v",lng),arg("ek",int),arg("sk",int))),
  pattern("batcalc", "second_interval", second_interval, false, "cast lng to a 
second_interval and check for overflow", args(1,4, 
batarg("",lng),batarg("v",lng),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "second_interval", second_interval, false, "cast lng to a 
second_interval and check for overflow", args(1,5, 
batarg("",lng),batarg("v",lng),batarg("s",oid),arg("ek",int),arg("sk",int))), 
  pattern("calc", "rowid", sql_rowid, false, "return the next rowid", args(1,4, 
arg("",oid),argany("v",1),arg("schema",str),arg("table",str))),
  pattern("sql", "drop_hash", SQLdrop_hash, true, "Drop hash indices for the 
given table", args(0,2, arg("sch",str),arg("tbl",str))),
  pattern("sql", "prelude", SQLprelude, false, "", noargs),
  command("sql", "epilogue", SQLepilogue, false, "", noargs),
  pattern("calc", "second_interval", second_interval_daytime, false, "cast 
daytime to a second_interval and check for overflow", args(1,4, 
arg("",lng),arg("v",daytime),arg("ek",int),arg("sk",int))),
  pattern("batcalc", "second_interval", second_interval_daytime, false, "cast 
daytime to a second_interval and check for overflow", args(1,4, 
batarg("",lng),batarg("v",daytime),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "second_interval", second_interval_daytime, false, "cast 
daytime to a second_interval and check for overflow", args(1,5, 
batarg("",lng),batarg("v",daytime),batarg("s",oid),arg("ek",int),arg("sk",int))),
  pattern("calc", "daytime", second_interval_2_daytime, false, "cast 
second_interval to a daytime and check for overflow", args(1,3, 
arg("",daytime),arg("v",lng),arg("d",int))),
  pattern("batcalc", "daytime", second_interval_2_daytime, false, "cast 
second_interval to a daytime and check for overflow", args(1,3, 
batarg("",daytime),batarg("v",lng),arg("d",int))),
+ pattern("batcalc", "daytime", second_interval_2_daytime, false, "cast 
second_interval to a daytime and check for overflow", args(1,4, 
batarg("",daytime),batarg("v",lng),batarg("s",oid),arg("d",int))),
  pattern("calc", "daytime", timestamp_2_daytime, false, "cast timestamp to a 
daytime and check for overflow", args(1,3, 
arg("",daytime),arg("v",timestamp),arg("d",int))),
  pattern("batcalc", "daytime", timestamp_2_daytime, false, "cast timestamp to 
a daytime and check for overflow", args(1,3, 
batarg("",daytime),batarg("v",timestamp),arg("d",int))),
+ pattern("batcalc", "daytime", timestamp_2_daytime, false, "cast timestamp to 
a daytime and check for overflow", args(1,4, 
batarg("",daytime),batarg("v",timestamp),batarg("s",oid),arg("d",int))),
  pattern("calc", "timestamp", date_2_timestamp, false, "cast date to a 
timestamp and check for overflow", args(1,3, 
arg("",timestamp),arg("v",date),arg("d",int))),
  pattern("batcalc", "timestamp", date_2_timestamp, false, "cast date to a 
timestamp and check for overflow", args(1,3, 
batarg("",timestamp),batarg("v",date),arg("d",int))),
+ pattern("batcalc", "timestamp", date_2_timestamp, false, "cast date to a 
timestamp and check for overflow", args(1,4, 
batarg("",timestamp),batarg("v",date),batarg("s",oid),arg("d",int))),
  command("calc", "index", STRindex_bte, false, "Return the offsets as an index 
bat", args(1,3, arg("",bte),arg("v",str),arg("u",bit))),
  command("batcalc", "index", BATSTRindex_bte, false, "Return the offsets as an 
index bat", args(1,3, batarg("",bte),batarg("v",str),arg("u",bit))),
  command("calc", "index", STRindex_sht, false, "Return the offsets as an index 
bat", args(1,3, arg("",sht),arg("v",str),arg("u",bit))),
@@ -6162,17 +6183,17 @@ static mel_func sql_init_funcs[] = {
  command("batsql", "round", hge_bat_round_wrap, false, "round off the decimal 
v(d,s) to r digits behind the dot (if r < 0, before the dot)", args(1,5, 
batarg("",hge),batarg("v",hge),arg("d",int),arg("s",int),arg("r",bte))),
  command("calc", "second_interval", hge_dec2second_interval, false, "cast hge 
decimal to a second_interval", args(1,5, 
arg("",lng),arg("sc",int),arg("v",hge),arg("ek",int),arg("sk",int))),
  command("batcalc", "second_interval", hge_batdec2second_interval, false, 
"cast hge decimal to a second_interval", args(1,5, 
batarg("",lng),arg("sc",int),batarg("v",hge),arg("ek",int),arg("sk",int))),
- command("batcalc", "second_interval", hge_batdec2second_interval, false, 
"cast hge decimal to a second_cand_interval", args(1,6, 
batarg("",lng),arg("sc",int),batarg("v",hge),batarg("s",oid),arg("ek",int),arg("sk",int))),
+ command("batcalc", "second_interval", hge_batdec2second_interval, false, 
"cast hge decimal to a second_interval", args(1,6, 
batarg("",lng),arg("sc",int),batarg("v",hge),batarg("s",oid),arg("ek",int),arg("sk",int))),
  command("calc", "hge", nil_2dec_hge, false, "cast to dec(hge) and check for 
overflow", args(1,4, 
arg("",hge),arg("v",void),arg("digits",int),arg("scale",int))),
  command("batcalc", "hge", batnil_2dec_hge, false, "cast to dec(hge) and check 
for overflow", args(1,4, 
batarg("",hge),batarg("v",void),arg("digits",int),arg("scale",int))),
  command("calc", "hge", str_2dec_hge, false, "cast to dec(hge) and check for 
overflow", args(1,4, 
arg("",hge),arg("v",str),arg("digits",int),arg("scale",int))),
  command("batcalc", "hge", batstr_2dec_hge, false, "cast to dec(hge) and check 
for overflow", args(1,4, 
batarg("",hge),batarg("v",str),arg("digits",int),arg("scale",int))),
  pattern("calc", "month_interval", month_interval, false, "cast hge to a 
month_interval and check for overflow", args(1,4, 
arg("",int),arg("v",hge),arg("ek",int),arg("sk",int))),
  pattern("batcalc", "month_interval", month_interval, false, "cast hge to a 
month_interval and check for overflow", args(1,4, 
batarg("",int),batarg("v",hge),arg("ek",int),arg("sk",int))),
- pattern("batcalc", "month_interval", month_interval, false, "cast hge to a 
month_cand_interval and check for overflow", args(1,5, 
batarg("",int),batarg("v",hge),batarg("s",oid),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "month_interval", month_interval, false, "cast hge to a 
month_interval and check for overflow", args(1,5, 
batarg("",int),batarg("v",hge),batarg("s",oid),arg("ek",int),arg("sk",int))),
  pattern("calc", "second_interval", second_interval, false, "cast hge to a 
second_interval and check for overflow", args(1,4, 
arg("",lng),arg("v",hge),arg("ek",int),arg("sk",int))),
  pattern("batcalc", "second_interval", second_interval, false, "cast hge to a 
second_interval and check for overflow", args(1,4, 
batarg("",lng),batarg("v",hge),arg("ek",int),arg("sk",int))),
- pattern("batcalc", "second_interval", second_interval, false, "cast hge to a 
second_cand_interval and check for overflow", args(1,5, 
batarg("",lng),batarg("v",hge),batarg("s",oid),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "second_interval", second_interval, false, "cast hge to a 
second_interval and check for overflow", args(1,5, 
batarg("",lng),batarg("v",hge),batarg("s",oid),arg("ek",int),arg("sk",int))),
  /* sql_decimal_hge */
  command("calc", "hge", flt_num2dec_hge, false, "cast number to decimal(hge) 
and check for overflow", args(1,4, 
arg("",hge),arg("v",flt),arg("digits",int),arg("scale",int))),
  command("batcalc", "hge", batflt_num2dec_hge, false, "cast number to 
decimal(hge) and check for overflow", args(1,4, 
batarg("",hge),batarg("v",flt),arg("digits",int),arg("scale",int))),
diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h
--- a/sql/backends/monet5/sql.h
+++ b/sql/backends/monet5/sql.h
@@ -201,13 +201,16 @@ sql5_export str nil_2time_timestamp(Clie
 sql5_export str str_2time_timestamp(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str str_2time_timestamptz(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
 sql5_export str batstr_2time_timestamp(bat *res, const bat *v, const int *len);
+sql5_export str batstr_2time_timestamp_cand(bat *res, const bat *v, const bat 
*s, const int *len);
 sql5_export str batstr_2time_timestamptz(bat *res, const bat *v, const int 
*len, int *tz);
+sql5_export str batstr_2time_timestamptz_cand(bat *res, const bat *v, const 
bat *s, const int *len, int *tz);
 sql5_export str timestamp_2time_timestamp(Client cntxt, MalBlkPtr mb, 
MalStkPtr stk, InstrPtr pci);
 
 sql5_export str nil_2time_daytime(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str str_2time_daytime(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str str_2time_daytimetz(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str batstr_2time_daytime(bat *res, const bat *v, const int *len);
+sql5_export str batstr_2time_daytime_cand(bat *res, const bat *v, const bat 
*s, const int *len);
 sql5_export str daytime_2time_daytime(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
 
 sql5_export str bat_date_trunc(bat *res, const str *scale, const bat *v);
@@ -216,6 +219,7 @@ sql5_export str date_trunc(timestamp *re
 sql5_export str nil_2_date(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str str_2_date(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str batstr_2_date(bat *res, const bat *val);
+sql5_export str batstr_2_date_cand(bat *res, const bat *val, const bat *s);
 
 sql5_export str str_2_blob(blob * *res, const str *val);
 sql5_export str batstr_2_blob(bat *res, const bat *val);
diff --git a/sql/backends/monet5/sql_time.c b/sql/backends/monet5/sql_time.c
--- a/sql/backends/monet5/sql_time.c
+++ b/sql/backends/monet5/sql_time.c
@@ -27,12 +27,13 @@ str
 daytime_2time_daytime(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
        str msg = MAL_SUCCEED;
-       BAT *b = NULL, *res = NULL;
+       BAT *b = NULL, *s = NULL, *res = NULL;
        BUN q = 0;
        daytime *restrict ret = NULL;
-       int tpe = getArgType(mb, pci, 1), *digits = getArgReference_int(stk, 
pci, 2), d = (*digits) ? *digits - 1 : 0;
+       int tpe = getArgType(mb, pci, 1), *digits = getArgReference_int(stk, 
pci, pci->argc == 4 ? 3 : 2), d = (*digits) ? *digits - 1 : 0;
        bool is_a_bat = false;
-       bat *r = NULL;
+       bat *r = NULL, *sid = pci->argc == 4 ? getArgReference_bat(stk, pci, 
2): NULL;
+       struct canditer ci = {0};
 #ifdef HAVE_HGE
        hge shift = 0, divider = 1, multiplier = 1;
 #else
@@ -44,10 +45,14 @@ daytime_2time_daytime(Client cntxt, MalB
        if (is_a_bat) {
                tpe = getBatType(tpe);
                if (!(b = BATdescriptor(*getArgReference_bat(stk, pci, 1)))) {
-                       msg = createException(SQL, 
"batcalc.daytime_2time_daytime", SQLSTATE(HY005) "Cannot access column 
descriptor");
+                       msg = createException(SQL, 
"batcalc.daytime_2time_daytime", SQLSTATE(HY005) RUNTIME_OBJECT_MISSING);
                        goto bailout;
                }
-               q = BATcount(b);
+               if (sid && !is_bat_nil(*sid) && (s = BATdescriptor(*sid)) == 
NULL) {
+                       msg = createException(SQL, 
"batcalc.timestamp_2_daytime", SQLSTATE(HY005) RUNTIME_OBJECT_MISSING);
+                       goto bailout;
+               }
+               q = canditer_init(&ci, b, s);
                if (!(res = COLnew(b->hseqbase, TYPE_daytime, q, TRANSIENT))) {
                        msg = createException(SQL, 
"batcalc.daytime_2time_daytime", SQLSTATE(HY013) MAL_MALLOC_FAIL);
                        goto bailout;
@@ -68,10 +73,12 @@ daytime_2time_daytime(Client cntxt, MalB
        }
 
        if (is_a_bat) {
+               oid off = b->hseqbase;
                daytime *restrict vals = (daytime*) Tloc(b, 0);
                for (BUN i = 0 ; i < q ; i++) {
-                       daytime next = vals[i];
-                       ret[i] = is_daytime_nil(next) ? daytime_nil : 
daytime_2time_daytime_imp(next, shift, divider, multiplier);
+                       BUN p = (BUN) (canditer_next(&ci) - off);
+                       daytime next = vals[p];
+                       ret[p] = is_daytime_nil(next) ? daytime_nil : 
daytime_2time_daytime_imp(next, shift, divider, multiplier);
                }
        } else {
                daytime next = *(daytime*)getArgReference(stk, pci, 1);
@@ -81,6 +88,8 @@ daytime_2time_daytime(Client cntxt, MalB
 bailout:
        if (b)
                BBPunfix(b->batCacheid);
+       if (s)
+               BBPunfix(s->batCacheid);
        if (res && !msg) {
                BATsetcount(res, q);
                res->tnil = b->tnil;
@@ -111,11 +120,12 @@ second_interval_2_daytime(Client cntxt, 
 {
        str msg = MAL_SUCCEED;
        daytime *restrict ret = NULL;
-       int tpe = getArgType(mb, pci, 1), digits = *getArgReference_int(stk, 
pci, 2);
+       int tpe = getArgType(mb, pci, 1), digits = *getArgReference_int(stk, 
pci, pci->argc == 4 ? 3 : 2);
        bool is_a_bat = false;
-       BAT *b = NULL, *res = NULL;
-       bat *r = NULL;
+       BAT *b = NULL, *s = NULL, *res = NULL;
+       bat *r = NULL, *sid = pci->argc == 4 ? getArgReference_bat(stk, pci, 2) 
: NULL;
        BUN q = 0;
+       struct canditer ci = {0};
 #ifdef HAVE_HGE
        hge shift = 0, divider = 1, multiplier = 1;
 #else
@@ -127,10 +137,14 @@ second_interval_2_daytime(Client cntxt, 
        if (is_a_bat) {
                tpe = getBatType(tpe);
                if (!(b = BATdescriptor(*getArgReference_bat(stk, pci, 1)))) {
-                       msg = createException(SQL, 
"batcalc.second_interval_2_daytime", SQLSTATE(HY005) "Cannot access column 
descriptor");
+                       msg = createException(SQL, 
"batcalc.second_interval_2_daytime", SQLSTATE(HY005) RUNTIME_OBJECT_MISSING);
                        goto bailout;
                }
-               q = BATcount(b);
+               if (sid && !is_bat_nil(*sid) && (s = BATdescriptor(*sid)) == 
NULL) {
+                       msg = createException(SQL, 
"batcalc.second_interval_2_daytime", SQLSTATE(HY005) RUNTIME_OBJECT_MISSING);
+                       goto bailout;
+               }
+               q = canditer_init(&ci, b, s);
                if (!(res = COLnew(b->hseqbase, TYPE_daytime, q, TRANSIENT))) {
                        msg = createException(SQL, 
"batcalc.second_interval_2_daytime", SQLSTATE(HY013) MAL_MALLOC_FAIL);
                        goto bailout;
@@ -150,10 +164,12 @@ second_interval_2_daytime(Client cntxt, 
        }
 
        if (is_a_bat) {
+               oid off = b->hseqbase;
                lng *restrict vals = (lng*) Tloc(b, 0);
-               for (BUN i = 0 ; i < q && !msg ; i++) {
-                       lng next = vals[i];
-                       ret[i] = is_lng_nil(next) ? daytime_nil : 
second_interval_2_daytime_imp(next, shift, divider, multiplier);
+               for (BUN i = 0 ; i < q ; i++) {
+                       BUN p = (BUN) (canditer_next(&ci) - off);
+                       lng next = vals[p];
+                       ret[p] = is_lng_nil(next) ? daytime_nil : 
second_interval_2_daytime_imp(next, shift, divider, multiplier);
                }
        } else {
                lng next = *(lng*)getArgReference(stk, pci, 1);
@@ -163,6 +179,8 @@ second_interval_2_daytime(Client cntxt, 
 bailout:
        if (b)
                BBPunfix(b->batCacheid);
+       if (s)
+               BBPunfix(s->batCacheid);
        if (res && !msg) {
                BATsetcount(res, q);
                res->tnil = b->tnil;
@@ -186,7 +204,7 @@ nil_2time_daytime(Client cntxt, MalBlkPt
        if (isaBatType(getArgType(mb, pci, 1))) {
                daytime d = daytime_nil;
                if (!(b = BATdescriptor(*getArgReference_bat(stk, pci, 1))))
-                       throw(SQL, "batcalc.nil_2time_daytime", SQLSTATE(HY005) 
"Cannot access column descriptor");
+                       throw(SQL, "batcalc.nil_2time_daytime", SQLSTATE(HY005) 
RUNTIME_OBJECT_MISSING);
                res = BATconstant(b->hseqbase, TYPE_daytime, &d, BATcount(b), 
TRANSIENT);
                BBPunfix(b->batCacheid);
                if (!res)
@@ -220,16 +238,17 @@ lng shift, lng divider, lng multiplier
 }
 
 static str
-str_2time_daytimetz_internal(ptr out, ptr in, int tpe, int digits, int tz)
+str_2time_daytimetz_internal(ptr out, ptr in, const bat *sid, int tpe, int 
digits, int tz)
 {
        str msg = MAL_SUCCEED;
-       BAT *b = NULL, *res = NULL;
+       BAT *b = NULL, *s = NULL, *res = NULL;
        BUN q = 0;
        daytime *restrict ret = NULL;
        int d = (digits) ? digits - 1 : 0;
        bool is_a_bat = false;
        bat *r = NULL;
        ssize_t (*fromstr_func)(const char *, size_t *, daytime **, bool) = tz 
? daytime_tz_fromstr : daytime_fromstr;
+       struct canditer ci = {0};
 #ifdef HAVE_HGE
        hge shift = 0, divider = 1, multiplier = 1;
 #else
@@ -240,10 +259,14 @@ str_2time_daytimetz_internal(ptr out, pt
        if (is_a_bat) {
                tpe = getBatType(tpe);
                if (!(b = BATdescriptor(*(bat*) in))) {
-                       msg = createException(SQL, 
"batcalc.str_2time_daytimetz", SQLSTATE(HY005) "Cannot access column 
descriptor");
+                       msg = createException(SQL, 
"batcalc.str_2time_daytimetz", SQLSTATE(HY005) RUNTIME_OBJECT_MISSING);
                        goto bailout;
                }
-               q = BATcount(b);
+               if (sid && !is_bat_nil(*sid) && (s = BATdescriptor(*sid)) == 
NULL) {
+                       msg = createException(SQL, 
"batcalc.str_2time_daytimetz", SQLSTATE(HY005) RUNTIME_OBJECT_MISSING);
+                       goto bailout;
+               }
+               q = canditer_init(&ci, b, s);
                if (!(res = COLnew(b->hseqbase, TYPE_daytime, q, TRANSIENT))) {
                        msg = createException(SQL, 
"batcalc.str_2time_daytimetz", SQLSTATE(HY013) MAL_MALLOC_FAIL);
                        goto bailout;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to