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