Changeset: b8b09a4610c8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b8b09a4610c8
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
sql/backends/monet5/sql.c
Branch: Jan2022
Log Message:
Added bulk version of mvc_peak_next_value for msqldump and 'describe_sequences'
view
diffs (137 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
@@ -6386,6 +6386,8 @@
[ "batsql", "ntile", "pattern batsql.ntile(X_0:bat[:any], X_1:any_1,
X_2:any_2, X_3:any_3):bat[:any_1] ", "SQLntile;", "return the groups
divided as equally as possible" ]
[ "batsql", "ntile", "pattern batsql.ntile(X_0:bat[:any],
X_1:bat[:any_1], X_2:any_2, X_3:any_3):bat[:any_1] ", "SQLntile;",
"return the groups divided as equally as possible" ]
[ "batsql", "password", "pattern
batsql.password(X_0:bat[:str]):bat[:str] ", "db_password_wrap;", "Return
password hash of user" ]
+[ "batsql", "peak_next_value", "pattern
batsql.peak_next_value(X_0:bat[:str], X_1:bat[:str]):bat[:lng] ",
"mvc_peak_next_value_bulk;", "Peaks at the next value of the sequence"
]
+[ "batsql", "peak_next_value", "pattern
batsql.peak_next_value(X_0:bat[:str], X_1:bat[:str], X_2:bat[:oid],
X_3:bat[:oid]):bat[:lng] ", "mvc_peak_next_value_bulk;", "Peaks at
the next value of the sequence" ]
[ "batsql", "percent_rank", "pattern batsql.percent_rank(X_0:bat[:any_1],
X_1:any_2, X_2:any_3):bat[:dbl] ", "SQLpercent_rank;", "return the
percentage into the total number of groups for each row" ]
[ "batsql", "prod", "pattern batsql.prod(X_0:bat[:bte], 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[:dbl], X_1:any, X_2:any,
X_3:int, X_4:any, X_5:any):bat[:dbl] ", "SQLprod;", "return the product
of groups" ]
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
@@ -8927,6 +8927,8 @@
[ "batsql", "ntile", "pattern batsql.ntile(X_0:bat[:any], X_1:any_1,
X_2:any_2, X_3:any_3):bat[:any_1] ", "SQLntile;", "return the groups
divided as equally as possible" ]
[ "batsql", "ntile", "pattern batsql.ntile(X_0:bat[:any],
X_1:bat[:any_1], X_2:any_2, X_3:any_3):bat[:any_1] ", "SQLntile;",
"return the groups divided as equally as possible" ]
[ "batsql", "password", "pattern
batsql.password(X_0:bat[:str]):bat[:str] ", "db_password_wrap;", "Return
password hash of user" ]
+[ "batsql", "peak_next_value", "pattern
batsql.peak_next_value(X_0:bat[:str], X_1:bat[:str]):bat[:lng] ",
"mvc_peak_next_value_bulk;", "Peaks at the next value of the sequence"
]
+[ "batsql", "peak_next_value", "pattern
batsql.peak_next_value(X_0:bat[:str], X_1:bat[:str], X_2:bat[:oid],
X_3:bat[:oid]):bat[:lng] ", "mvc_peak_next_value_bulk;", "Peaks at
the next value of the sequence" ]
[ "batsql", "percent_rank", "pattern batsql.percent_rank(X_0:bat[:any_1],
X_1:any_2, X_2:any_3):bat[:dbl] ", "SQLpercent_rank;", "return the
percentage into the total number of groups for each row" ]
[ "batsql", "prod", "pattern batsql.prod(X_0:bat[:bte], 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[:bte], X_1:any, X_2:any,
X_3:int, X_4:any, X_5:any):bat[:lng] ", "SQLprod;", "return the product
of groups" ]
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
@@ -985,6 +985,100 @@ mvc_peak_next_value(Client cntxt, MalBlk
throw(SQL, "sql.peak_next_value", SQLSTATE(HY050) "Cannot peak at next
sequence value %s.%s", sname, seqname);
}
+/* needed for msqldump and describe_sequences view */
+static str
+mvc_peak_next_value_bulk(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci)
+{
+ mvc *m = NULL;
+ sql_schema *s;
+ sql_sequence *seq;
+ BATiter schi, seqi;
+ BAT *bn = NULL, *scheb = NULL, *sches = NULL, *seqb = NULL, *seqs =
NULL;
+ BUN q = 0;
+ lng *restrict vals;
+ str msg = MAL_SUCCEED;
+ bool nils = false;
+ struct canditer ci1 = {0}, ci2 = {0};
+ oid off1, off2;
+ bat *res = getArgReference_bat(stk, pci, 0), *l =
getArgReference_bat(stk, pci, 1), *r = getArgReference_bat(stk, pci, 2),
+ *sid1 = pci->argc == 5 ? getArgReference_bat(stk, pci, 3) :
NULL, *sid2 = pci->argc == 5 ? getArgReference_bat(stk, pci, 4) : NULL;
+
+ if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
+ return msg;
+ if ((msg = checkSQLContext(cntxt)) != NULL)
+ return msg;
+ if (!(scheb = BATdescriptor(*l)) || !(seqb = BATdescriptor(*r))) {
+ msg = createException(SQL, "sql.peak_next_value",
SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
+ goto bailout;
+ }
+ if ((sid1 && !is_bat_nil(*sid1) && !(sches = BATdescriptor(*sid1))) ||
(sid2 && !is_bat_nil(*sid2) && !(seqs = BATdescriptor(*sid2)))) {
+ msg = createException(SQL, "sql.peak_next_value",
SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
+ goto bailout;
+ }
+ q = canditer_init(&ci1, scheb, sches);
+ if (canditer_init(&ci2, seqb, seqs) != q || ci1.hseq != ci2.hseq) {
+ msg = createException(SQL, "sql.peak_next_value",
ILLEGAL_ARGUMENT " Requires bats of identical size");
+ goto bailout;
+ }
+ if (!(bn = COLnew(ci1.hseq, TYPE_lng, q, TRANSIENT))) {
+ msg = createException(SQL, "sql.peak_next_value",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+
+ off1 = scheb->hseqbase;
+ off2 = seqb->hseqbase;
+ schi = bat_iterator(scheb);
+ seqi = bat_iterator(seqb);
+ vals = Tloc(bn, 0);
+ for (BUN i = 0; i < q; i++) {
+ oid p1 = canditer_next(&ci1) - off1, p2 = canditer_next(&ci2) -
off2;
+ const char *sname = (str) BUNtvar(schi, p1);
+ const char *seqname = (str) BUNtvar(seqi, p2);
+
+ if (strNil(sname) || strNil(seqname)) {
+ vals[i] = lng_nil;
+ nils = true;
+ } else {
+ if (!(s = mvc_bind_schema(m, sname))) {
+ msg = createException(SQL,
"sql.peak_next_value", SQLSTATE(3F000) "Cannot find the schema %s", sname);
+ goto bailout1;
+ }
+ if (!(seq = find_sql_sequence(m->session->tr, s,
seqname))) {
+ msg = createException(SQL,
"sql.peak_next_value", SQLSTATE(HY050) "Cannot find the sequence %s.%s", sname,
seqname);
+ goto bailout1;
+ }
+ if (!seq_peak_next_value(m->session->tr->store, seq,
&(vals[i]))) {
+ msg = createException(SQL,
"sql.peak_next_value", SQLSTATE(HY050) "Cannot peak at next sequence value
%s.%s", sname, seqname);
+ goto bailout1;
+ }
+ }
+ }
+
+bailout1:
+ bat_iterator_end(&schi);
+ bat_iterator_end(&seqi);
+bailout:
+ if (scheb)
+ BBPunfix(scheb->batCacheid);
+ if (sches)
+ BBPunfix(sches->batCacheid);
+ if (seqb)
+ BBPunfix(seqb->batCacheid);
+ if (seqs)
+ BBPunfix(seqs->batCacheid);
+ if (bn && !msg) {
+ BATsetcount(bn, q);
+ bn->tnil = nils;
+ bn->tnonil = !nils;
+ bn->tkey = BATcount(bn) <= 1;
+ bn->tsorted = BATcount(bn) <= 1;
+ bn->trevsorted = BATcount(bn) <= 1;
+ BBPkeepref(*res = bn->batCacheid);
+ } else if (bn)
+ BBPreclaim(bn);
+ return msg;
+}
+
str
mvc_getVersion(lng *version, const int *clientid)
{
@@ -5056,6 +5150,8 @@ static mel_func sql_init_funcs[] = {
pattern("batsql", "next_value", mvc_next_value_bulk, true, "return the next
value of the sequence", args(1,4, batarg("",lng),arg("card",lng),
arg("sname",str),arg("sequence",str))),
pattern("sql", "get_value", mvc_get_value, false, "return the current value
of the sequence", args(1,3, arg("",lng),arg("sname",str),arg("sequence",str))),
pattern("sql", "peak_next_value", mvc_peak_next_value, false, "Peaks at the
next value of the sequence", args(1,3,
arg("",lng),arg("sname",str),arg("sequence",str))),
+ pattern("batsql", "peak_next_value", mvc_peak_next_value_bulk, false, "Peaks
at the next value of the sequence", args(1,3,
batarg("",lng),batarg("sname",str),batarg("sequence",str))),
+ pattern("batsql", "peak_next_value", mvc_peak_next_value_bulk, false, "Peaks
at the next value of the sequence", args(1,5,
batarg("",lng),batarg("sname",str),batarg("sequence",str),batarg("s1",oid),batarg("s2",oid))),
pattern("sql", "restart", mvc_restart_seq, true, "restart the sequence with
value start", args(1,4,
arg("",lng),arg("sname",str),arg("sequence",str),arg("start",lng))),
pattern("sql", "deltas", mvc_delta_values, false, "Return the delta values
sizes of all columns of the schema's tables, plus the current transaction
level", args(7,8,
batarg("ids",int),batarg("segments",lng),batarg("all",lng),batarg("inserted",lng),batarg("updated",lng),batarg("deleted",lng),batarg("tr_level",int),arg("schema",str))),
pattern("sql", "deltas", mvc_delta_values, false, "Return the delta values
sizes from the table's columns, plus the current transaction level", args(7,9,
batarg("ids",int),batarg("segments",lng),batarg("all",lng),batarg("inserted",lng),batarg("updated",lng),batarg("deleted",lng),batarg("tr_level",int),arg("schema",str),arg("table",str))),
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list