Changeset: 9245a489a85a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9245a489a85a
Modified Files:
sql/backends/monet5/sql.c
sql/backends/monet5/sql.mal
Branch: Apr2019
Log Message:
Added sys.deltas version for schemas' tables columns and table's columns.
diffs (truncated from 302 to 300 lines):
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
@@ -1106,9 +1106,9 @@ mvc_bind_wrap(Client cntxt, MalBlkPtr mb
str
mvc_delta_values(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- const char *sname = *getArgReference_str(stk, pci, 7);
- const char *tname = *getArgReference_str(stk, pci, 8);
- const char *cname = *getArgReference_str(stk, pci, 9);
+ const char *sname = *getArgReference_str(stk, pci, 7),
+ *tname = (pci->argc > 8) ? *getArgReference_str(stk,
pci, 8) : NULL,
+ *cname = (pci->argc > 9) ? *getArgReference_str(stk,
pci, 9) : NULL;
mvc *m;
str msg = MAL_SUCCEED;
BAT *col1 = NULL, *col2 = NULL, *col3 = NULL, *col4 = NULL, *col5 =
NULL, *col6 = NULL, *col7 = NULL;
@@ -1123,93 +1123,202 @@ mvc_delta_values(Client cntxt, MalBlkPtr
sql_schema *s = NULL;
sql_table *t = NULL;
sql_column *c = NULL;
+ node *n;
bool cleared;
int level = 0;
- lng all, readonly, inserted, updates, deletes;
+ lng nrows = 0, all, readonly, inserted, updates, deletes;
if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
goto cleanup;
if ((msg = checkSQLContext(cntxt)) != NULL)
goto cleanup;
- if (!sname || strcmp(sname, str_nil) == 0 || *sname == '\0')
- throw(SQL, "sql.delta", SQLSTATE(3F000) "Invalid schema name");
- if (!tname || strcmp(tname, str_nil) == 0 || *tname == '\0')
- throw(SQL, "sql.delta", SQLSTATE(3F000) "Invalid table name");
- if (!cname || strcmp(cname, str_nil) == 0 || *cname == '\0')
- throw(SQL, "sql.delta", SQLSTATE(3F000) "Invalid column name");
if (!(s = mvc_bind_schema(m, sname)))
throw(SQL, "sql.delta", SQLSTATE(3F000) "No such schema '%s'",
sname);
- if (!(t = mvc_bind_table(m, s, tname)))
- throw(SQL, "sql.delta", SQLSTATE(3F000) "No such table '%s' in
schema '%s'", tname, s->base.name);
- if (!(c = mvc_bind_column(m, t, cname)))
- throw(SQL, "sql.delta", SQLSTATE(3F000) "No such column '%s' in
table '%s'", cname, t->base.name);
-
- cleared = (t->cleared != 0);
- inserted = (lng) store_funcs.count_col(m->session->tr, c, 0);
- all = (lng) store_funcs.count_col(m->session->tr, c, 1);
- updates = (lng) store_funcs.count_col_upd(m->session->tr, c);
- deletes = (lng) store_funcs.count_del(m->session->tr, t);
- readonly = all - inserted;
- tr = m->session->tr;
- while((tr = tr->parent)) level++;
-
- if ((col1 = COLnew(0, TYPE_int, 1, TRANSIENT)) == NULL) {
+
+ if (tname) {
+ if (!(t = mvc_bind_table(m, s, tname)))
+ throw(SQL, "sql.delta", SQLSTATE(3F000) "No such table
'%s' in schema '%s'", tname, s->base.name);
+ if (isView(t))
+ throw(SQL, "sql.delta", SQLSTATE(42000) "Views don't
have delta values");
+ if (isMergeTable(t))
+ throw(SQL, "sql.delta", SQLSTATE(42000) "Merge tables
don't have delta values");
+ if (isStream(t))
+ throw(SQL, "sql.delta", SQLSTATE(42000) "Stream tables
don't have delta values");
+ if (isRemote(t))
+ throw(SQL, "sql.delta", SQLSTATE(42000) "Remote tables
don't have delta values");
+ if (isReplicaTable(t))
+ throw(SQL, "sql.delta", SQLSTATE(42000) "Replica tables
don't have delta values");
+ if (cname) {
+ if (!(c = mvc_bind_column(m, t, cname)))
+ throw(SQL, "sql.delta", SQLSTATE(3F000) "No
such column '%s' in table '%s'", cname, t->base.name);
+ nrows = 1;
+ } else {
+ nrows = t->columns.set->cnt;
+ }
+ } else {
+ for (n = s->tables.set->h; n ; n = n->next) {
+ t = (sql_table *) n->data;
+ if (!(isView(t) || isMergeTable(t) || isStream(t) ||
isRemote(t) || isReplicaTable(t)))
+ nrows += t->columns.set->cnt;
+ }
+ }
+ assert(nrows);
+
+ if ((col1 = COLnew(0, TYPE_int, nrows, TRANSIENT)) == NULL) {
msg = createException(SQL, "sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
goto cleanup;
}
- if ((col2 = COLnew(0, TYPE_bit, 1, TRANSIENT)) == NULL) {
+ if ((col2 = COLnew(0, TYPE_bit, nrows, TRANSIENT)) == NULL) {
+ msg = createException(SQL, "sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if ((col3 = COLnew(0, TYPE_lng, nrows, TRANSIENT)) == NULL) {
msg = createException(SQL, "sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
goto cleanup;
}
- if ((col3 = COLnew(0, TYPE_lng, 1, TRANSIENT)) == NULL) {
+ if ((col4 = COLnew(0, TYPE_lng, nrows, TRANSIENT)) == NULL) {
msg = createException(SQL, "sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
goto cleanup;
}
- if ((col4 = COLnew(0, TYPE_lng, 1, TRANSIENT)) == NULL) {
+ if ((col5 = COLnew(0, TYPE_lng, nrows, TRANSIENT)) == NULL) {
+ msg = createException(SQL, "sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if ((col6 = COLnew(0, TYPE_lng, nrows, TRANSIENT)) == NULL) {
+ msg = createException(SQL, "sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if ((col7 = COLnew(0, TYPE_int, nrows, TRANSIENT)) == NULL) {
msg = createException(SQL, "sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
goto cleanup;
}
- if ((col5 = COLnew(0, TYPE_lng, 1, TRANSIENT)) == NULL) {
- msg = createException(SQL, "sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto cleanup;
- }
- if ((col6 = COLnew(0, TYPE_lng, 1, TRANSIENT)) == NULL) {
- msg = createException(SQL, "sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto cleanup;
- }
- if ((col7 = COLnew(0, TYPE_int, 1, TRANSIENT)) == NULL) {
- msg = createException(SQL, "sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto cleanup;
- }
-
- if (BUNappend(col1, &c->base.id, false) != GDK_SUCCEED) {
- msg = createException(SQL,"sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto cleanup;
- }
- if (BUNappend(col2, &cleared, false) != GDK_SUCCEED) {
- msg = createException(SQL,"sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto cleanup;
- }
- if (BUNappend(col3, &readonly, false) != GDK_SUCCEED) {
- msg = createException(SQL,"sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto cleanup;
- }
- if (BUNappend(col4, &inserted, false) != GDK_SUCCEED) {
- msg = createException(SQL,"sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto cleanup;
- }
- if (BUNappend(col5, &updates, false) != GDK_SUCCEED) {
- msg = createException(SQL,"sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto cleanup;
- }
- if (BUNappend(col6, &deletes, false) != GDK_SUCCEED) {
- msg = createException(SQL,"sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto cleanup;
- }
- if (BUNappend(col7, &level, false) != GDK_SUCCEED) {
- msg = createException(SQL,"sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto cleanup;
+
+ tr = m->session->tr;
+ while((tr = tr->parent)) level++;
+
+ if (tname) {
+ cleared = (t->cleared != 0);
+ deletes = (lng) store_funcs.count_del(m->session->tr, t);
+ if (cname) {
+ inserted = (lng) store_funcs.count_col(m->session->tr,
c, 0);
+ all = (lng) store_funcs.count_col(m->session->tr, c, 1);
+ updates = (lng)
store_funcs.count_col_upd(m->session->tr, c);
+ readonly = all - inserted;
+
+ if (BUNappend(col1, &c->base.id, false) != GDK_SUCCEED)
{
+ msg = createException(SQL,"sql.delta",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col2, &cleared, false) != GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col3, &readonly, false) != GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col4, &inserted, false) != GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col5, &updates, false) != GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col6, &deletes, false) != GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col7, &level, false) != GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ } else {
+ for (n = t->columns.set->h; n ; n = n->next) {
+ c = (sql_column*) n->data;
+
+ inserted = (lng)
store_funcs.count_col(m->session->tr, c, 0);
+ all = (lng)
store_funcs.count_col(m->session->tr, c, 1);
+ updates = (lng)
store_funcs.count_col_upd(m->session->tr, c);
+ readonly = all - inserted;
+
+ if (BUNappend(col1, &c->base.id, false) !=
GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col2, &cleared, false) !=
GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col3, &readonly, false) !=
GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col4, &inserted, false) !=
GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col5, &updates, false) !=
GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col6, &deletes, false) !=
GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col7, &level, false) !=
GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ }
+ }
+ } else {
+ for (n = s->tables.set->h; n ; n = n->next) {
+ t = (sql_table *) n->data;
+ if (!(isView(t) || isMergeTable(t) || isStream(t) ||
isRemote(t) || isReplicaTable(t))) {
+ cleared = (t->cleared != 0);
+ deletes = (lng)
store_funcs.count_del(m->session->tr, t);
+
+ for (node *nn = t->columns.set->h; nn ; nn =
nn->next) {
+ c = (sql_column*) nn->data;
+
+ inserted = (lng)
store_funcs.count_col(m->session->tr, c, 0);
+ all = (lng)
store_funcs.count_col(m->session->tr, c, 1);
+ updates = (lng)
store_funcs.count_col_upd(m->session->tr, c);
+ readonly = all - inserted;
+
+ if (BUNappend(col1, &c->base.id, false)
!= GDK_SUCCEED) {
+ msg =
createException(SQL,"sql.delta", SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col2, &cleared, false) !=
GDK_SUCCEED) {
+ msg =
createException(SQL,"sql.delta", SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col3, &readonly, false)
!= GDK_SUCCEED) {
+ msg =
createException(SQL,"sql.delta", SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col4, &inserted, false)
!= GDK_SUCCEED) {
+ msg =
createException(SQL,"sql.delta", SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col5, &updates, false) !=
GDK_SUCCEED) {
+ msg =
createException(SQL,"sql.delta", SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col6, &deletes, false) !=
GDK_SUCCEED) {
+ msg =
createException(SQL,"sql.delta", SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ if (BUNappend(col7, &level, false) !=
GDK_SUCCEED) {
+ msg =
createException(SQL,"sql.delta", SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+ }
+ }
+ }
}
cleanup:
diff --git a/sql/backends/monet5/sql.mal b/sql/backends/monet5/sql.mal
--- a/sql/backends/monet5/sql.mal
+++ b/sql/backends/monet5/sql.mal
@@ -113,6 +113,14 @@ unsafe pattern restart( sname:str, seque
address mvc_restart_seq
comment "restart the sequence with value start";
+pattern deltas( schema:str
)(ids:bat[:int],cleared:bat[:bit],readonly:bat[:lng],inserted:bat[:lng],updated:bat[:lng],deleted:bat[:lng],tr_level:bat[:int])
+address mvc_delta_values
+comment "Return the delta values sizes of all columns of the schema's tables,
plus the current transaction level";
+
+pattern deltas( schema:str, table:str
)(ids:bat[:int],cleared:bat[:bit],readonly:bat[:lng],inserted:bat[:lng],updated:bat[:lng],deleted:bat[:lng],tr_level:bat[:int])
+address mvc_delta_values
+comment "Return the delta values sizes from the table's columns, plus the
current transaction level";
+
pattern deltas( schema:str, table:str, column:str
)(ids:bat[:int],cleared:bat[:bit],readonly:bat[:lng],inserted:bat[:lng],updated:bat[:lng],deleted:bat[:lng],tr_level:bat[:int])
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list