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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list