Changeset: dbd5bac106c8 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=dbd5bac106c8 Modified Files: sql/server/rel_unnest.c sql/test/mergetables/Tests/sqlsmith-exists.stable.out Branch: default Log Message:
optimize false/true handling diffs (114 lines): diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -1536,6 +1536,7 @@ rewrite_simplify_exp(mvc *sql, sql_rel * if (is_compare(e->type) && e->flag == cmp_or) { list *l = e->l, *r = e->r; + sql->caching = 0; if (list_length(l) == 1) { sql_exp *ie = l->h->data; @@ -1545,12 +1546,46 @@ rewrite_simplify_exp(mvc *sql, sql_rel * return r->h->data; } } - /* TRUE and X -> X - * FALSE and X -> FALSE */ } return e; } +static sql_rel * +rewrite_simplify(mvc *sql, sql_rel *rel) +{ + if (!rel) + return rel; + + if (is_select(rel->op) && !list_empty(rel->exps)) { + int needed = 0; + for (node *n=rel->exps->h; n && !needed; n = n->next) { + sql_exp *e = n->data; + + needed = (exp_is_true(sql, e) || exp_is_false(sql, e)); + } + if (needed) { + list *nexps = sa_list(sql->sa); + sql->caching = 0; + for (node *n=rel->exps->h; n; n = n->next) { + sql_exp *e = n->data; + + /* TRUE and X -> X */ + if (exp_is_true(sql, e)) { + continue; + /* FALSE and X -> FALSE */ + } else if (exp_is_false(sql, e)) { + rel->exps = append(sa_list(sql->sa), e); + return rel; + } else { + append(nexps, e); + } + } + rel->exps = nexps; + } + } + return rel; +} + /* add an dummy true projection column */ static sql_rel * rewrite_empty_project(mvc *sql, sql_rel *rel) @@ -1691,6 +1726,8 @@ rewrite_or_exp(mvc *sql, sql_rel *rel) sql_rel *r = rel_dup(rel); list *exps = rel_projections(sql, rel, NULL, 1, 1); + list_remove_node(rel->exps, n); /* remove or expression */ + l = rel_select(sql->sa, l, NULL); l->exps = e->l; l = rewrite_or_exp(sql, l); @@ -1698,7 +1735,6 @@ rewrite_or_exp(mvc *sql, sql_rel *rel) r->exps = e->r; r = rewrite_or_exp(sql, r); - list_remove_node(rel->exps, n); /* remove or expression */ list *ls = rel_projections(sql, rel, NULL, 1, 1); list *rs = rel_projections(sql, rel, NULL, 1, 1); rel = rel_setop_check_types(sql, l, r, ls, rs, op_union); @@ -2585,6 +2621,7 @@ rel_unnest(mvc *sql, sql_rel *rel) { rel_reset_subquery(rel); rel = rel_exp_visitor(sql, rel, &rewrite_simplify_exp); + rel = rel_visitor(sql, rel, &rewrite_simplify); rel = rel_visitor(sql, rel, &rewrite_aggregates); rel = rel_visitor(sql, rel, &rewrite_or_exp); rel = rel_exp_visitor(sql, rel, &rewrite_rank); diff --git a/sql/test/mergetables/Tests/sqlsmith-exists.stable.out b/sql/test/mergetables/Tests/sqlsmith-exists.stable.out --- a/sql/test/mergetables/Tests/sqlsmith-exists.stable.out +++ b/sql/test/mergetables/Tests/sqlsmith-exists.stable.out @@ -83,6 +83,25 @@ stdout of test 'sqlsmith-exists` in dire % c0, c1, c2, c3, c4, c5, c6, c7, c8, c9 # name % varchar, int, smallint, smallint, int, int, smallint, smallint, smallint, varchar # type % 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 # length +#SELECT subq_1.c0 AS c0, +# subq_1.c0 AS c1, +# subq_0.c0 AS c2, +# subq_1.c0 AS c3, +# subq_1.c0 AS c4, +# subq_0.c0 AS c5 +#FROM (SELECT ref_0.function_type_name AS c0 +# FROM sys.function_types AS ref_0 +# WHERE false +# LIMIT 143) AS subq_0 +# LEFT JOIN (SELECT ref_1.table_id AS c0 +# FROM sys.table_partitions AS ref_1 +# WHERE ( false ) +# AND ( EXISTS +# (SELECT ref_2.fk_name AS c0, +% .subq_1, .subq_1, .subq_0, .subq_1, .subq_1, .subq_0 # table_name +% c0, c1, c2, c3, c4, c5 # name +% int, int, varchar, int, int, varchar # type +% 1, 1, 0, 1, 1, 0 # length #ROLLBACK; # 19:56:32 > _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list