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

Reply via email to