Changeset: fd36be23fae0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fd36be23fae0
Modified Files:
        sql/backends/monet5/sql_statement.c
        sql/server/rel_multiset.c
Branch: nested
Log Message:

initial version of insert from json string


diffs (62 lines):

diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -3981,10 +3981,8 @@ static stmt *
 stmt_from_json(backend *be, stmt *v, stmt *sel, sql_subtype *t)
 {
        (void)sel;
-
        int nrcols = composite_type_resultsize(t);
 
-       printf("%d\n", nrcols);
        InstrPtr q = newStmtArgs(be->mb, "sql", "from_json", nrcols + 2);
        if (q == NULL)
                goto bailout;
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
@@ -209,8 +209,19 @@ fm_join(visitor *v, sql_rel *rel)
 static sql_rel *
 fm_project(visitor *v, sql_rel *rel)
 {
-       if ((!rel->l || rel->card == CARD_ATOM) && rel->exps) { /* check for 
type multiset */
+       sql_rel *l = rel->l;
+
+       if ((!l || (l && rel->card == CARD_ATOM && is_project(l->op))) && 
rel->exps) { /* check for type multiset */
                bool needed = false;
+               for(node *n = rel->exps->h; n; n = n->next) {
+                       sql_exp *e = n->data;
+                       sql_subtype *t = exp_subtype(e);
+                       needed = (t && t->multiset);
+                       if (needed && is_intern(e)) {
+                               needed = false;
+                               break;
+                       }
+               }
                for(node *n = rel->exps->h; n && !needed; n = n->next) {
                        sql_subtype *t = exp_subtype(n->data);
                        needed = (t && t->multiset);
@@ -285,6 +296,8 @@ fm_project(visitor *v, sql_rel *rel)
                                sql_subtype *t = exp_subtype(e);
                                if (t->multiset) {
                                        sql_exp *rowid = exps_bind_column(exps, 
exp_name(e), NULL, NULL, 0);
+                                       if (!rowid)
+                                               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) {
@@ -294,10 +307,14 @@ fm_project(visitor *v, sql_rel *rel)
                                                append(nexps, mse);
                                        }
                                        sql_exp *msid = exps_bind_column(exps, 
"id", NULL, NULL, 0);
+                                       if (!msid)
+                                               msid = exps_bind_column(exps, 
"multisetid", NULL, NULL, 0);
                                        msid = exp_ref(v->sql, msid);
                                        append(nexps, msid);
                                        if (t->multiset == MS_ARRAY) {
                                                sql_exp *msnr = 
exps_bind_column(exps, "nr", NULL, NULL, 0);
+                                               if (!msnr)
+                                                       msnr = 
exps_bind_column(exps, "multisetnr", NULL, NULL, 0);
                                                msnr = exp_ref(v->sql, msnr);
                                                append(nexps, msnr);
                                        }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to