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