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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list