Changeset: 257116830be5 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/257116830be5 Modified Files: sql/storage/bat/bat_storage.c Branch: default Log Message:
Merged with Jan2022 diffs (truncated from 2310 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 @@ -9293,7 +9293,7 @@ [ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str, X_2:str, X_3:str, X_4:int, X_5:int, X_6:int) (X_7:bat[:oid], X_8:bat[:any_1]) ", "mvc_bind_idxbat_wrap;", "Bind the 'schema.table.index' BAT with access kind:\n0 - base table\n1 - inserts\n2 - updates" ] [ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str, X_2:str, X_3:str, X_4:int, X_5:int, X_6:int):bat[:any_1] ", "mvc_bind_idxbat_wrap;", "Bind the 'schema.table.index' BAT with access kind:\n0 - base table\n1 - inserts\n2 - updates" ] [ "sql", "claim", "unsafe pattern sql.claim(X_0:int, X_1:str, X_2:str, X_3:lng) (X_4:oid, X_5:bat[:oid]) ", "mvc_claim_wrap;", "Claims slots for appending rows." ] -[ "sql", "clear_table", "unsafe pattern sql.clear_table(X_0:str, X_1:str):lng ", "mvc_clear_table_wrap;", "Clear the table sname.tname." ] +[ "sql", "clear_table", "unsafe pattern sql.clear_table(X_0:str, X_1:str, X_2:int):lng ", "mvc_clear_table_wrap;", "Clear the table sname.tname." ] [ "sql", "copy_from", "unsafe pattern sql.copy_from(X_0:ptr, X_1:str, X_2:str, X_3:str, X_4:str, X_5:str, X_6:lng, X_7:lng, X_8:int, X_9:str, X_10:int, X_11:int):bat[:any]... ", "mvc_import_table_wrap;", "Import a table from bstream s with the \ngiven tuple and seperators (sep/rsep)" ] [ "sql", "copy_rejects", "pattern sql.copy_rejects() (X_0:bat[:lng], X_1:bat[:int], X_2:bat[:str], X_3:bat[:str]) ", "COPYrejects;", "" ] [ "sql", "copy_rejects_clear", "unsafe pattern sql.copy_rejects_clear():void ", "COPYrejects_clear;", "" ] @@ -9680,7 +9680,7 @@ [ "wlc", "alter_user", "pattern wlc.alter_user(X_0:str, X_1:str, X_2:int, X_3:str, X_4:str):void ", "WLCgeneric;", "Catalog operation alter_user" ] [ "wlc", "append", "pattern wlc.append(X_0:str, X_1:str, X_2:str, X_3:any):int ", "WLCappend;", "Keep the insertions in the workload-capture-replay list" ] [ "wlc", "catalog", "pattern wlc.catalog(X_0:str):void ", "WLCcatalog;", "Keep the catalog changing queries for replay. " ] -[ "wlc", "clear_table", "pattern wlc.clear_table(X_0:str, X_1:str):int ", "WLCclear_table;", "Keep the deletions in the workload-capture-replay list" ] +[ "wlc", "clear_table", "pattern wlc.clear_table(X_0:str, X_1:str, X_2:int):int ", "WLCclear_table;", "Keep the deletions in the workload-capture-replay list" ] [ "wlc", "comment_on", "pattern wlc.comment_on(X_0:int, X_1:str):void ", "WLCgeneric;", "Catalog operation comment_on" ] [ "wlc", "commit", "pattern wlc.commit():void ", "WLCcommitCmd;", "Commit the workload-capture-replay record" ] [ "wlc", "commit", "pattern wlc.commit():void ", "WLCcommitCmd;", "Mark the end of the work unit" ] @@ -9750,7 +9750,7 @@ [ "wlr", "alter_user", "pattern wlr.alter_user(X_0:str, X_1:str, X_2:int, X_3:str, X_4:str):void ", "WLRgeneric;", "Catalog operation alter_user" ] [ "wlr", "append", "pattern wlr.append(X_0:str, X_1:str, X_2:str, X_3:oid, X_4:bat[:oid], X_5:any...):int ", "WLRappend;", "Apply the insertions in the workload-capture-replay list" ] [ "wlr", "catalog", "pattern wlr.catalog(X_0:str):void ", "WLRcatalog;", "A catalog changing query" ] -[ "wlr", "clear_table", "pattern wlr.clear_table(X_0:str, X_1:str):int ", "WLRclear_table;", "Destroy the tuples in the table" ] +[ "wlr", "clear_table", "pattern wlr.clear_table(X_0:str, X_1:str, X_2:int):int ", "WLRclear_table;", "Destroy the tuples in the table" ] [ "wlr", "comment_on", "pattern wlr.comment_on(X_0:int, X_1:str):void ", "WLRgeneric;", "Catalog operation comment_on" ] [ "wlr", "commit", "pattern wlr.commit():void ", "WLRcommit;", "Mark the end of the work unit" ] [ "wlr", "create_function", "pattern wlr.create_function(X_0:str, X_1:str, X_2:int):void ", "WLRgeneric;", "Catalog operation create_function" ] 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 @@ -12595,7 +12595,7 @@ [ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str, X_2:str, X_3:str, X_4:int, X_5:int, X_6:int) (X_7:bat[:oid], X_8:bat[:any_1]) ", "mvc_bind_idxbat_wrap;", "Bind the 'schema.table.index' BAT with access kind:\n0 - base table\n1 - inserts\n2 - updates" ] [ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str, X_2:str, X_3:str, X_4:int, X_5:int, X_6:int):bat[:any_1] ", "mvc_bind_idxbat_wrap;", "Bind the 'schema.table.index' BAT with access kind:\n0 - base table\n1 - inserts\n2 - updates" ] [ "sql", "claim", "unsafe pattern sql.claim(X_0:int, X_1:str, X_2:str, X_3:lng) (X_4:oid, X_5:bat[:oid]) ", "mvc_claim_wrap;", "Claims slots for appending rows." ] -[ "sql", "clear_table", "unsafe pattern sql.clear_table(X_0:str, X_1:str):lng ", "mvc_clear_table_wrap;", "Clear the table sname.tname." ] +[ "sql", "clear_table", "unsafe pattern sql.clear_table(X_0:str, X_1:str, X_2:int):lng ", "mvc_clear_table_wrap;", "Clear the table sname.tname." ] [ "sql", "copy_from", "unsafe pattern sql.copy_from(X_0:ptr, X_1:str, X_2:str, X_3:str, X_4:str, X_5:str, X_6:lng, X_7:lng, X_8:int, X_9:str, X_10:int, X_11:int):bat[:any]... ", "mvc_import_table_wrap;", "Import a table from bstream s with the \ngiven tuple and seperators (sep/rsep)" ] [ "sql", "copy_rejects", "pattern sql.copy_rejects() (X_0:bat[:lng], X_1:bat[:int], X_2:bat[:str], X_3:bat[:str]) ", "COPYrejects;", "" ] [ "sql", "copy_rejects_clear", "unsafe pattern sql.copy_rejects_clear():void ", "COPYrejects_clear;", "" ] @@ -13001,7 +13001,7 @@ [ "wlc", "alter_user", "pattern wlc.alter_user(X_0:str, X_1:str, X_2:int, X_3:str, X_4:str):void ", "WLCgeneric;", "Catalog operation alter_user" ] [ "wlc", "append", "pattern wlc.append(X_0:str, X_1:str, X_2:str, X_3:any):int ", "WLCappend;", "Keep the insertions in the workload-capture-replay list" ] [ "wlc", "catalog", "pattern wlc.catalog(X_0:str):void ", "WLCcatalog;", "Keep the catalog changing queries for replay. " ] -[ "wlc", "clear_table", "pattern wlc.clear_table(X_0:str, X_1:str):int ", "WLCclear_table;", "Keep the deletions in the workload-capture-replay list" ] +[ "wlc", "clear_table", "pattern wlc.clear_table(X_0:str, X_1:str, X_2:int):int ", "WLCclear_table;", "Keep the deletions in the workload-capture-replay list" ] [ "wlc", "comment_on", "pattern wlc.comment_on(X_0:int, X_1:str):void ", "WLCgeneric;", "Catalog operation comment_on" ] [ "wlc", "commit", "pattern wlc.commit():void ", "WLCcommitCmd;", "Commit the workload-capture-replay record" ] [ "wlc", "commit", "pattern wlc.commit():void ", "WLCcommitCmd;", "Mark the end of the work unit" ] @@ -13071,7 +13071,7 @@ [ "wlr", "alter_user", "pattern wlr.alter_user(X_0:str, X_1:str, X_2:int, X_3:str, X_4:str):void ", "WLRgeneric;", "Catalog operation alter_user" ] [ "wlr", "append", "pattern wlr.append(X_0:str, X_1:str, X_2:str, X_3:oid, X_4:bat[:oid], X_5:any...):int ", "WLRappend;", "Apply the insertions in the workload-capture-replay list" ] [ "wlr", "catalog", "pattern wlr.catalog(X_0:str):void ", "WLRcatalog;", "A catalog changing query" ] -[ "wlr", "clear_table", "pattern wlr.clear_table(X_0:str, X_1:str):int ", "WLRclear_table;", "Destroy the tuples in the table" ] +[ "wlr", "clear_table", "pattern wlr.clear_table(X_0:str, X_1:str, X_2:int):int ", "WLRclear_table;", "Destroy the tuples in the table" ] [ "wlr", "comment_on", "pattern wlr.comment_on(X_0:int, X_1:str):void ", "WLRgeneric;", "Catalog operation comment_on" ] [ "wlr", "commit", "pattern wlr.commit():void ", "WLRcommit;", "Mark the end of the work unit" ] [ "wlr", "create_function", "pattern wlr.create_function(X_0:str, X_1:str, X_2:int):void ", "WLRgeneric;", "Catalog operation create_function" ] diff --git a/monetdb5/modules/mal/wlc.c b/monetdb5/modules/mal/wlc.c --- a/monetdb5/modules/mal/wlc.c +++ b/monetdb5/modules/mal/wlc.c @@ -1014,6 +1014,7 @@ WLCclear_table(Client cntxt, MalBlkPtr m p = newStmt(cntxt->wlc, "wlr","clear_table"); p = pushStr(cntxt->wlc, p, getVarConstant(mb, getArg(pci,1)).val.sval); p = pushStr(cntxt->wlc, p, getVarConstant(mb, getArg(pci,2)).val.sval); + p = pushInt(cntxt->wlc, p, getVarConstant(mb, getArg(pci,3)).val.ival); if( cntxt->wlc_kind < WLC_UPDATE) cntxt->wlc_kind = WLC_UPDATE; @@ -1086,7 +1087,7 @@ mel_func wlc_init_funcs[] = { pattern("wlc", "append", WLCappend, false, "Keep the insertions in the workload-capture-replay list", args(1,5, arg("",int),arg("sname",str),arg("tname",str),arg("cname",str),argany("ins",0))), pattern("wlc", "update", WLCupdate, false, "Keep the update in the workload-capture-replay list", args(1,6, arg("",int),arg("sname",str),arg("tname",str),arg("cname",str),argany("tid",0),argany("val",0))), pattern("wlc", "delete", WLCdelete, false, "Keep the deletions in the workload-capture-replay list", args(1,4, arg("",int),arg("sname",str),arg("tname",str),argany("b",0))), - pattern("wlc", "clear_table", WLCclear_table, false, "Keep the deletions in the workload-capture-replay list", args(1,3, arg("",int),arg("sname",str),arg("tname",str))), + pattern("wlc", "clear_table", WLCclear_table, false, "Keep the deletions in the workload-capture-replay list", args(1,4, arg("",int),arg("sname",str),arg("tname",str),arg("restart_sequences",int))), pattern("wlc", "commit", WLCcommitCmd, false, "Commit the workload-capture-replay record", noargs), pattern("wlc", "rollback", WLCcommitCmd, false, "Rollback the workload-capture-replay record", noargs), pattern("wlc", "create_seq", WLCgeneric, false, "Catalog operation create_seq", args(0,3, arg("sname",str),arg("seqname",str),arg("action",int))), diff --git a/sql/backends/monet5/UDF/pyapi3/conversion3.c b/sql/backends/monet5/UDF/pyapi3/conversion3.c --- a/sql/backends/monet5/UDF/pyapi3/conversion3.c +++ b/sql/backends/monet5/UDF/pyapi3/conversion3.c @@ -612,6 +612,8 @@ PyObject *PyObject_CheckForConversion(Py if (PyType_IsNumpyArray(data)) { if (PyArray_NDIM((PyArrayObject *)data) != 1) { IsSingleArray = FALSE; + } else if (PyArray_SIZE((PyArrayObject *)data) == 0) { + IsSingleArray = TRUE; } else { pColO = PyArray_GETITEM( (PyArrayObject *)data, @@ -619,8 +621,12 @@ PyObject *PyObject_CheckForConversion(Py IsSingleArray = PyType_IsPyScalar(pColO); } } else if (PyList_Check(data)) { - pColO = PyList_GetItem(data, 0); - IsSingleArray = PyType_IsPyScalar(pColO); + if (PyList_Size(data) == 0) { + IsSingleArray = TRUE; + } else { + pColO = PyList_GetItem(data, 0); + IsSingleArray = PyType_IsPyScalar(pColO); + } } else if (!PyType_IsNumpyMaskedArray(data)) { // it is neither a python array, numpy array or numpy masked // array, thus the result is unsupported! Throw an exception! diff --git a/sql/backends/monet5/mal_backend.c b/sql/backends/monet5/mal_backend.c --- a/sql/backends/monet5/mal_backend.c +++ b/sql/backends/monet5/mal_backend.c @@ -50,3 +50,14 @@ backend_destroy(backend *b) b->subbackend->destroy(b->subbackend); _DELETE(b); } + +/* for recursive functions, if the implementation is not set yet, take it from the current compilation */ +str +backend_function_imp(backend *b, sql_func *f) +{ + str res = sql_func_imp(f); + + if (b->mvc->forward && strcmp(res, "") == 0 && b->mvc->forward->base.id == f->base.id) + res = b->fimp; + return res; +} diff --git a/sql/backends/monet5/mal_backend.h b/sql/backends/monet5/mal_backend.h --- a/sql/backends/monet5/mal_backend.h +++ b/sql/backends/monet5/mal_backend.h @@ -63,10 +63,12 @@ typedef struct backend { lng last_id; lng rowcnt; subbackend *subbackend; + str fimp; /* for recurisve functions keep the to be generated MAL function name here */ } backend; extern backend *backend_reset(backend *b); extern backend *backend_create(mvc *m, Client c); extern void backend_destroy(backend *b); +extern str backend_function_imp(backend *b, sql_func *f); #endif /*MAL_BACKEND_H*/ diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -1110,7 +1110,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l mvc *sql = be->mvc; stmt *s = NULL; - if (THRhighwater()) + if (mvc_highwater(sql)) return sql_error(be->mvc, 10, SQLSTATE(42000) "Query too complex: running out of stack space"); if (!e) { @@ -1249,7 +1249,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l if (f->func->lang == FUNC_LANG_MAL && backend_create_mal_func(be->mvc, f->func) < 0) return NULL; mod = sql_func_mod(f->func); - fimp = sql_func_imp(f->func); + fimp = backend_function_imp(be, f->func); if (f->func->side_effect && left && left->nrcols > 0 && f->func->type != F_LOADER && exps_card(exps) < CARD_MULTI) { rows = bin_find_smallest_column(be, left); @@ -1641,7 +1641,7 @@ check_types(backend *be, sql_subtype *t, } } if (err) { - stmt *res = sql_error(sql, 03, SQLSTATE(42000) "types %s(%u,%u) (%s) and %s(%u,%u) (%s) are not equal", + stmt *res = sql_error(sql, 10, SQLSTATE(42000) "types %s(%u,%u) (%s) and %s(%u,%u) (%s) are not equal", fromtype->type->base.name, fromtype->digits, fromtype->scale, @@ -1868,7 +1868,7 @@ exp2bin_args(backend *be, sql_exp *e, li { mvc *sql = be->mvc; - if (THRhighwater()) + if (mvc_highwater(sql)) return sql_error(sql, 10, SQLSTATE(42000) "Query too complex: running out of stack space"); if (!e || !args) @@ -1948,7 +1948,7 @@ exps2bin_args(backend *be, list *exps, l static list * rel2bin_args(backend *be, sql_rel *rel, list *args) { - if (THRhighwater()) + if (mvc_highwater(be->mvc)) return sql_error(be->mvc, 10, SQLSTATE(42000) "Query too complex: running out of stack space"); if (!rel || !args) @@ -2130,7 +2130,7 @@ rel2bin_table(backend *be, sql_rel *rel, if (backend_create_subfunc(be, f, ops) < 0) return NULL; str mod = sql_func_mod(f->func); - str fcn = sql_func_imp(f->func); + str fcn = backend_function_imp(be, f->func); q = pushStr(be->mb, q, mod); q = pushStr(be->mb, q, fcn); psub = stmt_direct_func(be, q); @@ -3924,7 +3924,7 @@ insert_check_ukey(backend *be, list *ins /* foreach column add predicate */ if (add_column_predicate(be, c->c) != LOG_OK) - return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); + return sql_error(sql, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL); col = stmt_col(be, c->c, dels, dels->partition); if ((k->type == ukey) && stmt_has_null(col)) { @@ -3947,7 +3947,7 @@ insert_check_ukey(backend *be, list *ins /* foreach column add predicate */ if (add_column_predicate(be, c->c) != LOG_OK) - return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); + return sql_error(sql, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL); col = stmt_col(be, c->c, dels, dels->partition); list_append(lje, col); @@ -4011,7 +4011,7 @@ insert_check_ukey(backend *be, list *ins /* add predicate for this column */ if (add_column_predicate(be, c->c) != LOG_OK) - return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); + return sql_error(sql, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL); s = stmt_col(be, c->c, dels, dels->partition); if ((k->type == ukey) && stmt_has_null(s)) { @@ -4083,7 +4083,7 @@ insert_check_fkey(backend *be, list *ins /* foreach column add predicate */ if (add_column_predicate(be, c->c) != LOG_OK) - return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); + return sql_error(sql, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL); } if (pin && list_length(pin->op4.lval)) @@ -4201,7 +4201,7 @@ sql_insert_check_null(backend *be, sql_t /* foreach column add predicate */ if (add_column_predicate(be, c) != LOG_OK) - return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); + return sql_error(sql, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL); if (!(s->key && s->nrcols == 0)) { s = stmt_selectnil(be, column(be, i)); @@ -4279,7 +4279,7 @@ rel2bin_insert(backend *be, sql_rel *rel /* before */ if (!sql_insert_triggers(be, t, updates, 0)) - return sql_error(sql, 02, SQLSTATE(27000) "INSERT INTO: triggers failed for table '%s'", t->base.name); + return sql_error(sql, 10, SQLSTATE(27000) "INSERT INTO: triggers failed for table '%s'", t->base.name); insert = inserts->op4.lval->h->data; if (insert->nrcols == 0) { @@ -4343,12 +4343,12 @@ rel2bin_insert(backend *be, sql_rel *rel return NULL; if (!sql_insert_triggers(be, t, updates, 1)) - return sql_error(sql, 02, SQLSTATE(27000) "INSERT INTO: triggers failed for table '%s'", t->base.name); + return sql_error(sql, 10, SQLSTATE(27000) "INSERT INTO: triggers failed for table '%s'", t->base.name); /* update predicate list */ if (rel->r && !rel_predicates(be, rel->r)) return NULL; if (!isNew(t) && isGlobal(t) && !isGlobalTemp(t) && sql_trans_add_dependency_change(be->mvc->session->tr, t->base.id, dml) != LOG_OK) - return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); + return sql_error(sql, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL); if (ddl) { ret = ddl; @@ -5191,26 +5191,26 @@ sql_update(backend *be, sql_table *t, st idx_updates = update_idxs_and_check_keys(be, t, rows, updates, l, NULL); if (!idx_updates) { assert(0); - return sql_error(sql, 02, SQLSTATE(42000) "UPDATE: failed to update indexes for table '%s'", t->base.name); + return sql_error(sql, 10, SQLSTATE(42000) "UPDATE: failed to update indexes for table '%s'", t->base.name); } /* before */ if (!sql_update_triggers(be, t, rows, updates, 0)) - return sql_error(sql, 02, SQLSTATE(27000) "UPDATE: triggers failed for table '%s'", t->base.name); + return sql_error(sql, 10, SQLSTATE(27000) "UPDATE: triggers failed for table '%s'", t->base.name); /* apply updates */ for (i = 0, n = ol_first_node(t->columns); i < nr_cols && n; i++, n = n->next) { sql_column *c = n->data; if (updates[i]) - append(l, stmt_update_col(be, c, rows, updates[i])); + append(l, stmt_update_col(be, c, rows, updates[i])); } if (cascade_updates(be, t, rows, updates)) - return sql_error(sql, 02, SQLSTATE(42000) "UPDATE: cascade failed for table '%s'", t->base.name); + return sql_error(sql, 10, SQLSTATE(42000) "UPDATE: cascade failed for table '%s'", t->base.name); /* after */ if (!sql_update_triggers(be, t, rows, updates, 1)) - return sql_error(sql, 02, SQLSTATE(27000) "UPDATE: triggers failed for table '%s'", t->base.name); + return sql_error(sql, 10, SQLSTATE(27000) "UPDATE: triggers failed for table '%s'", t->base.name); /* cascade ?? */ return l; @@ -5300,7 +5300,7 @@ rel2bin_update(backend *be, sql_rel *rel _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list