Changeset: 66cc6b90ef1c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/66cc6b90ef1c
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/include/sql_catalog.h
        sql/server/rel_basetable.c
        sql/server/rel_basetable.h
        sql/server/rel_exp.c
        sql/server/rel_multiset.c
        sql/server/rel_rel.c
        sql/server/rel_select.c
        sql/storage/store.c
Branch: nested
Log Message:

improving loading array data.


diffs (truncated from 618 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -2425,12 +2425,15 @@ static stmt *
 rel2bin_basetable(backend *be, sql_rel *rel)
 {
        mvc *sql = be->mvc;
-       sql_table *t = rel->l;
+       sql_table *t = rel->l, *bt = t;
        sql_column *fcol = NULL;
        sql_idx *fi = NULL;
        list *l = sa_list(sql->sa);
-       stmt *dels = stmt_tid(be, t, rel->flag == REL_PARTITION), *col = NULL;
+       stmt *dels = stmt_tid(be, t, rel->flag == REL_PARTITION), *odels = 
dels, *col = NULL;
        node *en;
+       list *subtables = rel_base_subtables(rel);
+       node *stn = NULL;
+       bool multiset = t->multiset;
 
        if (l == NULL || dels == NULL)
                return NULL;
@@ -2449,12 +2452,12 @@ rel2bin_basetable(backend *be, sql_rel *
                        if ((hash_index(i->type) && list_length(i->columns) <= 
1) || !idx_has_column(i->type))
                                continue;
                        fi = i;
-                       col = stmt_idx(be, i, NULL/*dels*/, dels->partition);
+                       col = stmt_idx(be, i, multiset?dels:NULL, 
dels->partition);
                } else {
                        sql_column *c = find_sql_column(t, oname);
 
                        fcol = c;
-                       col = stmt_col(be, c, NULL/*dels*/, dels->partition);
+                       col = stmt_col(be, c, multiset?dels:NULL, 
dels->partition);
                }
        }
        for (en = rel->exps->h; en; en = en->next) {
@@ -2479,17 +2482,29 @@ rel2bin_basetable(backend *be, sql_rel *
                        /* do not include empty indices in the plan */
                        if ((hash_index(i->type) && list_length(i->columns) <= 
1) || !idx_has_column(i->type))
                                continue;
-                       s = (i == fi) ? col : stmt_idx(be, i, NULL/*dels*/, 
dels->partition);
+                       s = (i == fi) ? col : stmt_idx(be, i, 
multiset?dels:NULL, dels->partition);
                } else {
                        sql_column *c = find_sql_column(t, oname);
-
-                       s = (c == fcol) ? col : stmt_col(be, c, NULL/*dels*/, 
dels->partition);
+                       if (!c && stn) {
+                               t = bt;
+                               dels = odels;
+                               c = find_sql_column(t, oname);
+                       }
+
+                       s = (c == fcol) ? col : stmt_col(be, c, 
multiset?dels:NULL, dels->partition);
+                       if (c->type.multiset) {
+                               if (!stn)
+                                       stn = subtables->h;
+                               t = stn->data;
+                               dels = stmt_tid(be, t, rel->flag == 
REL_PARTITION);
+                               stn = stn->next;
+                       }
                }
                s = stmt_alias(be, s, exp->alias.label, rname, exp_name(exp));
                list_append(l, s);
        }
        stmt *res = stmt_list(be, l);
-       if (res && dels)
+       if (res && !multiset && dels)
                res->cand = dels;
        return res;
 }
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
@@ -729,6 +729,9 @@ typedef struct sql_table {
        bit system;             /* system or user table */
        bit bootstrap;          /* system table created during bootstrap */
        bte properties;         /* used for merge_tables */
+       unsigned char
+               composite:1,
+               multiset:1;
        temp_t persistence;     /* persistent, global or local temporary */
        ca_t commit_action;     /* on commit action */
        char *query;            /* views may require some query */
diff --git a/sql/server/rel_basetable.c b/sql/server/rel_basetable.c
--- a/sql/server/rel_basetable.c
+++ b/sql/server/rel_basetable.c
@@ -28,11 +28,19 @@
 typedef struct rel_base_t {
        sql_table *mt;
        sql_alias *name;
+       list *subtables; /* list of sql_table pointers */
        int disallowed; /* ie check per column */
        int basenr;
        uint32_t used[];
 } rel_base_t;
 
+list *
+rel_base_subtables(sql_rel *r)
+{
+       rel_base_t *ba = r->r;
+       return ba->subtables;
+}
+
 void
 rel_base_disallow(sql_rel *r)
 {
@@ -149,9 +157,164 @@ rel_base_use_all( mvc *sql, sql_rel *rel
        }
 }
 
+static rel_base_t*
+rel_multiset_basetable_add_cols(mvc *sql, rel_base_t *pba, char *colname, 
sql_table *t, list *exps)
+{
+       allocator *sa = sql->sa;
+       int nrcols = ol_length(t->columns), end = nrcols + 1 + 
ol_length(t->idxs);
+       rel_base_t *ba = (rel_base_t*)sa_zalloc(sa, sizeof(rel_base_t) + 
sizeof(int)*USED_LEN(end));
+
+       ba->basenr = sql->nid;
+       sql->nid += end;
+
+       if (!ba)
+               return NULL;
+       append(pba->subtables, t);
+
+       sql_alias *atname = a_create(sa, colname);
+       atname->parent = ba->name;
+       int i = 0;
+       prop *p = NULL;
+       sql_exp *e = NULL;
+       for (node *cn = ol_first_node(t->columns); cn; cn = cn->next, i++) {
+               sql_column *c = cn->data;
+               if (!column_privs(sql, c, PRIV_SELECT))
+                       continue;
+               if (c->type.multiset) {
+                       e = exp_alias(sql, atname, c->base.name, atname, 
c->base.name, &c->type, CARD_MULTI, c->null, is_column_unique(c), 1);
+                       if (e) {
+                               e->nid = -(ba->basenr + i);
+                               e->alias.label = e->nid;
+                               set_basecol(e);
+                               append(exps, e);
+                       }
+
+                       sql_table *t = mvc_bind_table(sql, c->t->s, 
c->storage_type);
+                       if (rel_multiset_basetable_add_cols(sql, ba, 
c->base.name, t, exps) == NULL)
+                               e = NULL;
+                       else
+                               continue;
+               } else {
+                       e = exp_alias(sql, atname, c->base.name, atname, 
c->base.name, &c->type, CARD_MULTI, c->null, is_column_unique(c), 1);
+               }
+               if (e == NULL)
+                       return NULL;
+               e->nid = -(ba->basenr + i);
+               e->alias.label = e->nid;
+               if (c->t->pkey && ((sql_kc*)c->t->pkey->k.columns->h->data)->c 
== c) {
+                       p = e->p = prop_create(sa, PROP_HASHCOL, e->p);
+                       p->value.pval = c->t->pkey;
+               } else if (c->unique == 2) {
+                       p = e->p = prop_create(sa, PROP_HASHCOL, e->p);
+                       p->value.pval = NULL;
+               }
+               set_basecol(e);
+               sql_column_get_statistics(sql, c, e);
+               append(exps, e);
+       }
+/*
+       e = exp_alias(sql, atname, TID, atname, TID, sql_bind_localtype("oid"), 
CARD_MULTI, 0, 1, 1);
+       if (e == NULL)
+               return NULL;
+       e->nid = -(ba->basenr + i);
+       e->alias.label = e->nid;
+       append(exps, e);
+       i++;
+*/
+       return ba;
+}
+
+static sql_rel *
+rel_multiset_basetable(mvc *sql, sql_table *t, sql_alias *atname)
+{
+       allocator *sa = sql->sa;
+       sql_rel *rel = rel_create(sa);
+       /* keep each combination subtable / base number in a list */
+       /* each has a unique sub-range of numbers claimed */
+       /* keep all column exp's as one large list in the result already */
+
+       int nrcols = ol_length(t->columns), end = nrcols + 1 + 
ol_length(t->idxs);
+       rel_base_t *ba = (rel_base_t*)sa_zalloc(sa, sizeof(rel_base_t) + 
sizeof(int)*USED_LEN(end));
+       sqlstore *store = sql->session->tr->store;
+
+       if(!rel || !ba)
+               return NULL;
+
+       ba->subtables = sa_list(sa);
+       ba->basenr = sql->nid;
+       sql->nid += end;
+       if (isTable(t) && t->s && !isDeclaredTable(t)) /* count active rows 
only */
+               set_count_prop(sql->sa, rel, 
(BUN)store->storage_api.count_del(sql->session->tr, t, CNT_ACTIVE));
+       assert(atname);
+       if (!a_cmp_obj_name(atname, t->base.name))
+               ba->name = atname;
+       else
+               ba->name = table_alias(sql->sa, t, schema_alias(sql->sa, t->s));
+       int i = 0;
+       prop *p = NULL;
+       rel->exps = new_exp_list(sa);
+       sql_exp *e = NULL;
+       for (node *cn = ol_first_node(t->columns); cn; cn = cn->next, i++) {
+               sql_column *c = cn->data;
+               if (!column_privs(sql, c, PRIV_SELECT))
+                       continue;
+               if (c->type.multiset) {
+                       e = exp_alias(sql, atname, c->base.name, atname, 
c->base.name, &c->type, CARD_MULTI, c->null, is_column_unique(c), 0);
+                       if (e) {
+                               e->nid = -(ba->basenr + i);
+                               e->alias.label = e->nid;
+                               set_basecol(e);
+                               append(rel->exps, e);
+                       }
+                       sql_table *t = mvc_bind_table(sql, c->t->s, 
c->storage_type);
+                       if (rel_multiset_basetable_add_cols(sql, ba, 
c->base.name, t, rel->exps) == NULL)
+                               e = NULL;
+                       else
+                               continue;
+               } else {
+                       e = exp_alias(sql, atname, c->base.name, atname, 
c->base.name, &c->type, CARD_MULTI, c->null, is_column_unique(c), 0);
+               }
+               if (e == NULL) {
+                       rel_destroy(rel);
+                       return NULL;
+               }
+               e->nid = -(ba->basenr + i);
+               e->alias.label = e->nid;
+               if (c->t->pkey && ((sql_kc*)c->t->pkey->k.columns->h->data)->c 
== c) {
+                       p = e->p = prop_create(sa, PROP_HASHCOL, e->p);
+                       p->value.pval = c->t->pkey;
+               } else if (c->unique == 2) {
+                       p = e->p = prop_create(sa, PROP_HASHCOL, e->p);
+                       p->value.pval = NULL;
+               }
+               set_basecol(e);
+               sql_column_get_statistics(sql, c, e);
+               append(rel->exps, e);
+       }
+       e = exp_alias(sql, atname, TID, atname, TID, sql_bind_localtype("oid"), 
CARD_MULTI, 0, 1, 1);
+       if (e == NULL) {
+               rel_destroy(rel);
+               return NULL;
+       }
+       e->nid = -(ba->basenr + i);
+       e->alias.label = e->nid;
+       append(rel->exps, e);
+       i++;
+       /* todo add idx's */
+
+       rel->l = t;
+       rel->r = ba;
+       rel->op = op_basetable;
+       rel->card = CARD_MULTI;
+       rel->nrcols = nrcols;
+       return rel;
+}
+
 sql_rel *
 rel_basetable(mvc *sql, sql_table *t, sql_alias *atname)
 {
+       if (t->multiset)
+               return rel_multiset_basetable(sql, t, atname);
        allocator *sa = sql->sa;
        sql_rel *rel = rel_create(sa);
        int nrcols = ol_length(t->columns), end = nrcols + 1 + 
ol_length(t->idxs);
diff --git a/sql/server/rel_basetable.h b/sql/server/rel_basetable.h
--- a/sql/server/rel_basetable.h
+++ b/sql/server/rel_basetable.h
@@ -59,4 +59,6 @@ extern int rel_base_has_column_privilege
 extern void rel_base_set_mergetable( sql_rel *rel, sql_table *mt); /* keep 
parent merge table */
 extern sql_table *rel_base_get_mergetable( sql_rel *rel);
 
+extern list *rel_base_subtables( sql_rel *rel);
+
 #endif /* _REL_BASETABLE_H_ */
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -3713,8 +3713,12 @@ static sql_exp *
 exp_check_multiset_type(mvc *sql, sql_subtype *t, sql_rel *rel, sql_exp *exp, 
check_type tpe)
 {
        assert(t->type->composite);
-       if (!exp_is_rel(exp) && !is_values(exp))
+       if (!exp_is_rel(exp) && !is_values(exp)) {
+               sql_subtype *et = exp_subtype(exp);
+               if (et && et->multiset == t->multiset && subtype_cmp(et, t) == 
0)
+                       return exp;
                return sql_error( sql, 03, SQLSTATE(42000) "cannot convert 
value into composite type '%s'", t->type->base.name);
+       }
 
        list *msvals = NULL;
        if (exp_is_rel(exp)) {
diff --git a/sql/server/rel_multiset.c b/sql/server/rel_multiset.c
--- a/sql/server/rel_multiset.c
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to