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

Reply via email to