Changeset: 0d5f99dee038 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0d5f99dee038
Modified Files:
        sql/server/rel_optimize_sel.c
        sql/test/rel-optimizers/Tests/merge-ors-multi-col-eq-to-cmp_in.test
Branch: Dec2025
Log Message:

Merges Mar2025


diffs (82 lines):

diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -589,6 +589,8 @@ detect_multicol_cmp_eqs(mvc *sql, list *
                        /* compare the values of the hash_entry with the cols 
under cmp_eq from the list */
                        bool same_cols = true;
                        eq_mcv *mcv = he->value;
+                       if (list_length(mcv->cols) != list_length(sl))
+                               continue;
                        for (node *m = sl->h, *k = mcv->cols->h; m && k && 
same_cols; m = m->next, k = k->next) {
                                sql_exp *col_exp = ((sql_exp*)m->data)->l;
                                if (exp_equal(col_exp, k->data))
diff --git a/sql/test/rel-optimizers/Tests/merge-ors-base.test 
b/sql/test/rel-optimizers/Tests/merge-ors-base.test
--- a/sql/test/rel-optimizers/Tests/merge-ors-base.test
+++ b/sql/test/rel-optimizers/Tests/merge-ors-base.test
@@ -18,3 +18,11 @@ insert into b values (1, 20,   200),
                                         (3, 60,   600),
                                         (9, 180, 1800)
 
+statement ok
+create table dupv (n int, m int, k int)
+
+statement ok
+insert into dupv values (1, 20,   100),
+                        (1, 20,   200),
+                        (2, 40,   300)
+
diff --git 
a/sql/test/rel-optimizers/Tests/merge-ors-multi-col-eq-to-cmp_in.test 
b/sql/test/rel-optimizers/Tests/merge-ors-multi-col-eq-to-cmp_in.test
--- a/sql/test/rel-optimizers/Tests/merge-ors-multi-col-eq-to-cmp_in.test
+++ b/sql/test/rel-optimizers/Tests/merge-ors-multi-col-eq-to-cmp_in.test
@@ -174,3 +174,51 @@ project (
 | ) [ (("b"."m" NOT NULL) in (int(8) "40", int(8) "0", int(8) "180")) or (( [ 
"b"."m" NOT NULL, "b"."k" NOT NULL ]) in ( [ int(8) "20", int(11) "200" ],  [ 
int(8) "60", int(11) "600" ])) ]
 ) [ "b"."m" NOT NULL, "b"."k" NOT NULL ]
 
+query III rowsort incompatible
+select n, m, k from b where ((n = 1) AND (m = 20)) OR ((n = 3) AND (m = 60) 
AND (k=600))
+----
+1
+20
+200
+3
+60
+600
+
+query T nosort
+explain show details select n, m, k from b where ((n = 1) AND (m = 20)) OR ((n 
= 3) AND (m = 60) AND (k=600))
+----
+project (
+| select (
+| | table("sys"."b") [ "b"."n" NOT NULL, "b"."m" NOT NULL, "b"."k" NOT NULL ]
+| ) [ (("b"."n" NOT NULL) = (int(4) "1"), ("b"."m" NOT NULL) = (int(8) "20")) 
or (("b"."n" NOT NULL) = (int(4) "3"), ("b"."m" NOT NULL) = (int(8) "60"), 
("b"."k" NOT NULL) = (int(11) "600")) ]
+) [ "b"."n" NOT NULL, "b"."m" NOT NULL, "b"."k" NOT NULL ]
+
+query III rowsort
+select n, m, k from b where ((n = 1) AND (m = 20)) OR ((n = 2) AND (m = 40) 
AND (k=400)) OR ((n = 9) AND (m = 180)) OR ((n = 3) AND (m = 60) AND (k=600))
+----
+1
+20
+200
+2
+40
+400
+3
+60
+600
+9
+180
+1800
+
+query T nosort
+explain show details select * from b where ((n = 1) AND (m = 20)) OR ((n = 2) 
AND (m = 40) AND (k=400)) OR ((n = 9) AND (m = 180)) OR ((n = 3) AND (m = 60) 
AND (k=600))
+----
+project (
+| select (
+| | table("sys"."b") [ "b"."n" NOT NULL, "b"."m" NOT NULL, "b"."k" NOT NULL ]
+| ) [ (( [ "b"."n" NOT NULL, "b"."m" NOT NULL, "b"."k" NOT NULL ]) in ( [ 
int(4) "2", int(8) "40", int(11) "400" ],  [ int(4) "3", int(8) "60", int(11) 
"600" ])) or (( [ "b"."n" NOT NULL, "b"."m" NOT NULL ]) in ( [ int(4) "1", 
int(8) "20" ],  [ int(4) "9", int(8) "180" ])) ]
+) [ "b"."n" NOT NULL, "b"."m" NOT NULL, "b"."k" NOT NULL ]
+
+query I rowsort
+select sum(k) from dupv where ((n = 2) AND (m = 40)) OR ((n = 1) AND (m = 20) 
AND (k=200))
+----
+500
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to