Changeset: 7561d4c8aae2 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7561d4c8aae2 Modified Files: monetdb5/optimizer/opt_mitosis.c monetdb5/optimizer/opt_prelude.c monetdb5/optimizer/opt_prelude.h sql/backends/monet5/sql_optimizer.c sql/include/sql_catalog.h sql/storage/store.c Branch: default Log Message:
make sure we split all parts of a mergetable diffs (157 lines): diff --git a/monetdb5/optimizer/opt_mitosis.c b/monetdb5/optimizer/opt_mitosis.c --- a/monetdb5/optimizer/opt_mitosis.c +++ b/monetdb5/optimizer/opt_mitosis.c @@ -41,10 +41,22 @@ eligible(MalBlkPtr mb) return 1; } +static int +getVarMergeTableId(MalBlkPtr mb, int v) +{ + VarPtr p = varGetProp(mb, v, mtProp); + + if (!p) + return -1; + if (p->value.vtype == TYPE_int) + return p->value.val.ival; + return -1; +} + int OPTmitosisImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p) { - int i, j, limit, slimit, estimate = 0, pieces = 1, mito_parts = 0, mito_size = 0, row_size = 0; + int i, j, limit, slimit, estimate = 0, pieces = 1, mito_parts = 0, mito_size = 0, row_size = 0, mt = -1; str schema = 0, table = 0; wrd r = 0, rowcnt = 0; /* table should be sizeable to consider parallel execution*/ InstrPtr q, *old, target = 0; @@ -175,6 +187,7 @@ OPTmitosisImplementation(Client cntxt, M schema = getVarConstant(mb, getArg(target, 2)).val.sval; table = getVarConstant(mb, getArg(target, 3)).val.sval; + mt = getVarMergeTableId(mb, getArg(target, 0)); for (i = 0; i < limit; i++) { int upd = 0, qtpe, rtpe = 0, qv, rv; InstrPtr matq, matr = NULL; @@ -200,8 +213,12 @@ OPTmitosisImplementation(Client cntxt, M } if (p->retc == 2) upd = 1; - if (strcmp(schema, getVarConstant(mb, getArg(p, 2 + upd)).val.sval) || - strcmp(table, getVarConstant(mb, getArg(p, 3 + upd)).val.sval)) { + if (mt < 0 && (strcmp(schema, getVarConstant(mb, getArg(p, 2 + upd)).val.sval) || + strcmp(table, getVarConstant(mb, getArg(p, 3 + upd)).val.sval))) { + pushInstruction(mb, p); + continue; + } + if (mt >= 0 && getVarMergeTableId(mb, getArg(p, 0)) != mt) { pushInstruction(mb, p); continue; } diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c --- a/monetdb5/optimizer/opt_prelude.c +++ b/monetdb5/optimizer/opt_prelude.c @@ -277,6 +277,7 @@ int tlbProp; int tubProp; int horiginProp; /* original oid source */ int toriginProp; /* original oid source */ +int mtProp; void optimizerInit(void) { @@ -532,6 +533,7 @@ void optimizerInit(void) horiginProp = PropertyIndex("horigin"); toriginProp = PropertyIndex("torigin"); + mtProp = PropertyIndex("mergetable"); /* * @- * Set the optimizer debugging flag diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h --- a/monetdb5/optimizer/opt_prelude.h +++ b/monetdb5/optimizer/opt_prelude.h @@ -275,4 +275,5 @@ opt_export int tlbProp; /* any (tail l opt_export int tubProp; /* any (tail upper bound) */ opt_export int horiginProp; /* original oid source */ opt_export int toriginProp; /* original oid source */ +opt_export int mtProp; /* enclosing merge table (id) */ #endif diff --git a/sql/backends/monet5/sql_optimizer.c b/sql/backends/monet5/sql_optimizer.c --- a/sql/backends/monet5/sql_optimizer.c +++ b/sql/backends/monet5/sql_optimizer.c @@ -116,7 +116,7 @@ SQLgetStatistics(Client cntxt, mvc *m, M char *sname = getVarConstant(mb, getArg(p, 2 + upd)).val.sval; char *tname = getVarConstant(mb, getArg(p, 3 + upd)).val.sval; char *cname = NULL; - int not_null = 0; + int not_null = 0, mt_member = 0; wrd rows = 1; /* default to cope with delta bats */ int mode = 0; int k = getArg(p, 0); @@ -147,6 +147,8 @@ SQLgetStatistics(Client cntxt, mvc *m, M BBPunfix(b->batCacheid); } rows = (wrd) cnt; + if (i->t->p) + mt_member = i->t->p->base.id; } } else if (s && f == bindRef && cname) { size_t cnt; @@ -167,12 +169,16 @@ SQLgetStatistics(Client cntxt, mvc *m, M BBPunfix(b->batCacheid); } rows = (wrd) cnt; + if (c->t->p) + mt_member = c->t->p->base.id; } } if (rows > 1 && mode != RD_INS) varSetProp(mb, k, rowsProp, op_eq, VALset(&vr, TYPE_wrd, &rows)); if (not_null) varSetProp(mb, k, notnilProp, op_eq, NULL); + if (mt_member && mode != RD_INS) + varSetProp(mb, k, mtProp, op_eq, VALset(&vr, TYPE_int, &mt_member)); { int lowprop = hlbProp, highprop = hubProp; diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h --- a/sql/include/sql_catalog.h +++ b/sql/include/sql_catalog.h @@ -488,7 +488,7 @@ typedef struct sql_table { int cleared; /* cleared in the current transaction */ void *data; struct sql_schema *s; - struct sql_table *p; + struct sql_table *p; /* The table is part of this merge table */ } sql_table; typedef struct res_col { diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -903,7 +903,7 @@ load_schema(sql_trans *tr, sqlid id, oid cs_add(&s->types, load_type(tr, s, rid), TR_OLD); table_funcs.rids_destroy(rs); - /* second tables (and complex types) */ + /* second tables */ table_schema = find_sql_column(tables, "schema_id"); table_id = find_sql_column(tables, "id"); rs = table_funcs.rids_select(tr, table_schema, &sid, &sid, table_id, &id, NULL, NULL); @@ -3994,6 +3994,7 @@ sql_trans_del_table(sql_trans *tr, sql_t cs_del(&mt->tables, n, pt->base.flag); mt->s->base.wtime = mt->base.wtime = tr->wtime = tr->wstime; table_funcs.table_delete(tr, sysobj, rid); + pt->p = NULL; if (drop_action == DROP_CASCADE) sql_trans_drop_table(tr, pt->s, pt->base.id, drop_action); return mt; @@ -4279,8 +4280,6 @@ drop_sql_key(sql_table *t, int id, int d cs_del(&t->keys, n, TR_OLD); } - - void sql_trans_drop_column(sql_trans *tr, sql_table *t, int id, int drop_action) { _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list