# tests adapted from logictest -- limit

exec-ddl
CREATE TABLE t (k INT PRIMARY KEY, v INT, w INT, INDEX(v))
----

build
SELECT k, v FROM t ORDER BY k LIMIT 5
----
limit
 ├── columns: k:1!null v:2
 ├── internal-ordering: +1
 ├── ordering: +1
 ├── project
 │    ├── columns: k:1!null v:2
 │    ├── ordering: +1
 │    ├── limit hint: 5.00
 │    └── scan t
 │         ├── columns: k:1!null v:2 w:3 crdb_internal_mvcc_timestamp:4 tableoid:5
 │         ├── ordering: +1
 │         └── limit hint: 5.00
 └── 5

build
SELECT k, v FROM t ORDER BY v FETCH FIRST 5 ROWS ONLY
----
limit
 ├── columns: k:1!null v:2
 ├── internal-ordering: +2
 ├── ordering: +2
 ├── sort
 │    ├── columns: k:1!null v:2
 │    ├── ordering: +2
 │    ├── limit hint: 5.00
 │    └── project
 │         ├── columns: k:1!null v:2
 │         └── scan t
 │              └── columns: k:1!null v:2 w:3 crdb_internal_mvcc_timestamp:4 tableoid:5
 └── 5

build
SELECT k, v FROM t LIMIT (1+2)
----
limit
 ├── columns: k:1!null v:2
 ├── project
 │    ├── columns: k:1!null v:2
 │    └── scan t
 │         └── columns: k:1!null v:2 w:3 crdb_internal_mvcc_timestamp:4 tableoid:5
 └── 1 + 2

build
SELECT k FROM t ORDER BY k FETCH FIRST ROW ONLY
----
limit
 ├── columns: k:1!null
 ├── internal-ordering: +1
 ├── ordering: +1
 ├── project
 │    ├── columns: k:1!null
 │    ├── ordering: +1
 │    ├── limit hint: 1.00
 │    └── scan t
 │         ├── columns: k:1!null v:2 w:3 crdb_internal_mvcc_timestamp:4 tableoid:5
 │         ├── ordering: +1
 │         └── limit hint: 1.00
 └── 1

build
SELECT k FROM t ORDER BY k OFFSET 3 ROWS FETCH NEXT ROW ONLY
----
limit
 ├── columns: k:1!null
 ├── internal-ordering: +1
 ├── ordering: +1
 ├── offset
 │    ├── columns: k:1!null
 │    ├── internal-ordering: +1
 │    ├── ordering: +1
 │    ├── limit hint: 1.00
 │    ├── project
 │    │    ├── columns: k:1!null
 │    │    ├── ordering: +1
 │    │    ├── limit hint: 4.00
 │    │    └── scan t
 │    │         ├── columns: k:1!null v:2 w:3 crdb_internal_mvcc_timestamp:4 tableoid:5
 │    │         ├── ordering: +1
 │    │         └── limit hint: 4.00
 │    └── 3
 └── 1

build
SELECT k, v FROM t ORDER BY k OFFSET 5
----
offset
 ├── columns: k:1!null v:2
 ├── internal-ordering: +1
 ├── ordering: +1
 ├── project
 │    ├── columns: k:1!null v:2
 │    ├── ordering: +1
 │    └── scan t
 │         ├── columns: k:1!null v:2 w:3 crdb_internal_mvcc_timestamp:4 tableoid:5
 │         └── ordering: +1
 └── 5

build
SELECT k FROM t ORDER BY k FETCH FIRST (1+1) ROWS ONLY
----
limit
 ├── columns: k:1!null
 ├── internal-ordering: +1
 ├── ordering: +1
 ├── project
 │    ├── columns: k:1!null
 │    ├── ordering: +1
 │    └── scan t
 │         ├── columns: k:1!null v:2 w:3 crdb_internal_mvcc_timestamp:4 tableoid:5
 │         └── ordering: +1
 └── 1 + 1

build
SELECT k FROM T LIMIT k
----
error (42703): column "k" does not exist

build
SELECT k FROM T LIMIT v
----
error (42703): column "v" does not exist

build
SELECT sum(w) FROM t GROUP BY k, v ORDER BY v DESC LIMIT 10
----
limit
 ├── columns: sum:6  [hidden: v:2]
 ├── internal-ordering: -2
 ├── ordering: -2
 ├── project
 │    ├── columns: v:2 sum:6
 │    ├── ordering: -2
 │    ├── limit hint: 10.00
 │    └── group-by (partial streaming)
 │         ├── columns: k:1!null v:2 sum:6
 │         ├── grouping columns: k:1!null v:2
 │         ├── ordering: -2
 │         ├── limit hint: 10.00
 │         ├── sort
 │         │    ├── columns: k:1!null v:2 w:3
 │         │    ├── ordering: -2
 │         │    ├── limit hint: 10.00
 │         │    └── project
 │         │         ├── columns: k:1!null v:2 w:3
 │         │         └── scan t
 │         │              └── columns: k:1!null v:2 w:3 crdb_internal_mvcc_timestamp:4 tableoid:5
 │         └── aggregations
 │              └── sum [as=sum:6]
 │                   └── w:3
 └── 10

build
SELECT DISTINCT v FROM T ORDER BY v LIMIT 10
----
limit
 ├── columns: v:2
 ├── internal-ordering: +2
 ├── ordering: +2
 ├── sort
 │    ├── columns: v:2
 │    ├── ordering: +2
 │    ├── limit hint: 10.00
 │    └── distinct-on
 │         ├── columns: v:2
 │         ├── grouping columns: v:2
 │         └── project
 │              ├── columns: v:2
 │              └── scan t
 │                   └── columns: k:1!null v:2 w:3 crdb_internal_mvcc_timestamp:4 tableoid:5
 └── 10

