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