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