Changeset: 557b3500e8dc for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/557b3500e8dc Modified Files: clients/Tests/MAL-signatures-hge.test clients/Tests/MAL-signatures.test sql/backends/monet5/rel_bin.c sql/backends/monet5/sql.c sql/backends/monet5/sql.h sql/backends/monet5/sql_statement.c sql/backends/monet5/sql_statement.h sql/test/mapi/Tests/sql_int128.test Branch: Jan2022 Log Message:
Move dml dependency change to the backend, so sql functions/procedures will always add the dependency when they run. Also check if any rows were affected diffs (truncated from 339 to 300 lines): diff --git a/clients/Tests/MAL-signatures-hge.test b/clients/Tests/MAL-signatures-hge.test --- a/clients/Tests/MAL-signatures-hge.test +++ b/clients/Tests/MAL-signatures-hge.test @@ -63118,6 +63118,11 @@ pattern sql.dense_rank(X_0:any_1, X_1:bi SQLdense_rank; return the densely ranked groups sql +depend +unsafe pattern sql.depend(X_0:str, X_1:str, X_2:lng):void +mvc_add_dependency_change; +Set dml dependency on current transaction for a table. +sql deregister unsafe pattern sql.deregister():int RAstatementEnd; diff --git a/clients/Tests/MAL-signatures.test b/clients/Tests/MAL-signatures.test --- a/clients/Tests/MAL-signatures.test +++ b/clients/Tests/MAL-signatures.test @@ -46593,6 +46593,11 @@ pattern sql.dense_rank(X_0:any_1, X_1:bi SQLdense_rank; return the densely ranked groups sql +depend +unsafe pattern sql.depend(X_0:str, X_1:str, X_2:lng):void +mvc_add_dependency_change; +Set dml dependency on current transaction for a table. +sql deregister unsafe pattern sql.deregister():int RAstatementEnd; 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 @@ -4345,8 +4345,6 @@ rel2bin_insert(backend *be, sql_rel *rel /* 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, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL); if (ddl) { ret = ddl; @@ -4358,6 +4356,8 @@ rel2bin_insert(backend *be, sql_rel *rel /* if there are multiple update statements, update total count, otherwise use the the current count */ be->rowcount = be->rowcount ? add_to_rowcount_accumulator(be, ret->nr) : ret->nr; } + if (t->s && isGlobal(t) && !isGlobalTemp(t)) + (void) stmt_dependency_change(be, t, ret); return ret; } } @@ -5182,6 +5182,7 @@ sql_update(backend *be, sql_table *t, st int i, nr_cols = ol_length(t->columns); list *l = sa_list(sql->sa); node *n; + stmt *cnt = NULL; sql_update_check_null(be, t, updates); @@ -5210,6 +5211,14 @@ sql_update(backend *be, sql_table *t, st if (!sql_update_triggers(be, t, rows, updates, 1)) return sql_error(sql, 10, SQLSTATE(27000) "UPDATE: triggers failed for table '%s'", t->base.name); + if (!be->silent || (t->s && isGlobal(t) && !isGlobalTemp(t))) + cnt = stmt_aggr(be, rows, NULL, NULL, sql_bind_func(sql, "sys", "count", sql_bind_localtype("void"), NULL, F_AGGR), 1, 0, 1); + if (!be->silent) { + /* if there are multiple update statements, update total count, otherwise use the the current count */ + be->rowcount = be->rowcount ? add_to_rowcount_accumulator(be, cnt->nr) : cnt->nr; + } + if (t->s && isGlobal(t) && !isGlobalTemp(t)) + (void) stmt_dependency_change(be, t, cnt); /* cascade ?? */ return l; } @@ -5332,14 +5341,14 @@ rel2bin_update(backend *be, sql_rel *rel /* if there are multiple update statements, update total count, otherwise use the the current count */ be->rowcount = be->rowcount ? add_to_rowcount_accumulator(be, cnt->nr) : cnt->nr; } + if (t->s && isGlobal(t) && !isGlobalTemp(t)) + (void) stmt_dependency_change(be, t, cnt); } if (sql->cascade_action) sql->cascade_action = NULL; 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, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL); return cnt; } @@ -5536,7 +5545,7 @@ sql_delete(backend *be, sql_table *t, st if (rows) { s = stmt_delete(be, t, rows); - if (!be->silent) + if (!be->silent || (t->s && isGlobal(t) && !isGlobalTemp(t))) s = stmt_aggr(be, rows, NULL, NULL, sql_bind_func(sql, "sys", "count", sql_bind_localtype("void"), NULL, F_AGGR), 1, 0, 1); } else { /* delete all */ s = stmt_table_clear(be, t, 0); /* first column */ @@ -5545,6 +5554,13 @@ sql_delete(backend *be, sql_table *t, st /* after */ if (!sql_delete_triggers(be, t, v, deleted_cols, 1, 1, 3)) return sql_error(sql, 10, SQLSTATE(27000) "DELETE: triggers failed for table '%s'", t->base.name); + + if (!be->silent) { + /* if there are multiple update statements, update total count, otherwise use the the current count */ + be->rowcount = be->rowcount ? add_to_rowcount_accumulator(be, s->nr) : s->nr; + } + if (t->s && isGlobal(t) && !isGlobalTemp(t)) + (void) stmt_dependency_change(be, t, s); return s; } @@ -5575,15 +5591,8 @@ rel2bin_delete(backend *be, sql_rel *rel if (!stdelete) return NULL; - if (!be->silent) { - /* if there are multiple update statements, update total count, otherwise use the the current count */ - be->rowcount = be->rowcount ? add_to_rowcount_accumulator(be, stdelete->nr) : stdelete->nr; - } 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, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL); - return stdelete; } @@ -5720,6 +5729,8 @@ sql_truncate(backend *be, sql_table *t, /* if there are multiple update statements, update total count, otherwise use the the current count */ be->rowcount = be->rowcount ? add_to_rowcount_accumulator(be, other->nr) : other->nr; } + if (next->s && isGlobal(next) && !isGlobalTemp(next)) + (void) stmt_dependency_change(be, next, other); } finalize: @@ -5748,10 +5759,6 @@ rel2bin_truncate(backend *be, sql_rel *r n = rel->exps->h; restart_sequences = E_ATOM_INT(n->data); cascade = E_ATOM_INT(n->next->data); - - 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, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL); - truncate = sql_truncate(be, t, restart_sequences, cascade); if (sql->cascade_action) sql->cascade_action = NULL; 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 @@ -517,6 +517,35 @@ mvc_claim_wrap(Client cntxt, MalBlkPtr m } str +mvc_add_dependency_change(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + str msg; + mvc *m = NULL; + const char *sname = *getArgReference_str(stk, pci, 1); + const char *tname = *getArgReference_str(stk, pci, 2); + lng cnt = *(lng*)getArgReference_lng(stk, pci, 3); + sql_schema *s; + sql_table *t; + + if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL) + return msg; + if ((msg = checkSQLContext(cntxt)) != NULL) + return msg; + + s = mvc_bind_schema(m, sname); + if (s == NULL) + throw(SQL, "sql.dependency_change", SQLSTATE(3F000) "Schema missing %s", sname); + t = mvc_bind_table(m, s, tname); + if (t == NULL) + throw(SQL, "sql.dependency_change", SQLSTATE(42S02) "Table missing %s.%s", sname, tname); + if (!isTable(t)) + throw(SQL, "sql.dependency_change", SQLSTATE(42000) "%s '%s' is not persistent", TABLE_TYPE_DESCRIPTION(t->type, t->properties), t->base.name); + if (cnt > 0 && !isNew(t) && isGlobal(t) && !isGlobalTemp(t) && sql_trans_add_dependency_change(m->session->tr, t->base.id, dml) != LOG_OK) + throw(SQL, "sql.dependency_change", SQLSTATE(HY013) MAL_MALLOC_FAIL); + return MAL_SUCCEED; +} + +str create_table_from_emit(Client cntxt, char *sname, char *tname, sql_emit_col *columns, size_t ncols) { size_t i; @@ -548,14 +577,14 @@ create_table_from_emit(Client cntxt, cha for (i = 0; i < ncols; i++) { BAT *b = columns[i].b; - str atoname = ATOMname(b->ttype); + const char *atomname = ATOMname(b->ttype); sql_subtype tpe; sql_column *col = NULL; - if (!strcmp(atoname, "str")) + if (!strcmp(atomname, "str")) sql_find_subtype(&tpe, "clob", 0, 0); else { - sql_subtype *t = sql_bind_localtype(atoname); + sql_subtype *t = sql_bind_localtype(atomname); if (!t) throw(SQL, "sql.catalog", SQLSTATE(3F000) "CREATE TABLE: could not find type for column"); tpe = *t; @@ -5207,6 +5236,7 @@ static mel_func sql_init_funcs[] = { command("sql", "getVersion", mvc_getVersion, false, "Return the database version identifier for a client.", args(1,2, arg("",lng),arg("clientid",int))), pattern("sql", "grow", mvc_grow_wrap, false, "Resize the tid column of a declared table.", args(1,3, arg("",int),batarg("tid",oid),argany("",1))), pattern("sql", "claim", mvc_claim_wrap, true, "Claims slots for appending rows.", args(2,6, arg("",oid),batarg("",oid),arg("mvc",int),arg("sname",str),arg("tname",str),arg("cnt",lng))), + pattern("sql", "depend", mvc_add_dependency_change, true, "Set dml dependency on current transaction for a table.", args(0,3, arg("sname",str),arg("tname",str),arg("cnt",lng))), pattern("sql", "append", mvc_append_wrap, false, "Append to the column tname.cname (possibly optimized to replace the insert bat of tname.cname. Returns sequence number for order dependence.", args(1,8, arg("",int), arg("mvc",int),arg("sname",str),arg("tname",str),arg("cname",str),arg("offset",oid),batarg("pos",oid),argany("ins",0))), pattern("sql", "update", mvc_update_wrap, false, "Update the values of the column tname.cname. Returns sequence number for order dependence)", args(1,7, arg("",int), arg("mvc",int),arg("sname",str),arg("tname",str),arg("cname",str),argany("rids",0),argany("upd",0))), pattern("sql", "clear_table", mvc_clear_table_wrap, true, "Clear the table sname.tname.", args(1,4, arg("",lng),arg("sname",str),arg("tname",str),arg("restart_sequences",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 @@ -61,6 +61,7 @@ extern str SQLmvc(Client cntxt, MalBlkPt extern str mvc_grow_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); extern str mvc_claim_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +extern str mvc_add_dependency_change(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); extern str mvc_append_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); extern str mvc_append_column(sql_trans *t, sql_column *c, BUN offset, BAT *pos, BAT *ins); diff --git a/sql/backends/monet5/sql_statement.c b/sql/backends/monet5/sql_statement.c --- a/sql/backends/monet5/sql_statement.c +++ b/sql/backends/monet5/sql_statement.c @@ -3002,6 +3002,33 @@ stmt_claim(backend *be, sql_table *t, st } stmt * +stmt_dependency_change(backend *be, sql_table *t, stmt *cnt) +{ + MalBlkPtr mb = be->mb; + InstrPtr q = NULL; + + if (!t || cnt->nr < 0) + return NULL; + q = newStmtArgs(mb, sqlRef, putName("depend"), 3); + q = pushSchema(mb, q, t); + q = pushStr(mb, q, t->base.name); + q = pushArgument(mb, q, cnt->nr); + if (q) { + stmt *s = stmt_create(be->mvc->sa, st_depend); + if(!s) { + freeInstruction(q); + return NULL; + } + s->op1 = cnt; + s->op4.tval = t; + s->nr = getDestVar(q); + s->q = q; + return s; + } + return NULL; +} + +stmt * stmt_replace(backend *be, stmt *r, stmt *id, stmt *val) { MalBlkPtr mb = be->mb; diff --git a/sql/backends/monet5/sql_statement.h b/sql/backends/monet5/sql_statement.h --- a/sql/backends/monet5/sql_statement.h +++ b/sql/backends/monet5/sql_statement.h @@ -69,6 +69,7 @@ typedef enum stmt_type { st_export, st_claim, + st_depend, st_append, st_append_bulk, st_replace, @@ -158,6 +159,7 @@ extern stmt *stmt_idxbat(backend *be, sq extern stmt *stmt_tid(backend *be, sql_table *t, int partition); extern stmt *stmt_claim(backend *be, sql_table *t, stmt *cnt); +extern stmt *stmt_dependency_change(backend *be, sql_table *t, stmt *cnt); extern stmt *stmt_append_col(backend *be, sql_column *c, stmt *offset, stmt *b, int *mvc_var_update, int locked); extern stmt *stmt_append_idx(backend *be, sql_idx *i, stmt *offset, stmt *b); extern stmt *stmt_update_col(backend *be, sql_column *c, stmt *tids, stmt *upd); diff --git a/sql/test/mapi/Tests/sql_int128.test b/sql/test/mapi/Tests/sql_int128.test --- a/sql/test/mapi/Tests/sql_int128.test +++ b/sql/test/mapi/Tests/sql_int128.test @@ -18,6 +18,8 @@ querylog.define 1 sql.affectedRows 1 +sql.depend +1 sql.mvc 1 sql.tid @@ -38,6 +40,8 @@ querylog.define 1 sql.affectedRows 1 +sql.depend +1 _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list