build
VALUES (1,1), (2,2) ORDER BY 1 LIMIT 1
----
limit
 ├── columns: column1:1!null column2:2!null
 ├── internal-ordering: +1
 ├── ordering: +1
 ├── sort
 │    ├── columns: column1:1!null column2:2!null
 │    ├── ordering: +1
 │    ├── limit hint: 1.00
 │    └── values
 │         ├── columns: column1:1!null column2:2!null
 │         ├── (1, 1)
 │         └── (2, 2)
 └── 1

build
(VALUES (1), (1), (1), (2), (2) UNION ALL VALUES (1), (3), (1)) ORDER BY 1 DESC LIMIT 2
----
limit
 ├── columns: column1:3!null
 ├── internal-ordering: -3
 ├── ordering: -3
 ├── union-all
 │    ├── columns: column1:3!null
 │    ├── left columns: column1:1
 │    ├── right columns: column1:2
 │    ├── ordering: -3
 │    ├── limit hint: 2.00
 │    ├── sort
 │    │    ├── columns: column1:1!null
 │    │    ├── ordering: -1
 │    │    ├── limit hint: 2.00
 │    │    └── values
 │    │         ├── columns: column1:1!null
 │    │         ├── (1,)
 │    │         ├── (1,)
 │    │         ├── (1,)
 │    │         ├── (2,)
 │    │         └── (2,)
 │    └── sort
 │         ├── columns: column1:2!null
 │         ├── ordering: -2
 │         ├── limit hint: 2.00
 │         └── values
 │              ├── columns: column1:2!null
 │              ├── (1,)
 │              ├── (3,)
 │              └── (1,)
 └── 2

# The ORDER BY and LIMIT apply to the UNION, not the last VALUES.
build
VALUES (1), (1), (1), (2), (2) UNION ALL VALUES (1), (3), (1) ORDER BY 1 DESC LIMIT 2
----
limit
 ├── columns: column1:3!null
 ├── internal-ordering: -3
 ├── ordering: -3
 ├── union-all
 │    ├── columns: column1:3!null
 │    ├── left columns: column1:1
 │    ├── right columns: column1:2
 │    ├── ordering: -3
 │    ├── limit hint: 2.00
 │    ├── sort
 │    │    ├── columns: column1:1!null
 │    │    ├── ordering: -1
 │    │    ├── limit hint: 2.00
 │    │    └── values
 │    │         ├── columns: column1:1!null
 │    │         ├── (1,)
 │    │         ├── (1,)
 │    │         ├── (1,)
 │    │         ├── (2,)
 │    │         └── (2,)
 │    └── sort
 │         ├── columns: column1:2!null
 │         ├── ordering: -2
 │         ├── limit hint: 2.00
 │         └── values
 │              ├── columns: column1:2!null
 │              ├── (1,)
 │              ├── (3,)
 │              └── (1,)
 └── 2

build
SELECT k FROM (SELECT k, v FROM t ORDER BY v LIMIT 10)
----
project
 ├── columns: k:1!null
 └── limit
      ├── columns: k:1!null v:2
      ├── internal-ordering: +2
      ├── sort
      │    ├── columns: k:1!null v:2
      │    ├── ordering: +2
      │    ├── limit hint: 10.00
      │    └── project
      │         ├── columns: k:1!null v:2
      │         └── scan t
      │              └── columns: k:1!null v:2 w:3 crdb_internal_mvcc_timestamp:4 tableoid:5
      └── 10

# 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.
build
SELECT DISTINCT w FROM (SELECT w FROM t ORDER BY w LIMIT 100) ORDER BY w LIMIT 25
----
limit
 ├── columns: w:3
 ├── internal-ordering: +3
 ├── ordering: +3
 ├── distinct-on
 │    ├── columns: w:3
 │    ├── grouping columns: w:3
 │    ├── ordering: +3
 │    ├── limit hint: 25.00
 │    └── limit
 │         ├── columns: w:3
 │         ├── internal-ordering: +3
 │         ├── ordering: +3
 │         ├── limit hint: 40.39
 │         ├── sort
 │         │    ├── columns: w:3
 │         │    ├── ordering: +3
 │         │    ├── limit hint: 100.00
 │         │    └── project
 │         │         ├── columns: w:3
 │         │         └── scan t
 │         │              └── columns: k:1!null v:2 w:3 crdb_internal_mvcc_timestamp:4 tableoid:5
 │         └── 100
 └── 25

build
SELECT * FROM t LIMIT @1
----
error (42703): column reference @1 not allowed in this context

build
SELECT * FROM t OFFSET @1
----
error (42703): column reference @1 not allowed in this context

build
SELECT * FROM t LIMIT count(*)
----
error (42803): count_rows(): aggregate functions are not allowed in LIMIT

build
SELECT * FROM t OFFSET count(*)
----
error (42803): count_rows(): aggregate functions are not allowed in OFFSET

build
SELECT * FROM t LIMIT count(w)
----
error (42703): column "w" does not exist

build
SELECT * FROM t OFFSET count(w)
----
error (42703): column "w" does not exist

build
SELECT sum(v) FROM t GROUP BY k LIMIT count(*) OVER ()
----
error (42P20): count_rows(): window functions are not allowed in LIMIT

build
SELECT sum(v) FROM t GROUP BY k OFFSET count(*) OVER ()
----
error (42P20): count_rows(): window functions are not allowed in OFFSET
