/
alter2.test.lua
executable file
·309 lines (281 loc) · 8.35 KB
/
alter2.test.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
#!/usr/bin/env tarantool
local test = require("sqltester")
test:plan(26)
-- This suite is aimed to test ALTER TABLE ADD CONSTRAINT statement.
--
test:do_catchsql_test(
"alter2-1.1",
[[
CREATE TABLE t1(id INT PRIMARY KEY, a INT, b INT);
ALTER TABLE t1 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1(id);
ALTER TABLE t1 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1;
INSERT INTO t1 VALUES(1, 1, 2);
]], {
-- <alter2-1.1>
0
-- </alter2-1.1>
})
test:do_catchsql_test(
"alter2-1.2",
[[
INSERT INTO t1 VALUES(2, 3, 2);
]], {
-- <alter2-1.2>
1, "Failed to execute SQL statement: FOREIGN KEY constraint failed"
-- </alter2-1.2>
})
test:do_catchsql_test(
"alter2-1.3",
[[
DELETE FROM t1;
]], {
-- <alter2-1.3>
0
-- </alter2-1.3>
})
test:do_catchsql_test(
"alter2-1.4",
[[
ALTER TABLE t1 DROP CONSTRAINT fk1;
INSERT INTO t1 VALUES(2, 3, 2);
]], {
-- <alter2-1.4>
1, "Failed to execute SQL statement: FOREIGN KEY constraint failed"
-- </alter2-1.4>
})
test:do_execsql_test(
"alter2-1.5",
[[
ALTER TABLE t1 DROP CONSTRAINT fk2;
INSERT INTO t1 VALUES(2, 3, 2);
SELECT * FROM t1;
]], {
-- <alter2-1.5>
2, 3, 2
-- </alter2-1.5>
})
test:do_test(
"alter2-1.5.1",
function()
test:execsql([[DELETE FROM t1;]])
if box.space.T1.engine == 'vinyl' then
-- trigger dump to empty the space
box.snapshot()
end
end, {
-- <alter2-1.5.1>
-- </alter2-1.5.1>
})
test:do_catchsql_test(
"alter2-1.6",
[[
CREATE UNIQUE INDEX i1 ON t1(b, a);
ALTER TABLE t1 ADD CONSTRAINT fk1 FOREIGN KEY (a, b) REFERENCES t1(b, a);
INSERT INTO t1 VALUES(3, 1, 1);
INSERT INTO t1 VALUES(4, 2, 1);
]], {
-- <alter2-1.6>
1, "Failed to execute SQL statement: FOREIGN KEY constraint failed"
-- </alter2-1.6>
})
test:do_execsql_test(
"alter2-1.7",
[[
ALTER TABLE t1 DROP CONSTRAINT fk1;
INSERT INTO t1 VALUES(5, 2, 1);
SELECT * FROM t1;
]], {
-- <alter2-1.7>
3, 1, 1, 5, 2, 1
-- </alter2-1.7>
})
test:do_test(
"alter2-1.7.1",
function()
test:execsql([[DELETE FROM t1;]])
if box.space.T1.engine == 'vinyl' then
-- trigger dump to empty the space
box.snapshot()
end
end, {
-- <alter2-1.7.1>
-- </alter2-1.7.1>
})
test:do_catchsql_test(
"alter2-1.8",
[[
ALTER TABLE t1 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1(id);
ALTER TABLE t1 ADD CONSTRAINT fk2 FOREIGN KEY (a, b) REFERENCES t1(b, a);
DROP TABLE t1;
]], {
-- <alter2-1.8>
0
-- </alter2-1.8>
})
test:do_execsql_test(
"alter2-1.9",
[[
SELECT * FROM "_fk_constraint";
]], {
-- <alter2-1.9>
-- </alter2-1.9>
})
test:do_catchsql_test(
"alter2-2.1",
[[
CREATE TABLE child (id INT PRIMARY KEY, a INT, b INT);
CREATE TABLE parent (id INT PRIMARY KEY, c INT UNIQUE, d INT);
ALTER TABLE child ADD CONSTRAINT fk FOREIGN KEY (id) REFERENCES parent(c);
ALTER TABLE parent ADD CONSTRAINT fk FOREIGN KEY (c) REFERENCES parent;
INSERT INTO parent VALUES(1, 2, 3);
]], {
-- <alter2-2.1>
1, "Failed to execute SQL statement: FOREIGN KEY constraint failed"
-- </alter2-2.1>
})
test:do_catchsql_test(
"alter2-2.2",
[[
INSERT INTO parent VALUES(1, 1, 2);
INSERT INTO child VALUES(2, 1, 1);
]], {
-- <alter2-2.2>
1, "Failed to execute SQL statement: FOREIGN KEY constraint failed"
-- </alter2-2.2>
})
test:do_catchsql_test(
"alter2-2.3",
[[
ALTER TABLE child DROP CONSTRAINT fk;
INSERT INTO parent VALUES(3, 4, 2);
]], {
-- <alter2-2.3>
1, "Failed to execute SQL statement: FOREIGN KEY constraint failed"
-- </alter2-2.3>
})
test:do_execsql_test(
"alter2-2.4",
[[
ALTER TABLE parent DROP CONSTRAINT fk;
INSERT INTO parent VALUES(3, 4, 2);
SELECT * FROM parent;
]], {
-- <alter2-2.4>
1, 1, 2, 3, 4, 2
-- </alter2-2.4>
})
test:do_execsql_test(
"alter2-3.1",
[[
DROP TABLE child;
DROP TABLE parent;
CREATE TABLE child (id INT PRIMARY KEY, a INT, b INT);
CREATE TABLE parent (id INT PRIMARY KEY, c INT, d INT);
ALTER TABLE child ADD CONSTRAINT fk FOREIGN KEY (id) REFERENCES parent MATCH FULL ON DELETE CASCADE;
INSERT INTO parent VALUES(1, 2, 3), (3, 4, 5), (6, 7, 8);
INSERT INTO child VALUES(1, 1, 1), (3, 2, 2);
DELETE FROM parent WHERE id = 1;
SELECT * FROM CHILD;
]], {
-- <alter2-3.1>
3, 2, 2
-- </alter2-3.1>
})
test:do_execsql_test(
"alter2-3.2",
[[
DROP TABLE child;
DROP TABLE parent;
CREATE TABLE child (id INT UNIQUE, a INT, b INT, z INT PRIMARY KEY AUTOINCREMENT);
CREATE TABLE parent (id INT UNIQUE, c INT, d INT, z INT PRIMARY KEY AUTOINCREMENT);
ALTER TABLE child ADD CONSTRAINT fk FOREIGN KEY (id) REFERENCES parent(id) MATCH PARTIAL ON UPDATE CASCADE;
INSERT INTO parent(id, c, d) VALUES(1, 2, 3), (3, 4, 5), (6, 7, 8);
INSERT INTO child(id, a, b) VALUES(1, 1, 1), (3, 2, 2);
UPDATE parent SET id = 5 WHERE id = 1;
SELECT id,a,b FROM CHILD ORDER BY id,a,b;
]], {
-- <alter2-3.2>
3, 2, 2, 5, 1, 1
-- </alter2-3.2>
})
test:do_catchsql_test(
"alter2-4.1",
[[
ALTER TABLE child ADD CONSTRAINT fk FOREIGN KEY REFERENCES child(id);
]], {
-- <alter2-4.1>
1, "At line 1 at or near position 57: keyword 'REFERENCES' is reserved. Please use double quotes if 'REFERENCES' is an identifier."
-- </alter2-4.1>
})
test:do_catchsql_test(
"alter2-4.2",
[[
ALTER TABLE child ADD CONSTRAINT fk () FOREIGN KEY REFERENCES child(id);
]], {
-- <alter2-4.1>
1, "Syntax error at line 1 near '('"
-- </alter2-4.2>
})
test:do_catchsql_test(
"alter2-5.1",
[[
DROP TABLE child;
CREATE TABLE child (id INT PRIMARY KEY, a INT UNIQUE);
ALTER TABLE child ADD CONSTRAINT fk FOREIGN KEY (id) REFERENCES child;
ALTER TABLE child ADD CONSTRAINT fk FOREIGN KEY (a) REFERENCES child;
]], {
-- <alter2-5.1>
1, "FOREIGN KEY constraint 'FK' already exists in space 'CHILD'"
-- </alter2-5.1>
})
test:do_catchsql_test(
"alter2-5.2",
[[
ALTER TABLE child DROP CONSTRAINT fake;
]], {
-- <alter2-5.2>
1, "Constraint 'FAKE' does not exist in space 'CHILD'"
-- </alter2-5.2>
})
-- Test ADD CONSTRAINT CHECK functionality. CHECK constraints are
-- integrated into Tarantool's core, so basically we would test
-- only grammar and validate correctness of raised errors.
--
test:do_catchsql_test(
"alter2-6.1",
[[
CREATE TABLE t1 (id INT PRIMARY KEY);
ALTER TABLE t1 ADD CONSTRAINT ck CHECK(id > 0);
INSERT INTO t1 VALUES (-1);
]], { 1, "Check constraint failed 'CK': id > 0" })
-- Make sure that one can't create constraint with the same name twice.
--
test:do_catchsql_test(
"alter2-6.2",
[[
ALTER TABLE t1 ADD CONSTRAINT ck CHECK(id > 0);
]], { 1, "CHECK constraint 'CK' already exists in space 'T1'" })
-- Make sure that CHECK constraint can be created only on empty space.
--
test:do_catchsql_test(
"alter2-6.3",
[[
INSERT INTO t1 VALUES (1);
ALTER TABLE t1 ADD CONSTRAINT ck1 CHECK(id > 0);
]], { 1, "Failed to create check constraint 'CK1': referencing space must be empty" })
-- "Non-existant" space error is raised correctly.
--
test:do_catchsql_test(
"alter2-6.4",
[[
ALTER TABLE fake ADD CONSTRAINT ck CHECK(id > 0);
]], { 1, "Space 'FAKE' does not exist" })
-- "Non-existant" column error is raised correctly.
--
test:do_catchsql_test(
"alter2-6.5",
[[
CREATE TABLE t2 (id INT PRIMARY KEY);
ALTER TABLE t2 ADD CONSTRAINT ck CHECK(fake_col > 0);
]], { 1, "Failed to create check constraint 'CK': Can’t resolve field 'FAKE_COL'" })
test:finish_test()