Changeset: 4e8a9ba6a0bc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4e8a9ba6a0bc
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_propagate.c
        sql/server/rel_updates.c
Branch: Jun2020
Log Message:

Several small optimizations.

Added missing op_ddl cases for rel_properties counter and rel_join_order 
optimizer.
Generate isnull = false instead of isnul != true in some places, so it can be 
optimized by rel_simplify_predicates optimizer.


diffs (274 lines):

diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -251,47 +251,61 @@ psm_exps_properties(mvc *sql, global_pro
 static void
 rel_properties(mvc *sql, global_props *gp, sql_rel *rel) 
 {
-       if(!rel)
+       if (!rel)
                return;
 
        gp->cnt[(int)rel->op]++;
        switch (rel->op) {
        case op_basetable:
+               break;
        case op_table:
-               if (rel->op == op_table && rel->l && rel->flag != 
TRIGGER_WRAPPER) 
+               if (rel->l && rel->flag != TRIGGER_WRAPPER) 
                        rel_properties(sql, gp, rel->l);
                break;
-       case op_join: 
-       case op_left: 
-       case op_right: 
-       case op_full: 
-
-       case op_semi: 
-       case op_anti: 
-
-       case op_union: 
-       case op_inter: 
-       case op_except: 
-               rel_properties(sql, gp, rel->l);
-               rel_properties(sql, gp, rel->r);
+       case op_join:
+       case op_left:
+       case op_right:
+       case op_full:
+
+       case op_semi:
+       case op_anti:
+
+       case op_union:
+       case op_inter:
+       case op_except:
+               if (rel->l)
+                       rel_properties(sql, gp, rel->l);
+               if (rel->r)
+                       rel_properties(sql, gp, rel->r);
                break;
        case op_project:
        case op_select:
        case op_groupby:
        case op_topn:
        case op_sample:
-       case op_ddl:
-               if (rel->op == op_ddl && rel->flag == ddl_psm && rel->exps)
-                       psm_exps_properties(sql, gp, rel->exps);
                if (rel->l)
                        rel_properties(sql, gp, rel->l);
                break;
        case op_insert:
        case op_update:
        case op_delete:
+               if (rel->r)
+                       rel_properties(sql, gp, rel->r);
+               break;
        case op_truncate:
-               if (rel->r) 
-                       rel_properties(sql, gp, rel->r);
+               break;
+       case op_ddl:
+               if (rel->flag == ddl_psm && rel->exps)
+                       psm_exps_properties(sql, gp, rel->exps);
+               if (rel->flag == ddl_output || rel->flag == ddl_create_seq || 
rel->flag == ddl_alter_seq) {
+                       if (rel->l)
+                               rel_properties(sql, gp, rel->l);
+               } else if (rel->flag == ddl_list || rel->flag == ddl_exception) 
{
+                       if (rel->l)
+                               rel_properties(sql, gp, rel->l);
+                       if (rel->r)
+                               rel_properties(sql, gp, rel->r);
+               }
                break;
        }
 
@@ -1162,16 +1176,19 @@ rel_join_order(mvc *sql, sql_rel *rel)
                rel->l = rel_join_order(sql, rel->l);
                break;
        case op_ddl: 
-               rel->l = rel_join_order(sql, rel->l);
-               if (rel->r)
+               if (rel->flag == ddl_output || rel->flag == ddl_create_seq || 
rel->flag == ddl_alter_seq) {
+                       rel->l = rel_join_order(sql, rel->l);
+               } else if (rel->flag == ddl_list || rel->flag == ddl_exception) 
{
+                       rel->l = rel_join_order(sql, rel->l);
                        rel->r = rel_join_order(sql, rel->r);
+               }
                break;
        case op_insert:
        case op_update:
        case op_delete:
+               rel->r = rel_join_order(sql, rel->r);
+               break;
        case op_truncate:
-               rel->l = rel_join_order(sql, rel->l);
-               rel->r = rel_join_order(sql, rel->r);
                break;
        }
        if (is_join(rel->op) && rel->exps && !rel_is_ref(rel)) {
@@ -5298,6 +5315,7 @@ rel_find_joins(mvc *sql, sql_rel *parent
                case op_basetable:
                case op_table:
                case op_ddl:
+               case op_truncate:
                        break;
                case op_join:
                case op_left:
@@ -5333,8 +5351,7 @@ rel_find_joins(mvc *sql, sql_rel *parent
                } break;
                case op_insert:
                case op_update:
-               case op_delete:
-               case op_truncate: {
+               case op_delete: {
                        if (rel->r)
                                rel_find_joins(sql, rel, rel->r, l, depth + 1);
                } break;
@@ -6605,9 +6622,10 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
 
        switch(rel->op) {
        case op_basetable:
+               break;
        case op_table:
 
-               if (rel->op == op_table && rel->l && rel->flag != 
TRIGGER_WRAPPER) {
+               if (rel->l && rel->flag != TRIGGER_WRAPPER) {
                        rel_used(rel);
                        if (rel->r)
                                exp_mark_used(rel->l, rel->r, 0);
@@ -6832,17 +6850,16 @@ rel_dce_refs(mvc *sql, sql_rel *rel, lis
        case op_basetable:
        case op_insert:
        case op_ddl:
+       case op_truncate:
                break;
 
        case op_update:
        case op_delete:
-       case op_truncate:
 
                if (rel->r)
                        rel_dce_refs(sql, rel->r, refs);
                break;
 
-
        case op_union: 
        case op_inter: 
        case op_except: 
@@ -7324,7 +7341,7 @@ rel_simplify_like_select(mvc *sql, sql_r
 static sql_rel *
 rel_simplify_predicates(mvc *sql, sql_rel *rel, int *changes)
 {
-       if ((is_select(rel->op) || is_join(rel->op) || is_semi(rel->op)) && 
rel->exps && rel->card > CARD_ATOM) {
+       if ((is_select(rel->op) || is_join(rel->op) || is_semi(rel->op)) && 
rel->exps) {
                node *n;
                list *exps = sa_list(sql->sa);
 
@@ -7367,7 +7384,7 @@ rel_simplify_predicates(mvc *sql, sql_re
                                                l = args->h->data;
                                                if (exp_subtype(l)) {
                                                        r = exp_atom(sql->sa, 
atom_general(sql->sa, exp_subtype(l), NULL));
-                                                       e = 
exp_compare(sql->sa, l, r, cmp_equal);
+                                                       e = 
exp_compare(sql->sa, l, r, e->flag);
                                                        if (e && !flag)
                                                                set_anti(e);
                                                        if (e)
@@ -8840,9 +8857,7 @@ static sql_rel *
 optimize_rel(mvc *sql, sql_rel *rel, int *g_changes, int level, int 
value_based_opt) 
 {
        int changes = 0, e_changes = 0;
-       global_props gp; 
-
-       gp = (global_props) {.cnt = {0},};
+       global_props gp = (global_props) {.cnt = {0},};
        rel_properties(sql, &gp, rel);
 
        TRC_DEBUG_IF(SQL_REWRITER) {
@@ -8877,7 +8892,7 @@ optimize_rel(mvc *sql, sql_rel *rel, int
        }
 
        if ((gp.cnt[op_select] || gp.cnt[op_left] || gp.cnt[op_right] || 
gp.cnt[op_full] || 
-                gp.cnt[op_join] || gp.cnt[op_semi] || gp.cnt[op_anti] || 
gp.cnt[op_ddl]) && level <= 0)
+                gp.cnt[op_join] || gp.cnt[op_semi] || gp.cnt[op_anti]) && 
level <= 0)
                if (value_based_opt)
                        rel = rel_visitor_bottomup(sql, rel, 
&rel_simplify_predicates, &changes);
 
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -210,7 +210,7 @@ create_range_partition_anti_rel(sql_quer
                                anti_exp = anti_nils;
                }
        } else {
-               anti_exp = exp_compare(sql->sa, anti_nils, 
exp_atom_bool(sql->sa, 1), cmp_notequal);
+               anti_exp = exp_compare(sql->sa, anti_nils, 
exp_atom_bool(sql->sa, 0), cmp_equal);
        }
 
        anti_rel = rel_select(sql->sa, anti_rel, anti_exp);
@@ -252,7 +252,7 @@ create_list_partition_anti_rel(sql_query
                }
        } else {
                assert(with_nills);
-               anti_exp = exp_compare(sql->sa, anti_nils, 
exp_atom_bool(sql->sa, 1), cmp_notequal);
+               anti_exp = exp_compare(sql->sa, anti_nils, 
exp_atom_bool(sql->sa, 0), cmp_equal);
        }
 
        anti_rel = rel_select(sql->sa, anti_rel, anti_exp);
@@ -694,7 +694,7 @@ rel_generate_subinserts(sql_query *query
                                found_nils |= is_bit_nil(pt->with_nills);
                                if (pt->with_nills == false) { /* full range 
without nils */
                                        sql_exp *nils = rel_unop_(sql, dup, le, 
NULL, "isnull", card_value);
-                                       nils = exp_compare(sql->sa, nils, 
exp_atom_bool(sql->sa, 1), cmp_notequal);
+                                       nils = exp_compare(sql->sa, nils, 
exp_atom_bool(sql->sa, 0), cmp_equal);
                                        full_range = range = nils; /* ugh */
                                }
                        }
@@ -795,7 +795,7 @@ rel_generate_subinserts(sql_query *query
                } else if (!anti_exp) {
                        anti_nils = rel_unop_(sql, NULL, exp_copy(sql, 
anti_le), NULL, "isnull", card_value);
                        set_has_no_nil(anti_nils);
-                       anti_exp = exp_compare(sql->sa, anti_nils, 
exp_atom_bool(sql->sa, 1), cmp_notequal);
+                       anti_exp = exp_compare(sql->sa, anti_nils, 
exp_atom_bool(sql->sa, 0), cmp_equal);
                }
                //generate a count aggregation for the values not present in 
any of the partitions
                anti_rel = rel_select(sql->sa, anti_rel, anti_exp);
@@ -911,7 +911,7 @@ rel_subtable_insert(sql_query *query, sq
                                found_all_range_values = pt->with_nills != 1;
                                if (pt->with_nills == true) {
                                        anti_nils = rel_unop_(sql, anti_dup, 
exp_copy(sql, anti_le), NULL, "isnull", card_value);
-                                       anti_exp = exp_compare(sql->sa, 
anti_nils, exp_atom_bool(sql->sa, 1), cmp_notequal);
+                                       anti_exp = exp_compare(sql->sa, 
anti_nils, exp_atom_bool(sql->sa, 0), cmp_equal);
                                }
                        } else {
                                sql_exp *e2 = create_table_part_atom_exp(sql, 
pt->tpe, pt->part.range.maxvalue);
@@ -957,7 +957,7 @@ rel_subtable_insert(sql_query *query, sq
                } else {
                        assert(pt->with_nills);
                        anti_nils = rel_unop_(sql, anti_dup, exp_copy(sql, 
anti_le), NULL, "isnull", card_value);
-                       anti_exp = exp_compare(sql->sa, anti_nils, 
exp_atom_bool(sql->sa, 1), cmp_notequal);
+                       anti_exp = exp_compare(sql->sa, anti_nils, 
exp_atom_bool(sql->sa, 0), cmp_equal);
                }
        } else {
                assert(0);
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -1385,7 +1385,7 @@ merge_into_table(sql_query *query, dlist
                                project_first = exp_ref(sql, project_first);
                                nils = rel_unop_(sql, extra_project, 
project_first, NULL, "isnull", card_value);
                                set_has_no_nil(nils);
-                               extra_select = rel_select(sql->sa, 
extra_project, exp_compare(sql->sa, nils, exp_atom_bool(sql->sa, 1), 
cmp_notequal));
+                               extra_select = rel_select(sql->sa, 
extra_project, exp_compare(sql->sa, nils, exp_atom_bool(sql->sa, 0), 
cmp_equal));
 
                                //the update statement requires a projection on 
the right side
                                extra_project = rel_project(sql->sa, 
extra_select, rel_projections(sql, bt, NULL, 1, 0));
@@ -1414,7 +1414,7 @@ merge_into_table(sql_query *query, dlist
                                project_first = exp_ref(sql, project_first);
                                nils = rel_unop_(sql, extra_project, 
project_first, NULL, "isnull", card_value);
                                set_has_no_nil(nils);
-                               extra_select = rel_select(sql->sa, 
extra_project, exp_compare(sql->sa, nils, exp_atom_bool(sql->sa, 1), 
cmp_notequal));
+                               extra_select = rel_select(sql->sa, 
extra_project, exp_compare(sql->sa, nils, exp_atom_bool(sql->sa, 0), 
cmp_equal));
 
                                //the delete statement requires a projection on 
the right side, which will be the oid values
                                extra_project = rel_project(sql->sa, 
extra_select, list_append(new_exp_list(sql->sa),
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to