Changeset: 7e96466d8268 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7e96466d8268
Modified Files:
sql/server/rel_statistics.c
sql/test/BugTracker-2026/Tests/7964-optimize-limit-0-queries.test
Branch: pp_hashjoin
Log Message:
optimize limit 0
diffs (121 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
@@ -1029,7 +1029,7 @@ rel_get_statistics_(visitor *v, sql_rel
ncount
= MAX(lv, rv);
uniques_estimate = MIN(uniques_estimate, ncount);
}
- if (uniques_estimate !=
BUN_MAX) {
+ if (uniques_estimate <
BUN_MAX) {
if
(uniques_estimate < r_uniques_estimate)
r_uniques_estimate = uniques_estimate;
dbl s =
((dbl)uniques_estimate/(lv*rv));
@@ -1050,9 +1050,9 @@ rel_get_statistics_(visitor *v, sql_rel
}
if (is_single(rel)) {
set_count_prop(v->sql->sa, rel, lv);
- } else if (join_idx_estimate != BUN_MAX) {
+ } else if (join_idx_estimate < BUN_MAX) {
set_count_prop(v->sql->sa, rel,
join_idx_estimate);
- } else if (r_uniques_estimate != BUN_MAX) {
+ } else if (r_uniques_estimate < BUN_MAX) {
set_count_prop(v->sql->sa, rel,
r_uniques_estimate);
} else if (list_length(rel->exps) == 1 &&
(exp_is_false(rel->exps->h->data) || exp_is_null(rel->exps->h->data))) {
/* corner cases for outer joins */
@@ -1174,16 +1174,33 @@ rel_get_statistics_(visitor *v, sql_rel
BUN lv = get_rel_count(rel->l);
if (lv != BUN_NONE) {
- sql_exp *le = rel->exps->h->data, *oe =
list_length(rel->exps) > 1 ? rel->exps->h->next->data : NULL;
- if (oe && oe->l && exp_is_not_null(oe)) { /* no
parameters */
- BUN offset = (BUN)
((atom*)oe->l)->data.val.lval;
- lv = offset >= lv ? 0 : lv - offset;
- }
+ sql_exp *le = rel->exps->h->data;
if (le->l && exp_is_not_null(le)) {
BUN limit = (BUN) ((atom*)le->l)->data.val.lval;
lv = MIN(lv, limit);
}
set_count_prop(v->sql->sa, rel, lv);
+ if (lv == 0 && can_be_pruned) {
+ list *exps = rel_projections(v->sql, rel->l,
NULL, 1, 1);
+ for (node *n = exps->h ; n ; n = n->next) {
+ sql_exp *e = n->data, *a =
exp_atom(v->sql->sa, atom_general(v->sql->sa, exp_subtype(e), NULL, 0));
+ exp_prop_alias(v->sql->sa, a, e);
+ n->data = a;
+ }
+ list_hash_clear(exps);
+ rel_destroy(v->sql, rel->l);
+ rel->l = NULL;
+ sql_rel *l = rel_project(v->sql->sa, NULL,
exps);
+ set_count_prop(v->sql->sa, l, 1);
+ l = rel_select(v->sql->sa, l,
exp_atom_bool(v->sql->sa, 0));
+ set_count_prop(v->sql->sa, l, 0);
+ rel->op = op_project;
+ rel->l = l;
+ rel->exps = rel_projections(v->sql, l, NULL, 1,
1);
+ set_count_prop(v->sql->sa, rel, 0);
+ set_nodistinct(rel); /* set relations may have
distinct flag set */
+ v->changes++;
+ }
}
break;
}
diff --git a/sql/test/BugTracker-2026/Tests/7964-optimize-limit-0-queries.test
b/sql/test/BugTracker-2026/Tests/7964-optimize-limit-0-queries.test
--- a/sql/test/BugTracker-2026/Tests/7964-optimize-limit-0-queries.test
+++ b/sql/test/BugTracker-2026/Tests/7964-optimize-limit-0-queries.test
@@ -81,27 +81,11 @@ WHERE a.id < 1000
ORDER BY a.payload, b.id
LIMIT 0
----
-top N (
-| project (
-| | select (
-| | | left outer group join (
-| | | | project (
-| | | | | join (
-| | | | | | select (
-| | | | | | | table("sys"."rift_perf_a") [ "rift_perf_a"."id" as "a"."id",
"rift_perf_a"."k" as "a"."k", "rift_perf_a"."payload" as "a"."payload" ]
-| | | | | | ) [ ("a"."id") < (int(17) "1000") ],
-| | | | | | select (
-| | | | | | | table("sys"."rift_perf_b") [ "rift_perf_b"."id" as "b"."id",
"rift_perf_b"."k" as "b"."k" ]
-| | | | | | ) [ ("b"."id") < (int(17) "1000") ]
-| | | | | ) [ ("a"."k") != ("b"."k") ]
-| | | | ) [ "a"."id", "a"."k", "a"."payload", "b"."id" ],
-| | | | select (
-| | | | | table("sys"."rift_digit") [ "rift_digit"."d" ]
-| | | | ) [ ("rift_digit"."d") = (int(4) "1") ]
-| | | ) [ ] [ boolean(1) "true" as "%2"."%2" ]
-| | ) [ (("a"."k") >= (int(4) "0")) or ("%2"."%2") ]
-| ) [ "a"."id" as "aid", "b"."id" as "bid", "a"."payload" as "p" ] [ "p",
"bid" ]
-) [ bigint(63) "0" ]
+project (
+| select (
+| | [ int(17) NULL as "aid", int(17) NULL as "bid", varchar(7) NULL as "p" ]
+| ) [ boolean(1) "false" ]
+) [ "aid", "bid", "p" ]
-- Equivalent query: also returns zero rows.
-- This version is optimized to a constant empty input.
@@ -144,16 +128,11 @@ WHERE a.id < 1000
ORDER BY a.payload, b.id
LIMIT 0
----
-top N (
-| project (
-| | join (
-| | | select (
-| | | | table("sys"."rift_perf_a") [ "rift_perf_a"."id" as "a"."id",
"rift_perf_a"."k" as "a"."k", "rift_perf_a"."payload" as "a"."payload" ]
-| | | ) [ boolean(1) "false" ],
-| | | table("sys"."rift_perf_b") [ "rift_perf_b"."id" as "b"."id",
"rift_perf_b"."k" as "b"."k" ]
-| | ) [ ("a"."k") != ("b"."k") ]
-| ) [ "a"."id" as "aid", "b"."id" as "bid", "a"."payload" as "p" ] [ "p",
"bid" ]
-) [ bigint(63) "0" ]
+project (
+| select (
+| | [ int(17) NULL as "aid", int(17) NULL as "bid", varchar(7) NULL as "p" ]
+| ) [ boolean(1) "false" ]
+) [ "aid", "bid", "p" ]
statement ok
DROP TABLE IF EXISTS rift_perf_b
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]