# LogicTest: local-opt

statement ok
CREATE TABLE t (k INT PRIMARY KEY, v INT, w INT, INDEX(v))

# There must be no limit at the index scan level.
query TTTTT colnames
EXPLAIN (VERBOSE) SELECT * FROM t WHERE v > 4 AND v < 8 AND w > 30 ORDER BY v LIMIT 2
----
tree                  field   description  columns    ordering
limit                 ·       ·            (k, v, w)  +v
 │                    count   2            ·          ·
 └── filter           ·       ·            (k, v, w)  +v
      │               filter  w > 30       ·          ·
      └── index-join  ·       ·            (k, v, w)  +v
           ├── scan   ·       ·            (k, v)     +v
           │          table   t@t_v_idx    ·          ·
           │          spans   /5-/8        ·          ·
           └── scan   ·       ·            (k, v, w)  ·
·                     table   t@primary    ·          ·

# This kind of query can be used to work around memory usage limits. We need to
# choose the "hard" limit of 100 over the "soft" limit of 25 (with the hard
# limit we will only store 100 rows in the sort node). See #19677.
query TTTTT colnames
EXPLAIN (VERBOSE) SELECT DISTINCT w FROM (SELECT w FROM t ORDER BY w LIMIT 100) ORDER BY w LIMIT 25
----
tree                      field        description  columns  ordering
limit                     ·            ·            (w)      weak-key(w); +w
 │                        count        25           ·        ·
 └── distinct             ·            ·            (w)      weak-key(w); +w
      │                   distinct on  w            ·        ·
      │                   order key    w            ·        ·
      └── limit           ·            ·            (w)      +w
           │              count        100          ·        ·
           └── sort       ·            ·            (w)      +w
                │         order        +w           ·        ·
                └── scan  ·            ·            (w)      ·
·                         table        t@primary    ·        ·
·                         spans        ALL          ·        ·

query TTTTT
EXPLAIN (VERBOSE) SELECT k, v FROM t ORDER BY k LIMIT 5
----
scan  ·      ·          (k, v)  +k
·     table  t@primary  ·       ·
·     spans  ALL        ·       ·
·     limit  5          ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT k, v FROM t ORDER BY k OFFSET 5
----
limit      ·       ·          (k, v)  +k
 │         offset  5          ·       ·
 └── scan  ·       ·          (k, v)  +k
·          table   t@primary  ·       ·
·          spans   ALL        ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT k, v FROM t ORDER BY v LIMIT (1+4) OFFSET 1
----
limit      ·       ·          (k, v)  +v
 │         count   5          ·       ·
 │         offset  1          ·       ·
 └── scan  ·       ·          (k, v)  +v
·          table   t@t_v_idx  ·       ·
·          spans   ALL        ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT k, v FROM t ORDER BY v DESC LIMIT (1+4) OFFSET 1
----
limit         ·       ·          (k, v)  -v
 │            count   5          ·       ·
 │            offset  1          ·       ·
 └── revscan  ·       ·          (k, v)  -v
·             table   t@t_v_idx  ·       ·
·             spans   ALL        ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT sum(w) FROM t GROUP BY k, v ORDER BY v DESC LIMIT 10
----
render                    ·            ·                (sum)            ·
 │                        render 0     agg0             ·                ·
 └── limit                ·            ·                (k, agg0, agg1)  -agg1
      │                   count        10               ·                ·
      └── sort            ·            ·                (k, agg0, agg1)  -agg1
           │              order        -agg1            ·                ·
           └── group      ·            ·                (k, agg0, agg1)  ·
                │         aggregate 0  k                ·                ·
                │         aggregate 1  sum(w)           ·                ·
                │         aggregate 2  any_not_null(v)  ·                ·
                │         group by     @1               ·                ·
                │         ordered      @1               ·                ·
                └── scan  ·            ·                (k, v, w)        +k
·                         table        t@primary        ·                ·
·                         spans        ALL              ·                ·

query TTTTT
EXPLAIN (VERBOSE) SELECT k FROM (SELECT k, v FROM t ORDER BY v LIMIT 4)
----
render     ·         ·          (k)     ·
 │         render 0  k          ·       ·
 └── scan  ·         ·          (k, v)  ·
·          table     t@t_v_idx  ·       ·
·          spans     ALL        ·       ·
·          limit     4          ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT k FROM (SELECT k, v, w FROM t ORDER BY v LIMIT 4)
----
render     ·         ·          (k)     ·
 │         render 0  k          ·       ·
 └── scan  ·         ·          (k, v)  ·
·          table     t@t_v_idx  ·       ·
·          spans     ALL        ·       ·
·          limit     4          ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT k FROM (SELECT k FROM t LIMIT 5) WHERE k != 2
----
filter     ·       ·          (k)  ·
 │         filter  k != 2     ·    ·
 └── scan  ·       ·          (k)  ·
·          table   t@t_v_idx  ·    ·
·          spans   ALL        ·    ·
·          limit   5          ·    ·

query TTTTT
EXPLAIN (VERBOSE) SELECT k, w FROM t WHERE v >= 1 AND v <= 100 LIMIT 10
----
render           ·         ·          (k, w)     ·
 │               render 0  k          ·          ·
 │               render 1  w          ·          ·
 └── index-join  ·         ·          (k, v, w)  ·
      ├── scan   ·         ·          (k, v)     ·
      │          table     t@t_v_idx  ·          ·
      │          spans     /1-/101    ·          ·
      │          limit     10         ·          ·
      └── scan   ·         ·          (k, v, w)  ·
·                table     t@primary  ·          ·

query TTTTT
EXPLAIN (VERBOSE) SELECT k, w FROM t WHERE v >= 1 AND v <= 100 ORDER BY v LIMIT 10
----
render           ·         ·          (k, w)     ·
 │               render 0  k          ·          ·
 │               render 1  w          ·          ·
 └── index-join  ·         ·          (k, v, w)  +v
      ├── scan   ·         ·          (k, v)     +v
      │          table     t@t_v_idx  ·          ·
      │          spans     /1-/101    ·          ·
      │          limit     10         ·          ·
      └── scan   ·         ·          (k, v, w)  ·
·                table     t@primary  ·          ·

query TTTTT
EXPLAIN (VERBOSE) SELECT k, w FROM (SELECT * FROM t WHERE v >= 1 AND v <= 100 ORDER BY k LIMIT 10) ORDER BY v
----
render               ·         ·                        (k, w)     ·
 │                   render 0  k                        ·          ·
 │                   render 1  w                        ·          ·
 └── sort            ·         ·                        (k, v, w)  +v
      │              order     +v                       ·          ·
      └── limit      ·         ·                        (k, v, w)  +k
           │         count     10                       ·          ·
           └── scan  ·         ·                        (k, v, w)  +k
·                    table     t@primary                ·          ·
·                    spans     ALL                      ·          ·
·                    filter    (v >= 1) AND (v <= 100)  ·          ·
