Changeset: 5e24b4aad04e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/5e24b4aad04e
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_statistics.c
        sql/test/miscellaneous/Tests/unique_keys.test
Branch: Dec2023
Log Message:

fixes for issues #7447 and #7448

ranges queries can have null's and not return NULL, ie fixed 
optimizer/statistics
only use full hash index for selects


diffs (47 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -2592,6 +2592,8 @@ rel2bin_hash_lookup(backend *be, sql_rel
                        h = stmt_unop(be, s, NULL, hf);
                }
        }
+       if (n != NULL) /* need to use all cols of the index */
+               return NULL;
        if (h && h->nrcols) {
                if (!swap_rel) {
                        return stmt_join(be, idx, h, 0, cmp_equal, 0, 
semantics, false);
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
@@ -33,6 +33,10 @@ comparison_find_column(sql_exp *input, s
        }
 }
 
+/* multi lo <= col <= hi, maybe still be false even if lo or hi are NULL, 
possibly similar for filter on multiple
+ * columns */
+#define comp_single_column(c) (!c->f)
+
 static sql_exp *
 rel_propagate_column_ref_statistics(mvc *sql, sql_rel *rel, sql_exp *e)
 {
@@ -69,7 +73,7 @@ rel_propagate_column_ref_statistics(mvc 
                                                                *rval_min = 
find_prop_and_get(re->p, PROP_MIN), *rval_max = find_prop_and_get(re->p, 
PROP_MAX);
 
                                                        /* not semantics found 
or if explicitly filtering not null values from the column */
-                                                       found_without_semantics 
|= !is_semantics(comp) || (comp->flag == cmp_equal && lne && is_anti(comp) && 
exp_is_null(re));
+                                                       found_without_semantics 
|= (!is_semantics(comp) && comp_single_column(comp)) || (comp->flag == 
cmp_equal && lne && is_anti(comp) && exp_is_null(re));
                                                        still_unique |= 
comp->flag == cmp_equal && is_unique(le) && is_unique(re); /* unique if only 
equi-joins on unique columns are there */
                                                        if (is_full(rel->op) || 
(is_left(rel->op) && found_left) || (is_right(rel->op) && found_right)) /* on 
outer joins, min and max cannot be propagated on some cases */
                                                                continue;
diff --git a/sql/test/miscellaneous/Tests/unique_keys.test 
b/sql/test/miscellaneous/Tests/unique_keys.test
--- a/sql/test/miscellaneous/Tests/unique_keys.test
+++ b/sql/test/miscellaneous/Tests/unique_keys.test
@@ -91,7 +91,7 @@ project (
 | | | | table("sys"."testkeys") [ "testkeys"."a" NOT NULL UNIQUE HASHCOL , 
"testkeys"."b" UNIQUE HASHCOL  ]
 | | | ) [ ("testkeys"."b" UNIQUE HASHCOL ) = (int(32) "1") ],
 | | | table("sys"."othertable") [ "othertable"."a" UNIQUE ]
-| | ) [ ("testkeys"."a" NOT NULL UNIQUE HASHCOL ) = ("othertable"."a" NOT NULL 
UNIQUE) ]
+| | ) [ ("testkeys"."a" NOT NULL UNIQUE HASHCOL ) = ("othertable"."a" UNIQUE) ]
 | ) [ (int(32) "2") <= ("othertable"."a" UNIQUE) <= (int(32) "5") ]
 ) [ "testkeys"."a" NOT NULL UNIQUE HASHCOL  ]
 
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to