Changeset: 47a34ab403be for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/47a34ab403be
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_unnest.c
Branch: nested
Log Message:

fallback to right when value isn't found on left side.
lots of cleanup and align more with default.


diffs (truncated from 317 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
@@ -663,255 +663,6 @@ handle_in_exps(backend *be, sql_exp *ce,
        return s;
 }
 
-
-static stmt * value_list(backend *be, sql_exp *vals_exp, stmt *left, stmt 
*sel);
-
-static stmt *
-composite_value_list(backend *be, sql_exp *tuple, stmt *left, stmt *sel)
-{
-       assert(is_row(tuple));
-       list *fields = exp_get_values(tuple);
-       list *f = sa_list(be->mvc->sa);
-       for (node *n = fields->h; n; n = n->next) {
-               sql_exp *e = n->data;
-               stmt *i;
-
-               if(is_values(e))
-                       i = value_list(be, e, left, sel);
-               else
-                       i = exp_bin(be, e, left, NULL, NULL, NULL, NULL, sel, 
0, 0, 0);
-               if (!i)
-                       return NULL;
-               if (i->type == st_list) {
-                       for( node *n = i->op4.lval->h; n; n = n->next)
-                               list_append(f, n->data);
-               } else
-                       list_append(f, i);
-       }
-       return stmt_list(be, f);
-}
-
-static stmt *
-set_value_list(backend *be, sql_exp *vals_exp, stmt *left, stmt *sel)
-{
-       assert(is_values(vals_exp));
-       list *vals = exp_get_values(vals_exp);
-       sql_subtype *type = exp_subtype(vals->h->data);
-       bool single_value = list_length(vals) <= 1;
-       int multi_result = 0;
-
-       if (!type)
-               return sql_error(be->mvc, 02, SQLSTATE(42000) "Could not infer 
the type of a value list column");
-
-       /* create bat append values */
-       list *l = sa_list(be->mvc->sa);
-       for (node *n = vals->h; n; n = n->next) {
-               sql_exp *e = n->data;
-               stmt *i = exp_bin(be, e, left, NULL, NULL, NULL, NULL, sel, 0, 
0, 0);
-
-               if (!i)
-                       return NULL;
-               if (single_value)
-                       return i;
-               list_append(l, i);
-
-               if (i->type == st_list && list_length(i->op4.lval) > 1)
-                       multi_result = list_length(i->op4.lval);
-       }
-       /*  n-tuples */
-       if (multi_result) {
-               list *rl = sa_list(be->mvc->sa);
-               for(int i = 0; i < multi_result; i++) {
-                       node *n = l->h;
-                       stmt *s = n->data;
-                       stmt *input = list_fetch(s->op4.lval, i);
-                       sql_subtype *type = tail_type(input);
-                       list *nl = list_append(sa_list(be->mvc->sa), input);
-                       for (n = n->next; n; n = n->next) {
-                               stmt *s = n->data;
-                               stmt *input = list_fetch(s->op4.lval, i);
-                               nl = list_append(nl, input);
-                       }
-                       append(rl, stmt_append_bulk(be, stmt_temp(be, type), 
nl));
-               }
-               return stmt_list(be, rl);
-       }
-       return stmt_append_bulk(be, stmt_temp(be, type), l);
-}
-
-static int
-type_create_result(backend *be, sql_subtype *type, list *cols)
-{
-       if (type->type->composite) {
-               for(node *n = type->type->d.fields->h; n; n = n->next) {
-                       sql_arg *a = n->data;
-
-                       if (a->type.type->composite) {
-                               if(type_create_result(be, &a->type, cols) < 0)
-                                       return -1;
-                       } else {
-                               append(cols, sa_list(be->mvc->sa));
-                       }
-               }
-       } else {
-               append(cols, sa_list(be->mvc->sa));
-       }
-       if (type->multiset) /* multisetid */
-               append(cols, sa_list(be->mvc->sa));
-       if (type->multiset == MS_ARRAY) /* multisetnr */
-               append(cols, sa_list(be->mvc->sa));
-       if (type->multiset) /* rowid */
-               append(cols, sa_list(be->mvc->sa));
-       return 0;
-}
-
-static node *
-append_tuple(backend *be, sql_exp *tuple, sql_subtype *type, stmt *left, stmt 
*sel, node *cols, int rowcnt, int lcnt, bool row)
-{
-       if (row && !is_row(tuple)) { /* multiset data */
-               node *ncols = cols;
-               assert(is_values(tuple));
-               list *tuples = exp_get_values(tuple);
-               int i = 1;
-               if (list_empty(tuples)) {
-                       list *vals = cols->data;
-                       append(vals, stmt_atom_int(be, int_nil));
-                       if (type->type->composite) {
-                               node *n = cols;
-                               if (type->multiset)
-                                       n = n->next;
-                               for(node *o = type->type->d.fields->h; n && o; 
n = n->next, o = o->next)
-                                       ;
-                               if (type->multiset)
-                                       n = n->next;
-                               if (type->multiset == MS_ARRAY)
-                                       n = n->next;
-                               return n;
-                       } else
-                               return cols->next;
-               }
-               for(node *n = tuples->h; n; n = n->next, i++)
-                       if ((ncols=append_tuple(be, n->data, type, left, sel, 
cols, rowcnt, i, 0)) == cols)
-                               return cols;
-               return ncols;
-       }
-       assert(tuple->row);
-       list *attr = exp_get_values(tuple);
-       node *n, *m = cols, *o;
-       sql_subtype *ntype = type;
-       if (is_row(tuple) && list_length(type->type->d.fields) == 1) {
-               sql_arg *f = type->type->d.fields->h->data;
-               ntype = &f->type;
-       }
-       if (ntype->type->composite) {
-               for(n = attr->h, o = ntype->type->d.fields->h; n && o; n = 
n->next, o = o->next) {
-                       sql_arg *f = o->data;
-                       sql_exp *e = n->data;
-                       list *vals = m->data;
-                       if (f->type.type->composite) {
-                               node *nm = append_tuple(be, e, &f->type, left, 
sel, m, rowcnt, lcnt, ntype->multiset);
-                               if (nm == m)
-                                       return m;
-                               m = nm;
-                       } else {
-                               stmt *i = exp_bin(be, e, left, NULL, NULL, 
NULL, NULL, sel, 0, 0, 0);
-                               append(vals, i);
-                               m = m->next;
-                       }
-               }
-       } else {
-               assert(list_length(attr) == 1);
-               sql_exp *e = attr->h->data;
-               list *vals = m->data;
-               stmt *i = exp_bin(be, e, left, NULL, NULL, NULL, NULL, sel, 0, 
0, 0);
-               m = m->next;
-               append(vals, i);
-       }
-       if (type->multiset) {
-               list *vals = m->data;
-               append(vals, stmt_atom_int(be, rowcnt));
-               m = m->next;
-       }
-       if (type->multiset == MS_ARRAY) {
-               list *vals = m->data;
-               append(vals, stmt_atom_int(be, lcnt));
-               m = m->next;
-       }
-       if (type->multiset) {
-               if (lcnt == 1) {
-                       list *vals = m->data;
-                       append(vals, stmt_atom_int(be, rowcnt));
-               }
-               m = m->next;
-       }
-       return m;
-}
-
-static stmt *
-tuple_result(backend *be, list *cols)
-{
-       list *row = sa_list(be->mvc->sa);
-
-       for (node *n = cols->h; n; n = n->next) {
-               list *vals = n->data;
-               sql_subtype *type = tail_type(vals->h->data);
-               append(row, stmt_append_bulk(be, stmt_temp(be, type), vals));
-       }
-       return stmt_list(be, row);
-}
-
-// TODO: >>>>>>>>>>>>>>>>>>>> remove value_list and friends
-static stmt *
-value_list(backend *be, sql_exp *vals_exp, stmt *left, stmt *sel)
-{
-       if (!be) return NULL;
-
-       assert(is_values(vals_exp));
-       list *vals = exp_get_values(vals_exp);
-       sql_subtype *type = exp_subtype(vals_exp);
-       list *l;
-
-       if (!type || list_empty(vals))
-               return sql_error(be->mvc, 02, SQLSTATE(42000) "Could not infer 
the type of a value list column");
-
-       if (!is_row(vals_exp) && type->type->composite) {
-               list *attr = sa_list(be->mvc->sa);
-               sql_exp *v = vals->h->data;
-               if (type_create_result(be, type, attr) < 0)
-                       return NULL;
-               int rowcnt = 0, lcnt = 1;
-               int irc = is_row(v)?0:1;
-               int lrc = is_row(v)?1:0;
-               for (node *n = vals->h; n; n = n->next, rowcnt += irc, lcnt += 
lrc) {
-                       if (append_tuple(be, n->data, type, left, sel, attr->h, 
rowcnt, lcnt, 1) == attr->h)
-                               return NULL;
-               }
-               return tuple_result(be, attr);
-       }
-       if (type->multiset || (!is_row(vals_exp) && type->type->composite))
-               return set_value_list(be, vals_exp, left, sel);
-
-       if (is_row(vals_exp))
-               return composite_value_list(be, vals_exp, left, sel);
-
-       type = exp_subtype(vals->h->data);
-
-       /* create bat append values */
-       l = sa_list(be->mvc->sa);
-       for (node *n = vals->h; n; n = n->next) {
-               sql_exp *e = n->data;
-               stmt *i = exp_bin(be, e, left, NULL, NULL, NULL, NULL, sel, 0, 
0, 0);
-
-               if (!i)
-                       return NULL;
-
-               if (list_length(vals) == 1)
-                       return i;
-               list_append(l, i);
-       }
-       return stmt_append_bulk(be, stmt_temp(be, type), l);
-}
-
 static stmt *
 value_tvtree(backend *be, sql_exp *vals_exp, stmt *left, stmt *sel)
 {
@@ -2090,6 +1841,8 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                                s = exp2stmt_vector(be, e, left, sel);
                        } else {
                                s = value_tvtree(be, e, left, sel);
+                               if (!s && right)
+                                       s = value_tvtree(be, e, right, sel);
                        }
                } else {                        /* arguments */
                        sql_subtype *t = e->tpe.type?&e->tpe:NULL;
@@ -5472,9 +5225,9 @@ rel2bin_project(backend *be, sql_rel *re
        }
 
        if (rel->l) { /* first construct the sub relation */
-               sql_rel *lr = rel->l;
-               if (lr->op == op_ddl) {
-                       sql_table *t = rel_ddl_table_get(lr);
+               sql_rel *l = rel->l;
+               if (l->op == op_ddl) {
+                       sql_table *t = rel_ddl_table_get(l);
 
                        if (t)
                                sub = rel2bin_sql_table(be, t, rel->exps);
@@ -6744,9 +6497,8 @@ rel2bin_insert(backend *be, sql_rel *rel
        }
 
        int mvc_var = be->mvc_var;
-       for (n = ol_first_node(t->columns)/*, m = inserts->op4.lval->h*/; n 
/*&& m*/; n = n->next/*, m = m->next*/) {
-
-               //stmt *ins = m->data;
+       for (n = ol_first_node(t->columns); n; n = n->next) {
+
                sql_column *c = n->data;
                stmt *ins = updates[c->colnr];
 
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -492,17 +492,13 @@ rel_dependent_var(mvc *sql, sql_rel *l, 
                list *freevar = rel_freevar(sql, r, l);
                if (freevar) {
                        node *n;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to