1#include "catch.hpp"
2#include "test_helpers.hpp"
3
4using namespace duckdb;
5using namespace std;
6
7TEST_CASE("Test LIMIT keyword", "[limit]") {
8 unique_ptr<QueryResult> result;
9 DuckDB db(nullptr);
10 Connection con(db);
11 con.EnableQueryVerification();
12
13 REQUIRE_NO_FAIL(con.Query("CREATE TABLE test (a INTEGER, b INTEGER);"));
14 REQUIRE_NO_FAIL(con.Query("INSERT INTO test VALUES (11, 22), (12, 21), (13, 22)"));
15
16 // constant limit
17 result = con.Query("SELECT a FROM test LIMIT 1");
18 REQUIRE(CHECK_COLUMN(result, 0, {11}));
19
20 // decimal limit
21 result = con.Query("SELECT a FROM test LIMIT 1.5");
22 REQUIRE(CHECK_COLUMN(result, 0, {11}));
23
24 // LIMIT with operation
25 result = con.Query("SELECT a FROM test LIMIT 2-1");
26 REQUIRE(CHECK_COLUMN(result, 0, {11}));
27
28 // LIMIT with non-scalar should fail
29 REQUIRE_FAIL(con.Query("SELECT a FROM test LIMIT a"));
30 // LIMIT with non-scalar operation should also fail
31 REQUIRE_FAIL(con.Query("SELECT a FROM test LIMIT a+1"));
32
33 // aggregate in limit
34 REQUIRE_FAIL(con.Query("SELECT a FROM test LIMIT SUM(42)"));
35 // window function in limit
36 REQUIRE_FAIL(con.Query("SELECT a FROM test LIMIT row_number() OVER ()"));
37 // subquery in limit
38 REQUIRE_FAIL(con.Query("SELECT a FROM test LIMIT (SELECT MIN(a) FROM test)"));
39}
40
41TEST_CASE("LIMIT Bug #321 Crazy Result", "[limit]") {
42 unique_ptr<QueryResult> result;
43 DuckDB db(nullptr);
44 Connection con(db);
45 con.EnableQueryVerification();
46
47 REQUIRE_NO_FAIL(con.Query("CREATE TABLE test (a STRING);"));
48 REQUIRE_NO_FAIL(con.Query("INSERT INTO test VALUES ('Hello World')"));
49
50 auto prep = con.Prepare("SELECT * FROM test LIMIT 3");
51 vector<Value> params;
52 params.clear();
53 result = prep->Execute(params);
54 REQUIRE(CHECK_COLUMN(result, 0, {"Hello World"}));
55}
56