Changeset: 614fae5d98d4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/614fae5d98d4
Modified Files:
        sql/server/rel_statistics.c
        sql/test/BugTracker/Tests/explain.SF-1739353.test
        sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.test
Branch: properties
Log Message:

Use right macro for null availability check. Fix cmp_notequal case


diffs (152 lines):

diff --git a/sql/server/rel_statistics.c b/sql/server/rel_statistics.c
--- a/sql/server/rel_statistics.c
+++ b/sql/server/rel_statistics.c
@@ -248,7 +248,7 @@ rel_setop_get_statistics(mvc *sql, sql_r
                 *rval_min = find_prop_and_get(re->p, PROP_MIN), *rval_max = 
find_prop_and_get(re->p, PROP_MAX);
 
        /* for the intersection, if both expresssions don't overlap, it can be 
pruned */
-       if (is_inter(rel->op) && exp_is_not_null(le) && exp_is_not_null(re) &&
+       if (is_inter(rel->op) && !has_nil(le) && !has_nil(re) &&
                ((rval_max && lval_min && atom_cmp(rval_max, lval_min) < 0) || 
(rval_min && lval_max && atom_cmp(rval_min, lval_max) > 0)))
                return true;
 
@@ -469,53 +469,55 @@ rel_prune_predicates(visitor *v, sql_rel
 
                                always_false |= not_int1 || not_int2 || 
not_int3;
                                /* for anti the middle must be before the left 
or after the right or the right after the left, for the other the middle must 
be always between the left and right intervals */
-                               always_true |= exp_is_not_null(le) && 
exp_is_not_null(re) && exp_is_not_null(fe) &&
+                               always_true |= !has_nil(le) && !has_nil(re) && 
!has_nil(fe) &&
                                        lval_min && lval_max && rval_min && 
rval_max && fval_min && fval_max &&
                                        (is_anti(e) ? ((lower == cmp_gte ? 
atom_cmp(rval_min, lval_max) > 0 : atom_cmp(rval_min, lval_max) >= 0) || 
(higher == cmp_lte ? atom_cmp(lval_min, fval_max) > 0 : atom_cmp(lval_min, 
fval_max) >= 0) || atom_cmp(rval_min, fval_max) > 0) :
                                        ((lower == cmp_gte ? atom_cmp(lval_min, 
rval_max) >= 0 : atom_cmp(lval_min, rval_max) > 0) && (higher == cmp_lte ? 
atom_cmp(fval_min, lval_max) >= 0 : atom_cmp(fval_min, lval_max) > 0)));
                        } else if (!fe) {
+                               if (!is_semantics(e)) /* trival not null cmp 
null case */
+                                       always_false |= !is_anti(e) && 
((exp_is_not_null(le) && exp_is_null(re)) || (exp_is_null(le) && 
exp_is_not_null(re)));
                                switch (e->flag) {
                                case cmp_equal:
                                        if (lval_min && lval_max && rval_min && 
rval_max && (!is_semantics(e) || !has_nil(le) || !has_nil(re)))
-                                               always_false |= is_anti(e) ? 
(atom_cmp(lval_min, rval_min) == 0 && atom_cmp(lval_max, rval_max) <= 0) : 
(atom_cmp(rval_max, lval_min) < 0 || atom_cmp(rval_min, lval_max) > 0);
+                                               always_false |= (is_anti(e) ? 
(atom_cmp(lval_min, rval_min) == 0 && atom_cmp(lval_max, rval_max) <= 0) : 
(atom_cmp(rval_max, lval_min) < 0 || atom_cmp(rval_min, lval_max) > 0));
                                        if (is_semantics(e)) { /* prune *= NULL 
cases */
-                                               always_false |= is_anti(e) ? 
(exp_is_null(le) && exp_is_null(re)) : ((exp_is_not_null(le) && 
exp_is_null(re)) || (exp_is_null(le) && exp_is_not_null(re)));
-                                               always_true |= is_anti(e) ? 
((exp_is_not_null(le) && exp_is_null(re)) || (exp_is_null(le) && 
exp_is_not_null(re))) : (exp_is_null(le) && exp_is_null(re));
+                                               always_false |= (is_anti(e) ? 
(exp_is_null(le) && exp_is_null(re)) : ((exp_is_not_null(le) && 
exp_is_null(re)) || (exp_is_null(le) && exp_is_not_null(re))));
+                                               always_true |= (is_anti(e) ? 
((exp_is_not_null(le) && exp_is_null(re)) || (exp_is_null(le) && 
exp_is_not_null(re))) : (exp_is_null(le) && exp_is_null(re)));
                                        }
                                        break;
                                case cmp_notequal:
-                                       if (lval_min && lval_max && rval_min && 
rval_max && (!is_semantics(e) || !has_nil(le) || !has_nil(re)))
-                                               always_true |= is_anti(e) ? 
(atom_cmp(lval_min, rval_min) == 0 && atom_cmp(lval_max, rval_max) <= 0) : 
(atom_cmp(rval_max, lval_min) < 0 || atom_cmp(rval_min, lval_max) > 0);
+                                       if (lval_min && lval_max && rval_min && 
rval_max)
+                                               always_true |= !has_nil(le) && 
!has_nil(re) && (is_anti(e) ? (atom_cmp(lval_min, rval_min) == 0 && 
atom_cmp(lval_max, rval_max) <= 0) : (atom_cmp(rval_max, lval_min) < 0 || 
atom_cmp(rval_min, lval_max) > 0));
                                        if (is_semantics(e)) {
-                                               always_true |= is_anti(e) ? 
(exp_is_null(le) && exp_is_null(re)) : ((exp_is_not_null(le) && 
exp_is_null(re)) || (exp_is_null(le) && exp_is_not_null(re)));
-                                               always_false |= is_anti(e) ? 
((exp_is_not_null(le) && exp_is_null(re)) || (exp_is_null(le) && 
exp_is_not_null(re))) : (exp_is_null(le) && exp_is_null(re));
+                                               always_true |= (is_anti(e) ? 
(exp_is_null(le) && exp_is_null(re)) : ((exp_is_not_null(le) && 
exp_is_null(re)) || (exp_is_null(le) && exp_is_not_null(re))));
+                                               always_false |= (is_anti(e) ? 
((exp_is_not_null(le) && exp_is_null(re)) || (exp_is_null(le) && 
exp_is_not_null(re))) : (exp_is_null(le) && exp_is_null(re)));
                                        }
                                        break;
                                case cmp_gt:
                                        if (lval_max && rval_min)
-                                               always_false |= is_anti(e) ? 
atom_cmp(lval_max, rval_min) > 0 : atom_cmp(lval_max, rval_min) <= 0;
+                                               always_false |= (is_anti(e) ? 
atom_cmp(lval_max, rval_min) > 0 : atom_cmp(lval_max, rval_min) <= 0);
                                        if (lval_min && rval_max)
-                                               always_true |= 
exp_is_not_null(le) && exp_is_not_null(re) && (is_anti(e) ? atom_cmp(lval_min, 
rval_max) <= 0 : atom_cmp(lval_min, rval_max) > 0);
+                                               always_true |= !has_nil(le) && 
!has_nil(re) && (is_anti(e) ? atom_cmp(lval_min, rval_max) <= 0 : 
atom_cmp(lval_min, rval_max) > 0);
                                        break;
                                case cmp_gte:
                                        if (lval_max && rval_min)
-                                               always_false |= is_anti(e) ? 
atom_cmp(lval_max, rval_min) >= 0 : atom_cmp(lval_max, rval_min) < 0;
+                                               always_false |= (is_anti(e) ? 
atom_cmp(lval_max, rval_min) >= 0 : atom_cmp(lval_max, rval_min) < 0);
                                        if (lval_min && rval_max)
-                                               always_true |= 
exp_is_not_null(le) && exp_is_not_null(re) && (is_anti(e) ? atom_cmp(lval_min, 
rval_max) < 0 : atom_cmp(lval_min, rval_max) >= 0);
+                                               always_true |= !has_nil(le) && 
!has_nil(re) && (is_anti(e) ? atom_cmp(lval_min, rval_max) < 0 : 
atom_cmp(lval_min, rval_max) >= 0);
                                        break;
                                case cmp_lt:
                                        if (lval_min && rval_max)
-                                               always_false |= is_anti(e) ? 
atom_cmp(lval_min, rval_max) < 0 : atom_cmp(lval_min, rval_max) >= 0;
+                                               always_false |= (is_anti(e) ? 
atom_cmp(lval_min, rval_max) < 0 : atom_cmp(lval_min, rval_max) >= 0);
                                        if (lval_max && rval_min)
-                                               always_true |= 
exp_is_not_null(le) && exp_is_not_null(re) && (is_anti(e) ? atom_cmp(lval_max, 
rval_min) >= 0 : atom_cmp(lval_max, rval_min) < 0);
+                                               always_true |= !has_nil(le) && 
!has_nil(re) && (is_anti(e) ? atom_cmp(lval_max, rval_min) >= 0 : 
atom_cmp(lval_max, rval_min) < 0);
                                        break;
                                case cmp_lte:
                                        if (lval_min && rval_max)
-                                               always_false |= is_anti(e) ? 
atom_cmp(lval_min, rval_max) <= 0 : atom_cmp(lval_min, rval_max) > 0;
+                                               always_false |= (is_anti(e) ? 
atom_cmp(lval_min, rval_max) <= 0 : atom_cmp(lval_min, rval_max) > 0);
                                        if (lval_max && rval_min)
-                                               always_true |= 
exp_is_not_null(le) && exp_is_not_null(re) && (is_anti(e) ? atom_cmp(lval_max, 
rval_min) > 0 : atom_cmp(lval_max, rval_min) <= 0);
+                                               always_true |= !has_nil(le) && 
!has_nil(re) && (is_anti(e) ? atom_cmp(lval_max, rval_min) > 0 : 
atom_cmp(lval_max, rval_min) <= 0);
                                        break;
-                               default: /* Maybe later I can do cmp_in and 
cmp_notin */
+                               default: /* Maybe later I can do cmp_in, 
cmp_notin, mark_in and mark_notin, but don't forget to remove is_theta_exp 
check up there */
                                        break;
                                }
                        }
diff --git a/sql/test/BugTracker/Tests/explain.SF-1739353.test 
b/sql/test/BugTracker/Tests/explain.SF-1739353.test
--- a/sql/test/BugTracker/Tests/explain.SF-1739353.test
+++ b/sql/test/BugTracker/Tests/explain.SF-1739353.test
@@ -4,6 +4,8 @@ set optimizer='sequential_pipe'
 query T python .explain.function_histogram
 EXPLAIN SELECT "name" FROM "tables"
 ----
+algebra.thetaselect
+2
 bat.append
 2
 bat.new
@@ -13,13 +15,15 @@ 5
 querylog.define
 1
 sql.bind
-4
+6
 sql.mvc
 1
 sql.projectdelta
 2
 sql.resultSet
 1
+sql.subdelta
+1
 sql.tid
 2
 user.main
diff --git a/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.test 
b/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.test
--- a/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.test
+++ b/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.test
@@ -6,7 +6,9 @@ project (
 | | union (
 | | | group by (
 | | | | project (
-| | | | | table("sys"."_tables") [ "_tables"."id", "_tables"."type" ]
+| | | | | select (
+| | | | | | table("sys"."_tables") [ "_tables"."id", "_tables"."type" ]
+| | | | | ) [ ("_tables"."type") != (smallint(16) "2") ]
 | | | | ) [ "_tables"."id" as "tables"."id" ]
 | | | ) [  ] [ "sys"."count"() NOT NULL as "%10"."%10" ],
 | | | group by (
@@ -28,6 +30,8 @@ aggr.count
 2
 aggr.sum
 1
+algebra.thetaselect
+2
 bat.append
 2
 bat.new
@@ -36,10 +40,14 @@ bat.single
 1
 querylog.define
 1
+sql.bind
+2
 sql.mvc
 1
 sql.resultSet
 1
+sql.subdelta
+1
 sql.tid
 2
 user.main
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to