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