1#include "catch.hpp"
2#include "test_helpers.hpp"
3
4using namespace duckdb;
5using namespace std;
6
7TEST_CASE("Test PRAGMA parsing", "[pragma]") {
8 unique_ptr<QueryResult> result;
9 DuckDB db(nullptr);
10 Connection con(db);
11
12 // Almost pragma but not quite
13 REQUIRE_FAIL(con.Query("PRAG"));
14 // Pragma without a keyword
15 REQUIRE_FAIL(con.Query("PRAGMA "));
16 // Unknown pragma error
17 REQUIRE_FAIL(con.Query("PRAGMA random_unknown_pragma"));
18 // Call pragma in wrong way
19 REQUIRE_FAIL(con.Query("PRAGMA table_info = 3"));
20
21 REQUIRE_NO_FAIL(con.Query("CREATE TABLE integers(i INTEGER)"));
22 // Now it should work
23 REQUIRE_NO_FAIL(con.Query("PRAGMA table_info('integers');"));
24 // Parsing also works with extra spaces
25 REQUIRE_NO_FAIL(con.Query(" PRAGMA table_info ('integers');"));
26}
27
28TEST_CASE("Test PRAGMA enable_profiling parsing", "[pragma]") {
29 unique_ptr<QueryResult> result;
30 DuckDB db(nullptr);
31 Connection con(db);
32
33 // enable profiling cannot be called
34 REQUIRE_FAIL(con.Query("PRAGMA enable_profiling()"));
35 REQUIRE_FAIL(con.Query("PRAGMA enable_profiling='unsupported'"));
36 REQUIRE_FAIL(con.Query("PRAGMA profiling_output"));
37 // select the location of where to save the profiling output (instead of printing to stdout)
38 REQUIRE_NO_FAIL(con.Query("PRAGMA profiling_output='test.json'"));
39 // but we can clear it again
40 REQUIRE_NO_FAIL(con.Query("PRAGMA profiling_output=''"));
41 // enable and disable profiling
42 REQUIRE_NO_FAIL(con.Query("PRAGMA disable_profiling"));
43 // REQUIRE_NO_FAIL(con.Query("PRAGMA enable_profiling"));
44}
45
46TEST_CASE("Test PRAGMA memory_limit", "[pragma]") {
47 unique_ptr<QueryResult> result;
48 DuckDB db(nullptr);
49 Connection con(db);
50
51 // set memory_limit
52 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='1GB'"));
53 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit=-1"));
54 // different units can be used
55 // G and GB = gigabyte
56 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='1G'"));
57 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='1GB'"));
58 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='1gb'"));
59 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit = '1GB'"));
60 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='1.0gb'"));
61 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='1.0 gb'"));
62 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='1.0 gigabytes'"));
63 // M and MB = megabyte
64 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='100M'"));
65 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='100MB'"));
66 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='100mb'"));
67 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='100 megabytes'"));
68 // K and KB = kilobyte
69 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='10000K'"));
70 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='10000KB'"));
71 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='10000kb'"));
72 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='10000 kilobytes'"));
73 // B = byte
74 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='100000B'"));
75 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='100000b'"));
76 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='100000 bytes'"));
77 // T and TB = terabyte
78 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='0.01T'"));
79 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='0.01TB'"));
80 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='0.01tb'"));
81 REQUIRE_NO_FAIL(con.Query("PRAGMA memory_limit='0.01 terabytes'"));
82 // no unit or unknown units fail
83 REQUIRE_FAIL(con.Query("PRAGMA memory_limit=100"));
84 REQUIRE_FAIL(con.Query("PRAGMA memory_limit='0.01BG'"));
85 REQUIRE_FAIL(con.Query("PRAGMA memory_limit='0.01BLA'"));
86 REQUIRE_FAIL(con.Query("PRAGMA memory_limit='0.01PP'"));
87 REQUIRE_FAIL(con.Query("PRAGMA memory_limit='0.01TEST'"));
88 // we can't invoke it like this either
89 REQUIRE_FAIL(con.Query("PRAGMA memory_limit"));
90 REQUIRE_FAIL(con.Query("PRAGMA memory_limit()"));
91 REQUIRE_FAIL(con.Query("PRAGMA memory_limit(1, 2)"));
92}
93