Changeset: 4f114ecd8ef2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4f114ecd8ef2
Modified Files:
sql/server/rel_optimize_sel.c
sql/test/rel-optimizers/Tests/merge-ors-base.test
sql/test/rel-optimizers/Tests/merge-ors-multi-col-eq-to-cmp_in.test
Branch: Mar2025
Log Message:
Fixes bug of merge-ors optimizer for multicolumn case
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
@@ -537,6 +537,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
@@ -152,3 +152,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
+plan 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) in (int(4) "1",
int(4) "3"), ("b"."m" NOT NULL) in (int(8) "20", int(8) "60") ]
+) [ "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
+plan 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]