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