Changeset: 4628cfb4100e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4628cfb4100e
Modified Files:
sql/backends/monet5/rel_bin.c
sql/server/rel_exp.c
sql/server/rel_multiset.c
sql/storage/store.c
Branch: nested
Log Message:
improvements for multisets of simple types
diffs (212 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
@@ -2478,7 +2478,7 @@ rel2bin_basetable(backend *be, sql_rel *
} else {
sql_column *c = find_sql_column(t, oname);
- if (c->type.multiset || c->type.type->composite)
+ if (!c || c->type.multiset || c->type.type->composite)
continue;
fcol = c;
col = stmt_col(be, c, multiset?dels:NULL,
dels->partition);
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
@@ -3712,7 +3712,7 @@ exp_check_composite_type(mvc *sql, sql_s
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);
+ assert(t->type->composite || t->multiset);
if (!exp_is_rel(exp) && !is_values(exp)) {
sql_subtype *et = exp_subtype(exp);
/* hard code conversion from json allowed */
@@ -3720,7 +3720,9 @@ exp_check_multiset_type(mvc *sql, sql_su
return exp_convert(sql, exp, et, t);
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);
+ if (t->type->composite)
+ return sql_error( sql, 03, SQLSTATE(42000) "cannot
convert value into composite type '%s'", t->type->base.name);
+ return sql_error( sql, 03, SQLSTATE(42000) "cannot convert
value into multiset type '%s[]'", t->type->base.name);
}
list *msvals = NULL;
@@ -3757,7 +3759,7 @@ exp_check_type(mvc *sql, sql_subtype *t,
sql_exp* nexp = NULL;
sql_subtype *fromtype = exp_subtype(exp);
- if (t->type->composite) {
+ if (t->type->composite || t->multiset) {
if (t->multiset || !is_row(exp))
return exp_check_multiset_type(sql, t, rel, exp, tpe);
return exp_check_composite_type(sql, t, rel, exp, tpe);
diff --git a/sql/server/rel_multiset.c b/sql/server/rel_multiset.c
--- a/sql/server/rel_multiset.c
+++ b/sql/server/rel_multiset.c
@@ -244,30 +244,39 @@ fm_project_ms(visitor *v, sql_exp *e, sq
e = exp_ref(v->sql, e);
sql_exp *mse = exp_column(v->sql->sa, cn, "rowid", inttype, 1,1, 1, 1);
mse->alias.label = (++label);
- mse->nid = e->alias.label;
+ mse->nid = mse->alias.label;
append(nexps, mse);
- for(node *f = t->type->d.fields->h; f; f = f->next) {
- sql_arg *field = f->data;
+ if (t->type->composite) {
+ for(node *f = t->type->d.fields->h; f; f = f->next) {
+ sql_arg *field = f->data;
- if (field->type.multiset) {
- sql_alias *nn = a_create(v->sql->sa, field->name);
- nn->parent = cn;
- fm_project_ms(v, e, &field->type, nn, nexps);
- } else {
- mse = exp_column(v->sql->sa, cn, field->name,
&field->type, 1,1, 1, 1);
- mse->alias.label = (++label);
- mse->nid = e->alias.label;
- append(nexps, mse);
+ if (field->type.multiset) {
+ sql_alias *nn = a_create(v->sql->sa,
field->name);
+ nn->parent = cn;
+ fm_project_ms(v, e, &field->type, nn, nexps);
+ } else {
+ mse = exp_column(v->sql->sa, cn, field->name,
&field->type, 1,1, 1, 1);
+ mse->alias.label = (++label);
+ mse->nid = mse->alias.label;
+ append(nexps, mse);
+ }
}
+ } else {
+ sql_subtype lt = *t;
+ lt.multiset = MS_VALUE;
+ mse = exp_column(v->sql->sa, cn, "elements", <, 1,1, 1, 1);
+ mse->alias.label = (++label);
+ mse->nid = mse->alias.label;
+ append(nexps, mse);
}
mse = exp_column(v->sql->sa, cn, "multisetid", inttype, 1,1, 1, 1);
mse->alias.label = (++label);
- mse->nid = e->alias.label;
+ mse->nid = mse->alias.label;
append(nexps, mse);
if (t->multiset == MS_ARRAY) {
mse = exp_column(v->sql->sa, cn, "multisetnr", inttype, 1,1, 1,
1);
mse->alias.label = (++label);
- mse->nid = e->alias.label;
+ mse->nid = mse->alias.label;
append(nexps, mse);
}
}
@@ -317,7 +326,7 @@ fm_project(visitor *v, sql_rel *rel)
}
} else if (rel->l && rel->exps) { /* check for type multiset, expand
the column list for the content columns */
bool needed = false;
- for(node *n = rel->exps->h; n; n = n->next) {
+ for(node *n = rel->exps->h; n && !needed; n = n->next) {
sql_exp *e = n->data;
sql_subtype *t = exp_subtype(e);
needed = (t && t->multiset);
@@ -341,9 +350,15 @@ fm_project(visitor *v, sql_rel *rel)
rowid = exps_bind_column(exps,
"rowid", NULL, NULL, 0);
rowid = exp_ref(v->sql, rowid);
append(nexps, rowid);
- for(node *f = t->type->d.fields->h; f;
f = f->next) {
- sql_arg *field = f->data;
- sql_exp *mse =
exps_bind_column(exps, field->name, NULL, NULL, 0);
+ if (t->type->composite) {
+ for(node *f =
t->type->d.fields->h; f; f = f->next) {
+ sql_arg *field =
f->data;
+ sql_exp *mse =
exps_bind_column(exps, field->name, NULL, NULL, 0);
+ mse = exp_ref(v->sql,
mse);
+ append(nexps, mse);
+ }
+ } else {
+ sql_exp *mse =
exps_bind_column(exps, "elements", NULL, NULL, 0);
mse = exp_ref(v->sql, mse);
append(nexps, mse);
}
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3824,24 +3824,32 @@ sql_trans_create_column_intern(sql_colum
if (col->type.type->composite)
t->composite=true;
- if (tpe->type->composite) {
+ if (tpe->type->composite || tpe->multiset) {
needs_data = false;
sql_table *tt = t;
if (tpe->multiset) {
char buf[16];
snprintf(buf, 16, "%%ms_%d", col->base.id);
col->storage_type = _STRDUP(buf);
- if ((res = sql_trans_create_table(&tt, tr, t->s,
col->storage_type, NULL, tt_table, true, t->persistence, 0, 0, 0)) != LOG_OK)
+ if ((res = sql_trans_create_table(&tt, tr, t->s,
col->storage_type, NULL, tt_table, true, t->persistence, t->commit_action, 0,
0)) != LOG_OK)
return res;
if (sql_trans_create_sequence(tr, t->s,
col->storage_type, 1, 1, GDK_lng_max, 1, 1, false, true) != LOG_OK)
return res;
}
- /* All nested types, need the internal columns for the field
contents */
- for (node *n = col->type.type->d.fields->h; n; n = n->next) {
- sql_arg *f = n->data;
+ if (tpe->type->composite) {
+ /* All nested types, need the internal columns for the
field contents */
+ for (node *n = col->type.type->d.fields->h; n; n =
n->next) {
+ sql_arg *f = n->data;
+ sql_column *ic = NULL;
+ /* how to store names (list) ? */
+ if (sql_trans_create_column_intern( &ic, tr,
tt, f->name, &f->type, column_intern) < 0)
+ return -2;
+ }
+ } else {
sql_column *ic = NULL;
- /* how to store names (list) ? */
- if (sql_trans_create_column_intern( &ic, tr, tt,
f->name, &f->type, column_intern) < 0)
+ sql_subtype lt = *tpe;
+ lt.multiset = MS_VALUE;
+ if (sql_trans_create_column_intern( &ic, tr, tt,
"elements", <, column_intern) < 0)
return -2;
}
if (tpe->multiset == MS_SETOF || tpe->multiset == MS_ARRAY) {
/* sets and arrays need oid col */
@@ -3935,24 +3943,32 @@ sql_trans_copy_column( sql_trans *tr, sq
if (!isNew(t) && isGlobal(t) && !isGlobalTemp(t) && (res =
sql_trans_add_dependency(tr, t->base.id, dml)))
return res;
- if (c->type.type->composite) {
+ if (c->type.type->composite || c->type.multiset) {
needs_data = false;
sql_table *tt = t;
if (c->type.multiset) {
char buf[16];
snprintf(buf, 16, "%%ms_%d", c->base.id);
col->storage_type = _STRDUP(buf);
- if ((res = sql_trans_create_table(&tt, tr, t->s,
col->storage_type, NULL, tt_table, true, t->persistence, 0, 0, 0)) != LOG_OK)
+ if ((res = sql_trans_create_table(&tt, tr, t->s,
col->storage_type, NULL, tt_table, true, t->persistence, t->commit_action, 0,
0)) != LOG_OK)
return res;
if (sql_trans_create_sequence(tr, t->s,
col->storage_type, 1, 1, GDK_lng_max, 1, 1, false, true) != LOG_OK)
return res;
}
- /* All nested types, need the internal columns for the field
contents */
- for (node *n = col->type.type->d.fields->h; n; n = n->next) {
- sql_arg *f = n->data;
+ if (c->type.type->composite) {
+ /* All nested types, need the internal columns for the
field contents */
+ for (node *n = col->type.type->d.fields->h; n; n =
n->next) {
+ sql_arg *f = n->data;
+ sql_column *ic = NULL;
+ /* how to store names (list) ? */
+ if (sql_trans_create_column_intern( &ic, tr,
tt, f->name, &f->type, column_intern) < 0)
+ return -2;
+ }
+ } else {
sql_column *ic = NULL;
- /* how to store names (list) ? */
- if (sql_trans_create_column_intern( &ic, tr, tt,
f->name, &f->type, column_intern) < 0)
+ sql_subtype lt = c->type;
+ lt.multiset = MS_VALUE;
+ if (sql_trans_create_column_intern( &ic, tr, tt,
"elements", <, column_intern) < 0)
return -2;
}
if (c->type.multiset == MS_SETOF || c->type.multiset ==
MS_ARRAY) { /* sets and arrays need oid col */
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]