gluesql_test_suite/series.rs
1use {
2 crate::*,
3 gluesql_core::{
4 error::{FetchError, TranslateError},
5 prelude::{Payload, Value::*},
6 },
7};
8
9test_case!(series, {
10 let g = get_tester!();
11
12 let test_cases = vec![
13 (
14 // SERIES(N) has intenal column `N`
15 "SELECT * FROM SERIES(3)",
16 Ok(select!(
17 N
18 I64;
19 1;
20 2;
21 3
22 )),
23 ),
24 (
25 // SERIES(N) with lowercase works
26 "SELECT * FROM sErIeS(3)",
27 Ok(select!(
28 N
29 I64;
30 1;
31 2;
32 3
33 )),
34 ),
35 (
36 // SERIES(N) with table alias
37 "SELECT S.* FROM SERIES(3) as S",
38 Ok(select!(
39 N
40 I64;
41 1;
42 2;
43 3
44 )),
45 ),
46 (
47 // SERIES with unary plus is allowed
48 "SELECT * FROM SERIES(+3)",
49 Ok(select!(
50 N
51 I64;
52 1;
53 2;
54 3
55 )),
56 ),
57 (
58 // CTAS with SERIES(N)
59 "CREATE TABLE SeriesTable AS SELECT * FROM SERIES(3)",
60 Ok(Payload::Create),
61 ),
62 (
63 "SELECT * FROM SeriesTable",
64 Ok(select!(
65 N
66 I64;
67 1;
68 2;
69 3
70 )),
71 ),
72 (
73 // SERIES with size 0 is allowed
74 "SELECT * FROM SERIES(0)",
75 Ok(Payload::Select {
76 labels: vec!["N".into()],
77 rows: Vec::new(),
78 }),
79 ),
80 (
81 // SERIES without parentheses is a normal table name
82 "SELECT * FROM SERIES",
83 Err(FetchError::TableNotFound("SERIES".into()).into()),
84 ),
85 (
86 // SERIES without size is not allowed
87 "SELECT * FROM SERIES()",
88 Err(TranslateError::LackOfArgs.into()),
89 ),
90 (
91 // SERIES with unary minus is not allowed
92 "SELECT * FROM SERIES(-1)",
93 Err(FetchError::SeriesSizeWrong(-1).into()),
94 ),
95 (
96 // SELECT without Table
97 "SELECT 1, 'a', true, 1 + 2, 'a' || 'b'",
98 Ok(select!(
99 "1" | "'a'" | "true" | "1 + 2" | "'a' || 'b'"
100 I64 | Str | Bool | I64 | Str;
101 1 "a".into() true 3 "ab".into()
102 )),
103 ),
104 (
105 // SELECT without Table in Scalar subquery
106 "SELECT (SELECT 'Hello')",
107 Ok(select!(
108 "(SELECT 'Hello')"
109 Str;
110 "Hello".to_owned()
111 )),
112 ),
113 (
114 // SELECT without Table with Column aliases
115 "SELECT 1 AS id, (SELECT MAX(N) FROM SERIES(3)) AS max",
116 Ok(select!(
117 id | max
118 I64 | I64;
119 1 3
120 )),
121 ),
122 (
123 // SELECT without Table in Drived
124 "SELECT * FROM (SELECT 1) AS Drived",
125 Ok(select!(
126 "1"
127 I64;
128 1
129 )),
130 ),
131 (
132 // `SELECT *` fetches column `N` for now
133 "SELECT *",
134 Ok(select!(
135 N
136 I64;
137 1
138 )),
139 ),
140 (
141 // CTAS without Table
142 "CREATE TABLE TargetTable AS SELECT 1",
143 Ok(Payload::Create),
144 ),
145 (
146 "SELECT * FROM TargetTable",
147 Ok(select!(
148 N
149 I64;
150 1
151 )),
152 ),
153 ];
154
155 for (sql, expected) in test_cases {
156 g.test(sql, expected).await;
157 }
158});