Changeset: 6e2d69f9d43c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6e2d69f9d43c
Modified Files:
sql/backends/monet5/sql.c
sql/backends/monet5/sql.h
sql/storage/bat/bat_storage.c
sql/storage/sql_storage.h
Branch: copybinary
Log Message:
Expose update_prep and update_exec at the MAL level
diffs (271 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
@@ -1717,10 +1717,26 @@ mvc_append_wrap(Client cntxt, MalBlkPtr
return MAL_SUCCEED;
}
+static str mvc_modify_prep(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci, modify_col_prep_fptr colprep, modify_idx_prep_fptr idxprep);
+
// chain_out, cookie_1, ..., cookie_N := sql.append_prep(chain_in, s, t, c_1,
... c_N);
str
mvc_append_prep_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
+ return mvc_modify_prep(cntxt, mb, stk, pci,
store_funcs.append_col_prep, store_funcs.append_idx_prep);
+}
+
+// chain_out, cookie_1, ..., cookie_N := sql.update_prep(chain_in, s, t, c_1,
... c_N);
+str
+mvc_update_prep_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ return mvc_modify_prep(cntxt, mb, stk, pci,
store_funcs.update_col_prep, store_funcs.update_idx_prep);
+}
+
+// chain_out, cookie_1, ..., cookie_N := sql.{update,modify}_prep(chain_in, s,
t, c_1, ... c_N);
+static str
+mvc_modify_prep(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci,
modify_col_prep_fptr colprep, modify_idx_prep_fptr idxprep)
+{
int *chain_out = getArgReference_int(stk, pci, 0);
int chain_in = *getArgReference_int(stk, pci, pci->retc);
mvc *m = NULL;
@@ -1741,9 +1757,9 @@ mvc_append_prep_wrap(Client cntxt, MalBl
*chain_out = chain_in;
if (strNil(sname))
- throw(SQL, "sql.append_prep", SQLSTATE(42000) "schema name is
nil");
+ throw(SQL, "sql.modify_prep", SQLSTATE(42000) "schema name is
nil");
if (strNil(tname))
- throw(SQL, "sql.append_prep", SQLSTATE(42000) "table name is
nil");
+ throw(SQL, "sql.modify_prep", SQLSTATE(42000) "table name is
nil");
if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
return msg;
@@ -1751,29 +1767,29 @@ mvc_append_prep_wrap(Client cntxt, MalBl
return msg;
s = mvc_bind_schema(m, sname);
if (s == NULL)
- throw(SQL, "sql.append_prep", SQLSTATE(3F000) "Schema missing
%s", sname);
+ throw(SQL, "sql.modify_prep", SQLSTATE(3F000) "Schema missing
%s", sname);
t = mvc_bind_table(m, s, tname);
if (t == NULL)
- throw(SQL, "sql.append_prep", SQLSTATE(42S02) "Table missing
%s.%s", sname, tname);
+ throw(SQL, "sql.modify_prep", SQLSTATE(42S02) "Table missing
%s.%s", sname, tname);
for (int i = 0; i < ncolumns; i++) {
const char *cname = *getArgReference_str(stk, pci, first_col +
i);
ptr *cookie_out = getArgReference_ptr(stk, pci, first_ret + i);
if (strNil(cname))
- throw(SQL, "sql.append_prep", SQLSTATE(42000) "column
name %d is nil", i);
+ throw(SQL, "sql.modify_prep", SQLSTATE(42000) "column
name %d is nil", i);
bool is_column = cname[0] != '%';
if (is_column) {
sql_column *c = mvc_bind_column(m, t, cname);
if (c == NULL)
- throw(SQL, "sql.append_prep", SQLSTATE(42S02)
"Column missing %s.%s.%s", sname, tname, cname);
- *cookie_out =
store_funcs.append_col_prep(m->session->tr, c);
+ throw(SQL, "sql.modify_prep", SQLSTATE(42S02)
"Column missing %s.%s.%s", sname, tname, cname);
+ *cookie_out = colprep(m->session->tr, c);
} else {
sql_idx *i = mvc_bind_idx(m, s, cname + 1);
if (i == NULL)
- throw(SQL, "sql.append_prep", SQLSTATE(42S02)
"Index missing %s.%s.%s", sname, tname, cname);
- *cookie_out =
store_funcs.append_idx_prep(m->session->tr, i);
+ throw(SQL, "sql.modify_prep", SQLSTATE(42S02)
"Index missing %s.%s.%s", sname, tname, cname);
+ *cookie_out = idxprep(m->session->tr, i);
}
}
@@ -1797,7 +1813,7 @@ mvc_append_exec_wrap(Client cntxt, MalBl
bat batid = *(bat*)incoming;
BAT *b = BATdescriptor(batid);
if (b == NULL)
- throw(SQL, "sql.append_bat_exec", SQLSTATE(HY005)
"Cannot access column descriptor");
+ throw(SQL, "sql.append_exec", SQLSTATE(HY005) "Cannot
access column descriptor");
if (BATcount(b) > 4096 && !b->batTransient)
BATmsync(b);
@@ -1816,6 +1832,41 @@ mvc_append_exec_wrap(Client cntxt, MalBl
return MAL_SUCCEED;
}
+// sql.update_exec(cookie_1, cand_1, bat_1);
+str
+mvc_update_exec_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ (void) cntxt;
+ (void) mb;
+ int ret;
+ ptr cookie = *getArgReference_ptr(stk, pci, 1);
+ bat tids_bat = *getArgReference_bat(stk, pci, 2);
+ bat incoming_bat = *getArgReference_bat(stk, pci, 3);
+
+ BAT *data = BATdescriptor(incoming_bat);
+ if (data == NULL)
+ throw(SQL, "sql.update_exec", SQLSTATE(HY005) "Cannot access
column descriptor");
+ if (BATcount(data) > 4096 && !data->batTransient)
+ BATmsync(data);
+
+ BAT *tids = BATdescriptor(tids_bat);
+ if (tids == NULL) {
+ BBPunfix(data->batCacheid);
+ throw(SQL, "sql.update_exec", SQLSTATE(HY005) "Cannot access
column descriptor");
+ }
+ if (BATcount(tids) > 4096 && !tids->batTransient)
+ BATmsync(tids);
+
+ ret = store_funcs.update_col_exec(cookie, tids, data, true);
+ BBPunfix(data->batCacheid);
+ BBPunfix(tids->batCacheid);
+
+ if (ret != LOG_OK)
+ throw(SQL, "sql_update_exec", GDK_EXCEPTION);
+
+ return MAL_SUCCEED;
+}
+
// chain_out := sql.append_prep(chain_in, cookie_1, ... cookie_N);
str
@@ -5398,7 +5449,8 @@ static mel_func sql_init_funcs[] = {
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", "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.",
+ 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,6,
arg("",int),
arg("mvc",int),arg("sname",str),arg("tname",str),arg("cname",str),argany("ins",0))),
@@ -5408,14 +5460,12 @@ static mel_func sql_init_funcs[] = {
args(2,6,
arg("",int),vararg("",ptr),
arg("mvc",int),arg("sname",str),arg("tname",str),vararg("cname",str))),
+
pattern("sql", "append_exec", mvc_append_exec_wrap, false, "Perform the
actual append",
args(1,3,
arg("",ptr),
arg("cookie",ptr),argany("ins",1))),
- // tmp_1, cookie_1 := sql.append_prep(chain_0, s, t, c_1);
- // done_1 := sql.append_exec(cookie_1, bat_1);
-
pattern("sql", "append_finish", mvc_append_finish_wrap, false,
"Reconvene the sql.append_prep/sql.append_exec workflow",
args(1,3,
@@ -5423,9 +5473,24 @@ static mel_func sql_init_funcs[] = {
arg("mvc",int),vararg("cookie",ptr))),
-
-
- 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", "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", "update_prep", mvc_update_prep_wrap, false,
+ "Prepare to append to the column. Return new mvc state and cookie to
pass to update_exec",
+ args(2,6,
+ arg("",int),vararg("",ptr),
+
arg("mvc",int),arg("sname",str),arg("tname",str),vararg("cname",str))),
+
+ pattern("sql", "update_exec", mvc_update_exec_wrap, false, "Perform the
actual update",
+ args(1,4,
+ arg("",ptr),
+ arg("cookie",ptr),batarg("rids",oid), batargany("values",1))),
+
pattern("sql", "clear_table", mvc_clear_table_wrap, true, "Clear the table
sname.tname.", args(1,3, arg("",lng),arg("sname",str),arg("tname",str))),
pattern("sql", "tid", SQLtid, false, "Return a column with the valid tuple
identifiers associated with the table sname.tname.", args(1,4,
batarg("",oid),arg("mvc",int),arg("sname",str),arg("tname",str))),
pattern("sql", "tid", SQLtid, false, "Return the tables tid column.",
args(1,6,
batarg("",oid),arg("mvc",int),arg("sname",str),arg("tname",str),arg("part_nr",int),arg("nr_parts",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
@@ -72,6 +72,8 @@ sql5_export str mvc_append_finish_wrap(C
sql5_export str mvc_append_column(sql_trans *t, sql_column *c, BAT *ins);
sql5_export str mvc_update_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
+sql5_export str mvc_update_prep_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
+sql5_export str mvc_update_exec_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
sql5_export str mvc_bind_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str mvc_delta_values(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str mvc_bind_idxbat_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
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
@@ -3154,16 +3154,18 @@ bat_storage_init( store_functions *sf)
sf->bind_del_data = (bind_del_data_fptr)&bind_del_data;
sf->append_col = (append_col_fptr)&append_col;
- sf->append_col_prep = (append_col_prep_fptr)&append_col_prepare;
+ sf->append_idx = (append_idx_fptr)&append_idx;
+ sf->append_col_prep = (modify_col_prep_fptr)&append_col_prepare;
+ sf->append_idx_prep = (modify_idx_prep_fptr)&append_idx_prepare;
sf->append_col_exec = (append_col_exec_fptr)&append_col_execute;
- sf->append_idx = (append_idx_fptr)&append_idx;
- sf->append_idx_prep = (append_idx_prep_fptr)&append_idx_prepare;
sf->update_col = (update_col_fptr)&update_col;
- sf->update_col_prep = (update_col_prep_fptr)&update_col_prepare;
+ sf->update_idx = (update_idx_fptr)&update_idx;
+
+
+ sf->update_col_prep = (modify_col_prep_fptr)&update_col_prepare;
+ sf->update_idx_prep = (modify_idx_prep_fptr)&update_idx_prepare;
sf->update_col_exec = (update_col_exec_fptr)&update_col_execute;
- sf->update_idx = (update_idx_fptr)&update_idx;
- sf->update_idx_prep = (update_idx_prep_fptr)&update_idx_prepare;
sf->delete_tab = (delete_tab_fptr)&delete_tab;
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
@@ -136,15 +136,16 @@ typedef void *(*bind_del_data_fptr) (sql
-- append/update to columns and indices
*/
typedef int (*append_col_fptr) (sql_trans *tr, sql_column *c, void *d, int t);
-typedef void *(*append_col_prep_fptr) (sql_trans *tr, sql_column *c);
-typedef int (*append_col_exec_fptr) (void *dlt, void *b, bool is_bat);
typedef int (*append_idx_fptr) (sql_trans *tr, sql_idx *i, void *d, int t);
-typedef void *(*append_idx_prep_fptr) (sql_trans *tr, sql_idx *i);
typedef int (*update_col_fptr) (sql_trans *tr, sql_column *c, void *tids, void
*d, int t);
-typedef void* (*update_col_prep_fptr)(sql_trans *tr, sql_column *c);
-typedef int (*update_col_exec_fptr)(void *incoming_delta, void *incoming_tids,
void *incoming_values, bool is_bat);
typedef int (*update_idx_fptr) (sql_trans *tr, sql_idx *i, void *tids, void
*d, int t);
-typedef void* (*update_idx_prep_fptr)(sql_trans *tr, sql_idx *c);
+
+typedef void *(*modify_col_prep_fptr) (sql_trans *tr, sql_column *c);
+typedef void *(*modify_idx_prep_fptr) (sql_trans *tr, sql_idx *i);
+
+typedef int (*append_col_exec_fptr) (void *dlt, void *b, bool is_bat);
+typedef int (*update_col_exec_fptr) (void *incoming_delta, void
*incoming_tids, void *incoming_values, bool is_bat);
+
typedef int (*delete_tab_fptr) (sql_trans *tr, sql_table *t, void *d, int tpe);
/*
@@ -242,16 +243,16 @@ typedef struct store_functions {
bind_del_data_fptr bind_del_data;
append_col_fptr append_col;
- append_col_prep_fptr append_col_prep;
+ modify_col_prep_fptr append_col_prep;
append_col_exec_fptr append_col_exec;
append_idx_fptr append_idx;
- append_idx_prep_fptr append_idx_prep;
+ modify_idx_prep_fptr append_idx_prep;
update_col_fptr update_col;
- update_col_prep_fptr update_col_prep;
+ modify_col_prep_fptr update_col_prep;
update_col_exec_fptr update_col_exec;
update_idx_fptr update_idx;
- update_idx_prep_fptr update_idx_prep;
+ modify_idx_prep_fptr update_idx_prep;
delete_tab_fptr delete_tab;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list