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