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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list