Changeset: 2a09928588da for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2a09928588da Modified Files: sql/server/rel_rewriter.c sql/test/miscellaneous/Tests/deallocate.stable.out Branch: default Log Message:
Small optimization needed for properties branch, if a select or inner join is not going to output tuples, replace the inner relations with a dummy projection diffs (57 lines): diff --git a/sql/server/rel_rewriter.c b/sql/server/rel_rewriter.c --- a/sql/server/rel_rewriter.c +++ b/sql/server/rel_rewriter.c @@ -176,8 +176,31 @@ rewrite_simplify(visitor *v, sql_rel *re if (!rel) return rel; - if ((is_select(rel->op) || is_join(rel->op) || is_semi(rel->op)) && !list_empty(rel->exps)) + if ((is_select(rel->op) || is_join(rel->op) || is_semi(rel->op)) && !list_empty(rel->exps)) { rel->exps = exps_simplify_exp(v, rel->exps); + /* At a select or inner join relation if the single expression is false, eliminate the inner relations with a dummy projection */ + if (list_length(rel->exps) == 1 && exp_is_false(rel->exps->h->data)) { + if ((is_select(rel->op) || (is_innerjoin(rel->op) && !rel_is_ref(rel->r))) && rel->card > CARD_ATOM && !rel_is_ref(rel->l)) { + list *nexps = sa_list(v->sql->sa), *toconvert = rel_projections(v->sql, rel->l, NULL, 1, 1); + if (is_innerjoin(rel->op)) + toconvert = list_merge(toconvert, rel_projections(v->sql, rel->r, NULL, 1, 1), NULL); + + for (node *n = toconvert->h ; n ; n = n->next) { + sql_exp *e = n->data, *a = exp_atom(v->sql->sa, atom_general(v->sql->sa, exp_subtype(e), NULL)); + exp_prop_alias(v->sql->sa, a, e); + list_append(nexps, a); + } + rel_destroy(rel->l); + if (is_innerjoin(rel->op)) { + rel_destroy(rel->r); + rel->r = NULL; + rel->op = op_select; + } + rel->l = rel_project(v->sql->sa, NULL, nexps); + rel->card = CARD_ATOM; + } + } + } return rel; } diff --git a/sql/test/miscellaneous/Tests/deallocate.stable.out b/sql/test/miscellaneous/Tests/deallocate.stable.out --- a/sql/test/miscellaneous/Tests/deallocate.stable.out +++ b/sql/test/miscellaneous/Tests/deallocate.stable.out @@ -87,7 +87,7 @@ stdout of test 'deallocate` in directory [ "prepare select \"system\" or ? from sys._tables where false;", 0, 0, "boolean", 1, 0, NULL, "%1", "%1" ] [ "prepare select \"system\" or ? from sys._tables where false;", 1, 1, "boolean", 1, 0, NULL, NULL, NULL ] #EXEC 3(false); -% sys.%1 # table_name +% .%1 # table_name % %1 # name % boolean # type % 5 # length @@ -124,7 +124,7 @@ stdout of test 'deallocate` in directory [ "boolean", 1, 0, "", "%1", "%1" ] [ "boolean", 1, 0, NULL, NULL, NULL ] #execute 15(false); -% sys.%1 # table_name +% .%1 # table_name % %1 # name % boolean # type % 5 # length _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list