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

Reply via email to