gluesql_test_suite/
update.rs

1use {
2    crate::*,
3    Value::*,
4    gluesql_core::{
5        error::{ExecuteError, TranslateError, UpdateError},
6        prelude::*,
7    },
8};
9
10test_case!(update, {
11    let g = get_tester!();
12
13    g.run(
14        "
15        CREATE TABLE TableA (
16            id INTEGER,
17            num INTEGER,
18            num2 INTEGER,
19            name TEXT
20        )",
21    )
22    .await;
23
24    g.run(
25        "
26        INSERT INTO TableA (id, num, num2, name)
27        VALUES
28            (1, 2, 4, 'Hello'),
29            (1, 9, 5, 'World'),
30            (3, 4, 7, 'Great'),
31            (4, 7, 10, 'Job');
32        ",
33    )
34    .await;
35
36    g.run(
37        "
38        CREATE TABLE TableB (
39            id INTEGER,
40            num INTEGER,
41            rank INTEGER
42        )",
43    )
44    .await;
45
46    g.run(
47        "
48        INSERT INTO TableB (id, num, rank)
49        VALUES
50            (1, 2, 1),
51            (1, 9, 2),
52            (3, 4, 3),
53            (4, 7, 4);
54        ",
55    )
56    .await;
57
58    let test_cases = [
59        ("UPDATE TableA SET id = 2", Ok(Payload::Update(4))),
60        (
61            "SELECT id, num FROM TableA",
62            Ok(select!(id | num; I64 | I64; 2 2; 2 9; 2 4; 2 7)),
63        ),
64        (
65            "UPDATE TableA SET id = 4 WHERE num = 9",
66            Ok(Payload::Update(1)),
67        ),
68        (
69            "UPDATE TableA SET name = SUBSTR('John', 1) WHERE num = 9",
70            Ok(Payload::Update(1)),
71        ),
72        (
73            "SELECT id, num FROM TableA",
74            Ok(select!(id | num; I64 | I64; 2 2; 4 9; 2 4; 2 7)),
75        ),
76        (
77            "UPDATE TableA SET num2 = (SELECT num FROM TableA WHERE num = 9 LIMIT 1) WHERE num = 9",
78            Ok(Payload::Update(1)),
79        ),
80        (
81            "SELECT id, num, num2 FROM TableA",
82            Ok(select!(id | num | num2; I64 | I64 | I64; 2 2 4; 4 9 9; 2 4 7; 2 7 10)),
83        ),
84        (
85            "UPDATE TableA SET num2 = (SELECT rank FROM TableB WHERE num = TableA.num) WHERE num = 7",
86            Ok(Payload::Update(1)),
87        ),
88        (
89            "SELECT id, num, num2 FROM TableA",
90            Ok(select!(id | num | num2; I64 | I64 | I64; 2 2 4; 4 9 9; 2 4 7; 2 7 4)),
91        ),
92        (
93            "UPDATE TableA SET num2 = (SELECT rank FROM TableB WHERE num = TableA.num) WHERE num = (SELECT MIN(num) FROM TableA)",
94            Ok(Payload::Update(1)),
95        ),
96        (
97            "SELECT id, num, num2 FROM TableA",
98            Ok(select!(id | num | num2; I64 | I64 | I64; 2 2 1; 4 9 9; 2 4 7; 2 7 4)),
99        ),
100    ];
101
102    for (sql, expected) in test_cases {
103        g.test(sql, expected).await;
104    }
105
106    // Test Error cases for UPDATE
107    g.run("CREATE TABLE ErrTestTable (id INTEGER);").await;
108    g.run("INSERT INTO ErrTestTable (id) VALUES (1),(9);").await;
109
110    let error_cases = [
111        (
112            "UPDATE TableA INNER JOIN ErrTestTable ON 1 = 1 SET id = 1",
113            Err(TranslateError::JoinOnUpdateNotSupported.into()),
114        ),
115        (
116            "UPDATE (SELECT * FROM ErrTestTable) SET id = 1",
117            Err(
118                TranslateError::UnsupportedTableFactor("(SELECT * FROM ErrTestTable)".to_owned())
119                    .into(),
120            ),
121        ),
122        (
123            "UPDATE ErrTestTable SET ErrTestTable.id = 1 WHERE id = 1",
124            Err(TranslateError::CompoundIdentOnUpdateNotSupported(
125                "ErrTestTable.id = 1".to_owned(),
126            )
127            .into()),
128        ),
129        (
130            "UPDATE Nothing SET a = 1;",
131            Err(ExecuteError::TableNotFound("Nothing".to_owned()).into()),
132        ),
133        (
134            "UPDATE TableA SET Foo = 1;",
135            Err(UpdateError::ColumnNotFound("Foo".to_owned()).into()),
136        ),
137    ];
138    for (sql, expected) in error_cases {
139        g.test(sql, expected).await;
140    }
141});