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

Optimize cmp_in with 1 input to cmp_equal if possible early on


diffs (29 lines):

diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -2133,13 +2133,13 @@ rel_in_value_exp(sql_query *query, sql_r
                        supertype(&super, exp_subtype(values), exp_subtype(le));
 
                        /* on selection/join cases we can generate cmp 
expressions instead of anyequal for trivial cases */
-                       if (is_sql_where(f) && !is_sql_farg(f) && 
exps_are_atoms(vals)) { 
-                               if (list_length(vals) == 1) { /* use cmp_equal 
instead of anyequal for 1 constant */
+                       if (is_sql_where(f) && !is_sql_farg(f) && 
!exp_has_rel(le)) {
+                               if (list_length(vals) == 1 && 
!exps_have_rel_exp(vals)) { /* use cmp_equal instead of cmp_in for 1 expression 
*/
                                        sql_exp *first = vals->h->data;
                                        if (rel_convert_types(sql, rel ? *rel : 
NULL, rel ? *rel : NULL, &le, &first, 1, type_equal_no_any) < 0)
                                                return NULL;
                                        e = exp_compare(sql->sa, le, first, 
(sc->token == SQL_IN) ? cmp_equal : cmp_notequal);
-                               } else { /* use cmp_in instead of anyequal for 
n constants */
+                               } else if (exps_are_atoms(vals)) { /* use 
cmp_in instead of anyequal for n simple expressions */
                                        for (node *n = vals->h ; n ; n = 
n->next)
                                                if ((n->data = 
rel_check_type(sql, &super, rel ? *rel : NULL, n->data, type_equal)) == NULL)
                                                        return NULL;
@@ -2169,7 +2169,7 @@ rel_in_exp(sql_query *query, sql_rel *re
        if (!e || !rel)
                return NULL;
 
-       if (e->type == e_cmp) /* it's a exp_in or cmp_equal of constants, push 
down early on if possible */
+       if (e->type == e_cmp) /* it's a exp_in or cmp_equal of simple 
expressions, push down early on if possible */
                return rel_select_push_exp_down(sql, rel, e, e->l, e->l, e->r, 
e->r, NULL, f);
        return rel_select_add_exp(sql->sa, rel, e);
 }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to