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

Reply via email to