Changeset: 7260debe9b71 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7260debe9b71
Modified Files:
        monetdb5/optimizer/opt_parappend.c
        sql/backends/monet5/sql.c
        sql/storage/bat/bat_storage.c
        sql/storage/sql_storage.h
Branch: copybinary
Log Message:

Append to index in parallel with regular appends


diffs (135 lines):

diff --git a/monetdb5/optimizer/opt_parappend.c 
b/monetdb5/optimizer/opt_parappend.c
--- a/monetdb5/optimizer/opt_parappend.c
+++ b/monetdb5/optimizer/opt_parappend.c
@@ -130,14 +130,6 @@ transform(parstate *state, Client cntxt,
                return MAL_SUCCEED;
        }
 
-       const char *cname = getVarConstant(mb, cname_var).val.sval;
-       if (cname[0] == '%') {
-               // don't touch indices
-               flush_finish_stmt(state, mb);
-               pushInstruction(mb, old);
-               return MAL_SUCCEED;
-       }
-
        *actions += 1;
 
        int cookie_var = setup_append_prep(state, cntxt, mb, old);
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
@@ -1729,7 +1729,6 @@ mvc_append_prep_wrap(Client cntxt, MalBl
        const char *tname = *getArgReference_str(stk, pci, pci->retc + 2);
        sql_schema *s;
        sql_table *t;
-       sql_column *c;
 
        // for N columns, we ought to have N + 1 return values and N + 3 
parameters.
        int first_col = pci->retc + 3;
@@ -1763,16 +1762,19 @@ mvc_append_prep_wrap(Client cntxt, MalBl
 
                if (strNil(cname))
                        throw(SQL, "sql.append_prep", SQLSTATE(42000) "column 
name %d is nil", i);
-               if (cname[0] == '%')
-                       throw(SQL, "sql.append_prep", SQLSTATE(42000) 
"sql.append_prep not intended for indices: %s.%s.%s", sname, tname, cname);
-
-               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);
-
-               void *cookie = store_funcs.append_col_prep(m->session->tr, c);
-
-               *cookie_out = cookie;
+
+               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);
+               } 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);
+               }
        }
 
        return MAL_SUCCEED;
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
@@ -896,26 +896,29 @@ append_col(sql_trans *tr, sql_column *c,
        return ok;
 }
 
-static int
-append_idx(sql_trans *tr, sql_idx * i, void *ib, int tpe)
+static void*
+append_idx_prepare(sql_trans *tr, sql_idx *i)
 {
-       int ok = LOG_OK;
-       BAT *b = ib;
-       sql_delta *bat;
-
-       if (tpe == TYPE_bat && !BATcount(b))
-               return ok;
-
        if (bind_idx_data(tr, i) == LOG_ERR)
+               return NULL;
+
+       sql_delta *delta = i->data;
+
+       /* appends only write */
+       delta->wtime = i->base.wtime = i->t->base.wtime = i->t->s->base.wtime = 
tr->wtime = tr->wstime;
+
+       return delta;
+}
+
+static int
+append_idx(sql_trans *tr, sql_idx * i, void *data, int tpe)
+{
+       sql_delta *delta = append_idx_prepare(tr, i);
+       if (delta == NULL)
                return LOG_ERR;
 
-       bat = i->data;
-       /* appends only write */
-       bat->wtime = i->base.wtime = i->t->base.wtime = i->t->s->base.wtime = 
tr->wtime = tr->wstime;
-       if (tpe == TYPE_bat)
-               ok = delta_append_bat(bat, ib);
-       else
-               ok = delta_append_val(bat, ib);
+       int ok = append_col_execute(delta, data, tpe == TYPE_bat);
+
        return ok;
 }
 
@@ -3128,6 +3131,7 @@ bat_storage_init( store_functions *sf)
        sf->append_col_prep = (append_col_prep_fptr)&append_col_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_idx = (update_idx_fptr)&update_idx;
        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
@@ -139,6 +139,7 @@ typedef int (*append_col_fptr) (sql_tran
 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 int (*update_idx_fptr) (sql_trans *tr, sql_idx *i, void *tids, void 
*d, int t);
 typedef int (*delete_tab_fptr) (sql_trans *tr, sql_table *t, void *d, int tpe);
@@ -241,6 +242,7 @@ typedef struct store_functions {
        append_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;
        update_col_fptr update_col;
        update_idx_fptr update_idx;
        delete_tab_fptr delete_tab;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to