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});