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