Changeset: a05facf72aff for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a05facf72aff
Modified Files:
        sql/server/rel_rel.c
Branch: default
Log Message:

Don't use visitor, so the predicate can return earlier if it fails


diffs (67 lines):

diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -2323,26 +2323,50 @@ exps_exp_visitor_bottomup(visitor *v, sq
        return exps_exp_visitor(v, rel, exps, depth, exp_rewriter, false, 
relations_topdown);
 }
 
-static sql_exp *
-_rel_rebind_exp(visitor *v, sql_rel *rel, sql_exp *e, int depth)
+static bool
+exps_rebind_exp(mvc *sql, sql_rel *rel, list *exps)
 {
-       (void)depth;
-       /* visitor will handle recursion, ie only need to check columns here */
-       if (e->type == e_column) {
-               sql_exp *ne = rel_find_exp(rel, e);
-               if (!ne)
-                       v->changes++;
+       bool ok = true;
+
+       if (mvc_highwater(sql)) {
+               (void) sql_error(sql, 10, SQLSTATE(42000) "Query too complex: 
running out of stack space");
+               return false;
        }
-       return e;
+
+       if (list_empty(exps))
+               return true;
+       for (node *n = exps->h; n && ok; n = n->next)
+               ok &= rel_rebind_exp(sql, rel, n->data);
+       return ok;
 }
 
 bool
 rel_rebind_exp(mvc *sql, sql_rel *rel, sql_exp *e)
 {
-       visitor v = { .sql = sql };
-       exp_visitor(&v, rel, e, 0, &_rel_rebind_exp, true, true);
-       /* problems are passed via changes */
-       return (v.changes==0);
+       if (mvc_highwater(sql)) {
+               (void) sql_error(sql, 10, SQLSTATE(42000) "Query too complex: 
running out of stack space");
+               return false;
+       }
+
+       switch (e->type) {
+       case e_convert:
+               return rel_rebind_exp(sql, rel, e->l);
+       case e_aggr:
+       case e_func:
+               return exps_rebind_exp(sql, rel, e->l);
+       case e_cmp:
+               if (e->flag == cmp_in || e->flag == cmp_notin)
+                       return rel_rebind_exp(sql, rel, e->l) && 
exps_rebind_exp(sql, rel, e->r);
+               if (e->flag == cmp_or || e->flag == cmp_filter)
+                       return exps_rebind_exp(sql, rel, e->l) && 
exps_rebind_exp(sql, rel, e->r);
+               return rel_rebind_exp(sql, rel, e->l) && rel_rebind_exp(sql, 
rel, e->r) && (!e->f || rel_rebind_exp(sql, rel, e->f));
+       case e_column:
+               return rel_find_exp(rel, e) != NULL;
+       case e_atom:
+       case e_psm:
+               return true;
+       }
+       return true;
 }
 
 static sql_exp *
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to