Changeset: b8dd65b1c79a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b8dd65b1c79a
Modified Files:
        sql/backends/monet5/rel_bin.c
Branch: default
Log Message:

make sure we pass arguments to the remote functions


diffs (169 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
@@ -1208,6 +1208,136 @@ rel2bin_basetable( mvc *sql, sql_rel *re
        return stmt_list(sql->sa, l);
 }
 
+static int 
+alias_cmp( stmt *s, char *nme )
+{
+       return strcmp(s->cname, nme);
+}
+
+static list* exps2bin_args( mvc *sql, list *exps, list *args);
+
+static list *
+exp2bin_args( mvc *sql, sql_exp *e, list *args)
+{
+       if (!e)
+               return args;
+       switch(e->type){
+       case e_column:
+       case e_psm:
+               return args;
+       case e_cmp:
+               if (e->flag == cmp_or || get_cmp(e) == cmp_filter) {
+                       args = exps2bin_args(sql, e->l, args);
+                       args = exps2bin_args(sql, e->r, args);
+               } else if (e->flag == cmp_in || e->flag == cmp_notin) {
+                       args = exp2bin_args(sql, e->l, args);
+                       args = exps2bin_args(sql, e->r, args);
+               } else {
+                       args = exp2bin_args(sql, e->l, args);
+                       args = exp2bin_args(sql, e->r, args);
+                       if (e->f)
+                               args = exp2bin_args(sql, e->f, args);
+               }
+               return args;
+       case e_convert:
+               if (e->l)
+                       return exp2bin_args(sql, e->l, args);
+               break;
+       case e_aggr:
+       case e_func: 
+               if (e->l)
+                       return exps2bin_args(sql, e->l, args);
+               break;
+       case e_atom:
+               if (e->l) {
+                       return args;
+               } else if (e->f) {
+                       return exps2bin_args(sql, e->f, args);
+               } else if (e->r) {
+                       char nme[64];
+
+                       snprintf(nme, 64, "A%s", (char*)e->r);
+                       if (!list_find(args, nme, (fcmp)&alias_cmp)) {
+                               stmt *s = stmt_var(sql->sa, e->r, &e->tpe, 0, 
0);
+
+                               s = stmt_alias(sql->sa, s, NULL, 
sa_strdup(sql->sa, nme));
+                               list_append(args, s);
+                       }
+               } else {
+                       char nme[16];
+
+                       snprintf(nme, 16, "A%d", e->flag);
+                       if (!list_find(args, nme, (fcmp)&alias_cmp)) {
+                               atom *a = sql->args[e->flag];
+                               stmt *s = stmt_varnr(sql->sa, e->flag, &a->tpe);
+
+                               s = stmt_alias(sql->sa, s, NULL, 
sa_strdup(sql->sa, nme));
+                               list_append(args, s);
+                       }
+               }
+       }
+       return args;
+}
+
+static list *
+exps2bin_args( mvc *sql, list *exps, list *args)
+{
+       node *n;
+
+       if (!exps)
+               return args;
+       for (n = exps->h; n; n = n->next)
+               args = exp2bin_args(sql, n->data, args);
+       return args;
+}
+
+static list *
+rel2bin_args( mvc *sql, sql_rel *rel, list *args)
+{
+       if (!rel)
+               return args;
+       switch(rel->op) {
+       case op_basetable:
+       case op_table:
+               break;
+       case op_join: 
+       case op_left: 
+       case op_right: 
+       case op_full: 
+
+       case op_apply: 
+       case op_semi: 
+       case op_anti: 
+
+       case op_union: 
+       case op_inter: 
+       case op_except: 
+               args = rel2bin_args(sql, rel->l, args);
+               args = rel2bin_args(sql, rel->r, args);
+               break;
+       case op_project:
+       case op_select: 
+       case op_groupby: 
+       case op_topn: 
+       case op_sample: 
+               if (rel->exps)
+                       args = exps2bin_args(sql, rel->exps, args);
+               args = rel2bin_args(sql, rel->l, args);
+               break;
+       case op_ddl: 
+               args = rel2bin_args(sql, rel->l, args);
+               if (rel->r)
+                       args = rel2bin_args(sql, rel->r, args);
+               break;
+       case op_insert:
+       case op_update:
+       case op_delete:
+               args = rel2bin_args(sql, rel->r, args);
+               break;
+       }
+       return args;
+}
+
 static stmt *
 rel2bin_table( mvc *sql, sql_rel *rel, list *refs)
 {
@@ -1266,25 +1396,13 @@ rel2bin_table( mvc *sql, sql_rel *rel, l
                        osub = sub;
                }
                sub = stmt_list(sql->sa, l);
-       } else if (rel->l) {
-               int i, argc;
+       } else if (rel->l) { /* handle sub query via function */
+               int i;
                char name[16], *nme;
-               /* handle sub query via function */
-               (void)refs;
 
                nme = number2name(name, 16, ++sql->label);
 
-               /* arguments (todo check which are used) */
-               l = sa_list(sql->sa);
-               for (argc = 0; argc < sql->argc; argc++) {
-                       atom *a = sql->args[argc];
-                       stmt *s = stmt_varnr(sql->sa, argc, &a->tpe);
-                       char nme[16];
-
-                       snprintf(nme, 16, "A%d", argc);
-                       s = stmt_alias(sql->sa, s, NULL, sa_strdup(sql->sa, 
nme));
-                       list_append(l, s);
-               }
+               l = rel2bin_args(sql, rel->l, sa_list(sql->sa));
                sub = stmt_list(sql->sa, l);
                sub = stmt_func(sql->sa, sub, sa_strdup(sql->sa, nme), rel->l);
                l = sa_list(sql->sa);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to