xref: /sqlite-3.40.0/test/altertab3.test (revision 5976b2c8)
1# 2019 January 23
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#*************************************************************************
11#
12
13set testdir [file dirname $argv0]
14source $testdir/tester.tcl
15set testprefix altertab3
16
17# If SQLITE_OMIT_ALTERTABLE is defined, omit this file.
18ifcapable !altertable {
19  finish_test
20  return
21}
22
23
24ifcapable windowfunc {
25do_execsql_test 1.0 {
26  CREATE TABLE t1(a, b);
27  CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN
28    SELECT sum(b) OVER w FROM t1 WINDOW w AS (ORDER BY a);
29  END;
30}
31
32do_execsql_test 1.1 {
33  ALTER TABLE t1 RENAME a TO aaa;
34}
35
36do_execsql_test 1.2 {
37  SELECT sql FROM sqlite_master WHERE name='tr1'
38} {{CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN
39    SELECT sum(b) OVER w FROM t1 WINDOW w AS (ORDER BY aaa);
40  END}}
41
42do_execsql_test 1.3 {
43  INSERT INTO t1 VALUES(1, 2);
44}
45} ;# windowfunc
46
47#-------------------------------------------------------------------------
48reset_db
49do_execsql_test 2.0 {
50  CREATE TABLE t1(a,b,c);
51  CREATE TABLE t2(a,b,c);
52  CREATE TRIGGER r1 AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN
53    SELECT a,b, a name FROM t1
54      INTERSECT
55    SELECT a,b,c FROM t1 WHERE b>='d' ORDER BY name;
56    SELECT new.c;
57  END;
58}
59
60do_execsql_test 2.1 {
61  ALTER TABLE t1 RENAME TO t1x;
62  SELECT sql FROM sqlite_master WHERE name = 'r1';
63} {{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.a NOT NULL BEGIN
64    SELECT a,b, a name FROM "t1x"
65      INTERSECT
66    SELECT a,b,c FROM "t1x" WHERE b>='d' ORDER BY name;
67    SELECT new.c;
68  END}}
69
70#-------------------------------------------------------------------------
71reset_db
72do_execsql_test 3.0 {
73  CREATE TABLE t1(a, b, c, d);
74  CREATE VIEW v1 AS SELECT * FROM t1 WHERE a=1 OR (b IN ());
75}
76
77do_execsql_test 3.1 {
78  ALTER TABLE t1 RENAME b TO bbb;
79}
80
81do_execsql_test 3.2 {
82  SELECT sql FROM sqlite_master WHERE name = 'v1'
83} {{CREATE VIEW v1 AS SELECT * FROM t1 WHERE a=1 OR (b IN ())}}
84
85#-------------------------------------------------------------------------
86reset_db
87do_execsql_test 4.0 {
88  CREATE TABLE t1(a, b);
89  CREATE TABLE t3(e, f);
90  CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN
91    INSERT INTO t2 VALUES(new.a, new.b);
92  END;
93}
94
95do_catchsql_test 4.1.2 {
96  BEGIN;
97    ALTER TABLE t3 RENAME TO t4;
98} {1 {error in trigger tr1: no such table: main.t2}}
99do_execsql_test 4.1.2 {
100  COMMIT;
101}
102do_execsql_test 4.1.3 {
103  SELECT type, name, tbl_name, sql
104  FROM sqlite_master WHERE type='table' AND name!='t1';
105} {table t3 t3 {CREATE TABLE t3(e, f)}}
106
107
108do_catchsql_test 4.2.1 {
109  BEGIN;
110    ALTER TABLE t3 RENAME e TO eee;
111} {1 {error in trigger tr1: no such table: main.t2}}
112do_execsql_test 4.2.2 {
113  COMMIT;
114}
115do_execsql_test 4.2.3 {
116  SELECT type, name, tbl_name, sql
117  FROM sqlite_master WHERE type='table' AND name!='t1';
118} {table t3 t3 {CREATE TABLE t3(e, f)}}
119
120#-------------------------------------------------------------------------
121reset_db
122do_execsql_test 5.0 {
123  CREATE TABLE t1 (
124      c1 integer, c2, PRIMARY KEY(c1 collate rtrim),
125      UNIQUE(c2)
126  )
127}
128do_execsql_test 5.1 {
129  ALTER TABLE t1 RENAME c1 TO c3;
130}
131
132#-------------------------------------------------------------------------
133reset_db
134do_execsql_test 6.0 {
135  CREATE TEMPORARY TABLE Table0 (
136    Col0 INTEGER,
137    PRIMARY KEY(Col0 COLLATE RTRIM),
138    FOREIGN KEY (Col0) REFERENCES Table0
139  );
140}
141
142do_execsql_test 6.1 {
143  ALTER TABLE Table0 RENAME Col0 TO Col0;
144}
145
146#-------------------------------------------------------------------------
147reset_db
148do_execsql_test 7.1.0 {
149  CREATE TABLE t1(a,b,c);
150  CREATE TRIGGER AFTER INSERT ON t1 BEGIN
151    SELECT a, rank() OVER w1 FROM t1
152    WINDOW w1 AS (PARTITION BY b, percent_rank() OVER w1);
153  END;
154}
155
156do_execsql_test 7.1.2 {
157  ALTER TABLE t1 RENAME TO t1x;
158  SELECT sql FROM sqlite_master;
159} {
160  {CREATE TABLE "t1x"(a,b,c)}
161  {CREATE TRIGGER AFTER INSERT ON "t1x" BEGIN
162    SELECT a, rank() OVER w1 FROM "t1x"
163    WINDOW w1 AS (PARTITION BY b, percent_rank() OVER w1);
164  END}
165}
166
167do_execsql_test 7.2.1 {
168  DROP TRIGGER after;
169  CREATE TRIGGER AFTER INSERT ON t1x BEGIN
170    SELECT a, rank() OVER w1 FROM t1x
171    WINDOW w1 AS (PARTITION BY b, percent_rank() OVER w1 ORDER BY d);
172  END;
173}
174
175do_catchsql_test 7.2.2 {
176  ALTER TABLE t1x RENAME TO t1;
177} {1 {error in trigger AFTER: no such column: d}}
178
179#-------------------------------------------------------------------------
180reset_db
181do_execsql_test 8.0 {
182  CREATE TABLE t0(c0);
183  CREATE INDEX i0 ON t0('1' IN ());
184}
185do_execsql_test 8.1 {
186  ALTER TABLE t0 RENAME TO t1;
187  SELECT sql FROM sqlite_master;
188} {
189  {CREATE TABLE "t1"(c0)}
190  {CREATE INDEX i0 ON "t1"('1' IN ())}
191}
192do_execsql_test 8.2.1 {
193  CREATE TABLE t2 (c0);
194  CREATE INDEX i2 ON t2((LIKELIHOOD(c0, 100) IN ()));
195  ALTER TABLE t2 RENAME COLUMN c0 TO c1;
196}
197do_execsql_test 8.2.2 {
198  SELECT sql FROM sqlite_master WHERE tbl_name = 't2';
199} {
200  {CREATE TABLE t2 (c1)}
201  {CREATE INDEX i2 ON t2((LIKELIHOOD(c0, 100) IN ()))}
202}
203do_test 8.2.3 {
204  sqlite3 db2 test.db
205  db2 eval { INSERT INTO t2 VALUES (1), (2), (3) }
206  db close
207} {}
208db2 close
209
210#-------------------------------------------------------------------------
211reset_db
212do_execsql_test 9.1 {
213  CREATE TABLE t1(a,b,c);
214  CREATE TRIGGER AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN
215    SELECT true WHERE (SELECT a, b FROM (t1)) IN ();
216  END;
217}
218do_execsql_test 9.2 {
219  ALTER TABLE t1 RENAME TO t1x;
220}
221
222#-------------------------------------------------------------------------
223reset_db
224do_execsql_test 10.1 {
225  CREATE TABLE t1(a, b, c);
226  CREATE TABLE t2(a, b, c);
227  CREATE VIEW v1 AS SELECT * FROM t1 WHERE (
228    SELECT t1.a FROM t1, t2
229  ) IN () OR t1.a=5;
230}
231
232do_execsql_test 10.2 {
233  ALTER TABLE t2 RENAME TO t3;
234  SELECT sql FROM sqlite_master WHERE name='v1';
235} {
236  {CREATE VIEW v1 AS SELECT * FROM t1 WHERE (
237    SELECT t1.a FROM t1, t2
238  ) IN () OR t1.a=5}
239}
240
241#-------------------------------------------------------------------------
242reset_db
243do_execsql_test 11.1 {
244  CREATE TABLE t1(
245      a,b,c,d,e,f,g,h,j,jj,jjb,k,aa,bb,cc,dd,ee DEFAULT 3.14,
246      ff DEFAULT('hiccup'),Wg NOD NULL DEFAULT(false)
247  );
248
249  CREATE TRIGGER b AFTER INSERT ON t1 WHEN new.a BEGIN
250    SELECT a, sum() w3 FROM t1
251    WINDOW b AS (ORDER BY NOT EXISTS(SELECT 1 FROM abc));
252  END;
253}
254
255do_catchsql_test 11.2 {
256  ALTER TABLE t1 RENAME TO t1x;
257} {1 {error in trigger b: no such table: abc}}
258
259do_execsql_test 11.3 {
260  DROP TRIGGER b;
261  CREATE TRIGGER b AFTER INSERT ON t1 WHEN new.a BEGIN
262    SELECT a, sum() w3 FROM t1
263    WINDOW b AS (ORDER BY NOT EXISTS(SELECT 1 FROM t1));
264  END;
265} {}
266
267do_execsql_test 11.4 {
268  ALTER TABLE t1 RENAME TO t1x;
269  SELECT sql FROM sqlite_master WHERE name = 'b';
270} {
271{CREATE TRIGGER b AFTER INSERT ON "t1x" WHEN new.a BEGIN
272    SELECT a, sum() w3 FROM "t1x"
273    WINDOW b AS (ORDER BY NOT EXISTS(SELECT 1 FROM "t1x"));
274  END}
275}
276
277#-------------------------------------------------------------------------
278reset_db
279do_execsql_test 12.1 {
280CREATE TABLE t1(a,b,c,d,e,f,g,h,j,jj,Zjj,k,aQ,bb,cc,dd,ee DEFAULT 3.14,
281ff DEFAULT('hiccup'),gg NOD NULL DEFAULT(false));
282CREATE TRIGGER AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN
283
284SELECT b () OVER , dense_rank() OVER d, d () OVER w1
285FROM t1
286WINDOW
287w1 AS
288( w1 ORDER BY d
289ROWS BETWEEN 2 NOT IN(SELECT a, sum(d) w2,max(d)OVER FROM t1
290WINDOW
291w1 AS
292(PARTITION BY d
293ROWS BETWEEN '' PRECEDING AND false FOLLOWING),
294d AS
295(PARTITION BY b ORDER BY d
296ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
297) PRECEDING AND 1 FOLLOWING),
298w2 AS
299(PARTITION BY b ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
300w3 AS
301(PARTITION BY b ORDER BY d
302ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
303;
304SELECT a, sum(d) w2,max(d)OVER FROM t1
305WINDOW
306w1 AS
307(PARTITION BY d
308ROWS BETWEEN '' PRECEDING AND false FOLLOWING),
309d AS
310(PARTITION BY b ORDER BY d
311ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
312;
313
314END;
315}
316
317do_execsql_test 12.2 {
318  ALTER TABLE t1 RENAME TO t1x;
319}
320
321#-------------------------------------------------------------------------
322reset_db
323do_execsql_test 13.1 {
324  CREATE TABLE t1(a);
325  CREATE TRIGGER r1 INSERT ON t1 BEGIN
326    SELECT a(*) OVER (ORDER BY (SELECT 1)) FROM t1;
327  END;
328}
329
330do_execsql_test 13.2 {
331  ALTER TABLE t1 RENAME TO t1x;
332}
333
334#-------------------------------------------------------------------------
335reset_db
336do_execsql_test 14.1 {
337  CREATE TABLE t1(a);
338  CREATE TABLE t2(b);
339  CREATE TRIGGER AFTER INSERT ON t1 BEGIN
340    SELECT sum() FILTER (WHERE (SELECT sum() FILTER (WHERE 0)) AND a);
341  END;
342}
343
344do_catchsql_test 14.2 {
345  ALTER TABLE t1 RENAME TO t1x;
346} {1 {error in trigger AFTER: no such column: a}}
347
348#-------------------------------------------------------------------------
349reset_db
350
351do_execsql_test 16.1 {
352  CREATE TABLE t1(x);
353  CREATE TRIGGER AFTER INSERT ON t1 BEGIN
354    SELECT (WITH t2 AS (WITH t3 AS (SELECT true)
355          SELECT * FROM t3 ORDER BY true COLLATE nocase)
356        SELECT 11);
357
358    WITH t4 AS (SELECT * FROM t1) SELECT 33;
359  END;
360}
361do_execsql_test 16.2 {
362  ALTER TABLE t1 RENAME TO t1x;
363}
364
365#-------------------------------------------------------------------------
366reset_db
367do_execsql_test 17.1 {
368  CREATE TABLE t1(a,b,c);
369  CREATE TRIGGER AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN
370    SELECT a () FILTER (WHERE a>0) FROM t1;
371  END;
372}
373
374do_execsql_test 17.2 {
375  ALTER TABLE t1 RENAME TO t1x;
376  ALTER TABLE t1x RENAME a TO aaa;
377  SELECT sql FROM sqlite_master WHERE type='trigger';
378} {
379{CREATE TRIGGER AFTER INSERT ON "t1x" WHEN new.aaa NOT NULL BEGIN
380    SELECT a () FILTER (WHERE aaa>0) FROM "t1x";
381  END}
382}
383
384
385finish_test
386