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 -- [email protected]
To unsubscribe send an email to [email protected]