Changeset: 157a4c40de30 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=157a4c40de30
Modified Files:
sql/backends/monet5/sql.c
sql/storage/bat/bat_storage.c
sql/storage/sql_storage.h
Branch: default
Log Message:
Use storage functions to get the number of rows in each delta instead of using
mvc_bind calls.
diffs (118 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
@@ -1097,26 +1097,12 @@ mvc_bind_wrap(Client cntxt, MalBlkPtr mb
throw(SQL, "sql.bind", SQLSTATE(42000) "unable to find %s(%s)", tname,
cname);
}
-static str
-append_bat_delta_size(mvc *m, BAT* res, const char *sname, const char *tname,
const char *cname, int delta)
-{
- gdk_return ores;
- lng count;
- BAT *o = mvc_bind(m, sname, tname, cname, delta);
- if (!o)
- throw(SQL,"sql.delta", SQLSTATE(HY005) "Cannot access the
column %s.%s.%s", sname, tname, cname);
- count = BATcount(o);
- ores = BUNappend(res, &count, false);
- BBPunfix(o->batCacheid);
- if (ores != GDK_SUCCEED)
- throw(SQL,"sql.delta", SQLSTATE(HY001) MAL_MALLOC_FAIL);
- return MAL_SUCCEED;
-}
-
/* The output of this function is a lng bat with:
* - A flag indicating if the column's upper table is cleared or not.
- * - RDONLY, RD_INS and RD_UPD_ID delta counts for the input column (each in
a separate row)
- * - number of deletes of the column's table
+ * - Number of read-only values of the column (inherited from the previous
transaction).
+ * - Number of inserted rows during the current transaction.
+ * - Number of updated rows during the current transaction.
+ * - Number of deletes of the column's table.
* - the number in the transaction chain (.i.e for each savepoint a new
transaction is added in the chain)
* If the table is cleared, the values RDONLY, RD_INS and RD_UPD_ID and the
number of deletes will be 0.
*/
@@ -1134,7 +1120,8 @@ mvc_delta_values(Client cntxt, MalBlkPtr
sql_trans *tr;
sql_schema *s = NULL;
sql_table *t = NULL;
- lng level = 0, deletes, cleared;
+ sql_column *c = NULL;
+ lng level = 0, cleared, all, readonly, inserted, updates, deletes;
if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
goto cleanup;
@@ -1151,6 +1138,8 @@ mvc_delta_values(Client cntxt, MalBlkPtr
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);
if ((b = COLnew(0, TYPE_lng, 6, TRANSIENT)) == NULL) {
msg = createException(SQL, "sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
@@ -1163,14 +1152,23 @@ mvc_delta_values(Client cntxt, MalBlkPtr
goto cleanup;
}
- if ((msg = append_bat_delta_size(m, b, sname, tname, cname, RDONLY)))
- goto cleanup;
- if ((msg = append_bat_delta_size(m, b, sname, tname, cname, RD_INS)))
+ 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;
+ if (BUNappend(b, &readonly, false) != GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
goto cleanup;
- if ((msg = append_bat_delta_size(m, b, sname, tname, cname, RD_UPD_ID)))
+ }
+ if (BUNappend(b, &inserted, false) != GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
goto cleanup;
-
- deletes = (lng) store_funcs.count_del(m->session->tr, t);
+ }
+ if (BUNappend(b, &updates, false) != GDK_SUCCEED) {
+ msg = createException(SQL,"sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
if (BUNappend(b, &deletes, false) != GDK_SUCCEED) {
msg = createException(SQL,"sql.delta", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
goto cleanup;
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -3075,6 +3075,7 @@ bat_storage_init( store_functions *sf)
sf->count_del = (count_del_fptr)&count_del;
sf->count_upd = (count_upd_fptr)&count_upd;
sf->count_col = (count_col_fptr)&count_col;
+ sf->count_col_upd = (count_col_upd_fptr)&count_col_upd;
sf->count_idx = (count_idx_fptr)&count_idx;
sf->dcount_col = (dcount_col_fptr)&dcount_col;
sf->sorted_col = (prop_col_fptr)&sorted_col;
@@ -3118,4 +3119,3 @@ bat_storage_init( store_functions *sf)
sf->gtrans_update = (gtrans_update_fptr)>r_update;
sf->gtrans_minmax = (gtrans_update_fptr)>r_minmax;
}
-
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -137,6 +137,7 @@ typedef int (*delete_tab_fptr) (sql_tran
typedef size_t (*count_del_fptr) (sql_trans *tr, sql_table *t);
typedef size_t (*count_upd_fptr) (sql_trans *tr, sql_table *t);
typedef size_t (*count_col_fptr) (sql_trans *tr, sql_column *c, int all /* all
or new only */);
+typedef size_t (*count_col_upd_fptr) (sql_trans *tr, sql_column *c);
typedef size_t (*count_idx_fptr) (sql_trans *tr, sql_idx *i, int all /* all or
new only */);
typedef size_t (*dcount_col_fptr) (sql_trans *tr, sql_column *c);
typedef int (*prop_col_fptr) (sql_trans *tr, sql_column *c);
@@ -226,6 +227,7 @@ typedef struct store_functions {
count_del_fptr count_del;
count_upd_fptr count_upd;
count_col_fptr count_col;
+ count_col_upd_fptr count_col_upd;
count_idx_fptr count_idx;
dcount_col_fptr dcount_col;
prop_col_fptr sorted_col;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list