Changeset: b10952fada1e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b10952fada1e
Modified Files:
        monetdb5/modules/mal/txtsim.c
        sql/server/rel_exp.c
        sql/server/rel_optimize_exps.c
        sql/server/rel_optimize_sel.c
Branch: Dec2023
Log Message:

fixing some more issues.
check size in dama. txtsim
add check for compares lower in the expression in exp_has_func, solving join 2 
semijoin optimizer
only use index hash on equality joins/selects
handle casewhen with null optimization properly


diffs (113 lines):

diff --git a/monetdb5/modules/mal/txtsim.c b/monetdb5/modules/mal/txtsim.c
--- a/monetdb5/modules/mal/txtsim.c
+++ b/monetdb5/modules/mal/txtsim.c
@@ -96,7 +96,9 @@ dameraulevenshtein(int *res, str *S, str
                return MAL_SUCCEED;
        }
        sz = (n + 1) * (m + 1) * sizeof(int);
-       d = (int *) GDKmalloc(sz);
+       if (sz > (1<<30))
+               throw(MAL, "dameraulevenshtein", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+       d = (int *) GDKmalloc((size_t)sz);
        if (d == NULL)
                throw(MAL, "dameraulevenshtein", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
 
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -2376,15 +2376,31 @@ exps_have_func(list *exps)
        return 0;
 }
 
-int
-exp_has_func(sql_exp *e)
+static int exp_has_func_or_cmp(sql_exp *e, bool cmp);
+
+static int
+exps_have_func_or_cmp(list *exps, bool cmp)
+{
+       if (list_empty(exps))
+               return 0;
+       for(node *n=exps->h; n; n=n->next) {
+               sql_exp *e = n->data;
+
+               if (exp_has_func_or_cmp(e, cmp))
+                       return 1;
+       }
+       return 0;
+}
+
+static int
+exp_has_func_or_cmp(sql_exp *e, bool cmp)
 {
        if (!e)
                return 0;
        switch (e->type) {
        case e_atom:
                if (e->f)
-                       return exps_have_func(e->f);
+                       return exps_have_func_or_cmp(e->f, true);
                return 0;
        case e_convert:
                return exp_has_func(e->l);
@@ -2392,16 +2408,18 @@ exp_has_func(sql_exp *e)
                return 1;
        case e_aggr:
                if (e->l)
-                       return exps_have_func(e->l);
+                       return exps_have_func_or_cmp(e->l, true);
                return 0;
        case e_cmp:
+               if (cmp)
+                       return 1;
                if (e->flag == cmp_or || e->flag == cmp_filter) {
-                       return (exps_have_func(e->l) || exps_have_func(e->r));
+                       return (exps_have_func_or_cmp(e->l, true) || 
exps_have_func_or_cmp(e->r, true));
                } else if (e->flag == cmp_in || e->flag == cmp_notin) {
-                       return (exp_has_func(e->l) || exps_have_func(e->r));
+                       return (exp_has_func_or_cmp(e->l, true) || 
exps_have_func_or_cmp(e->r, true));
                } else {
-                       return (exp_has_func(e->l) || exp_has_func(e->r) ||
-                                       (e->f && exp_has_func(e->f)));
+                       return (exp_has_func_or_cmp(e->l, true) || 
exp_has_func_or_cmp(e->r, true) ||
+                                       (e->f && exp_has_func_or_cmp(e->f, 
true)));
                }
        case e_column:
        case e_psm:
@@ -2410,6 +2428,12 @@ exp_has_func(sql_exp *e)
        return 0;
 }
 
+int
+exp_has_func(sql_exp *e)
+{
+       return exp_has_func_or_cmp(e, false);
+}
+
 static int
 exps_has_sideeffect( list *exps)
 {
diff --git a/sql/server/rel_optimize_exps.c b/sql/server/rel_optimize_exps.c
--- a/sql/server/rel_optimize_exps.c
+++ b/sql/server/rel_optimize_exps.c
@@ -454,7 +454,7 @@ rel_simplify_predicates(visitor *v, sql_
                sql_exp *le = n->data;
                sql_exp *re = n->next->data;
 
-               if (exp_is_atom(le) && exp_is_atom(re) && le->type == e_atom && 
le->l && re->type == e_atom && re->l) {
+               if (exp_is_atom(le) && !exp_is_null(le) && exp_is_atom(re) && 
le->type == e_atom && le->l && re->type == e_atom && re->l) {
                        n = n->next->next;
                        if (exp_match_exp(le, re)) { /* x==y -> a */
                                sql_exp *res = n->data;
diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -3586,6 +3586,8 @@ rel_use_index(visitor *v, sql_rel *rel)
                for( n = exps->h; n && single_table; n = n->next) {
                        sql_exp *e = n->data, *nre = e->l;
 
+                       if (!is_compare(e->type) || is_anti(e) || e->flag != 
cmp_equal)
+                               return rel;
                        if (is_join(rel->op) && ((left && !rel_find_exp(rel->l, 
nre)) || (!left && rel_find_exp(rel->r, nre))))
                                nre = e->r;
                        single_table = (!re || (exp_relname(nre) && 
exp_relname(re) && strcmp(exp_relname(nre), exp_relname(re)) == 0));
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to