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]

Reply via email to