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", &lt, 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", &lt, 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", &lt, 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 -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to