1# 2009 February 2 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# This file implements regression tests for SQLite library. The 12# focus of this script is testing that SQLite can handle a subtle 13# file format change that may be used in the future to implement 14# "ALTER TABLE ... RENAME COLUMN ... TO". 15# 16# $Id: alter4.test,v 1.1 2009/02/02 18:03:22 drh Exp $ 17# 18 19set testdir [file dirname $argv0] 20source $testdir/tester.tcl 21set testprefix altercol 22 23# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. 24ifcapable !altertable { 25 finish_test 26 return 27} 28 29# Drop all the tables and views in the 'main' database of database connect 30# [db]. Sort the objects by name before dropping them. 31# 32proc drop_all_tables_and_views {db} { 33 set SQL { 34 SELECT name, type FROM sqlite_master 35 WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%' 36 ORDER BY 1 37 } 38 foreach {z t} [db eval $SQL] { 39 db eval "DROP $t $z" 40 } 41} 42 43foreach {tn before after} { 44 1 {CREATE TABLE t1(a INTEGER, b TEXT, c BLOB)} 45 {CREATE TABLE t1(a INTEGER, d TEXT, c BLOB)} 46 47 2 {CREATE TABLE t1(a INTEGER, x TEXT, "b" BLOB)} 48 {CREATE TABLE t1(a INTEGER, x TEXT, "d" BLOB)} 49 50 3 {CREATE TABLE t1(a INTEGER, b TEXT, c BLOB, CHECK(b!=''))} 51 {CREATE TABLE t1(a INTEGER, d TEXT, c BLOB, CHECK(d!=''))} 52 53 4 {CREATE TABLE t1(a INTEGER, b TEXT, c BLOB, CHECK(t1.b!=''))} 54 {CREATE TABLE t1(a INTEGER, d TEXT, c BLOB, CHECK(t1.d!=''))} 55 56 5 {CREATE TABLE t1(a INTEGER, b TEXT, c BLOB, CHECK( coalesce(b,c) ))} 57 {CREATE TABLE t1(a INTEGER, d TEXT, c BLOB, CHECK( coalesce(d,c) ))} 58 59 6 {CREATE TABLE t1(a INTEGER, "b"TEXT, c BLOB, CHECK( coalesce(b,c) ))} 60 {CREATE TABLE t1(a INTEGER, "d"TEXT, c BLOB, CHECK( coalesce(d,c) ))} 61 62 7 {CREATE TABLE t1(a INTEGER, b TEXT, c BLOB, PRIMARY KEY(b, c))} 63 {CREATE TABLE t1(a INTEGER, d TEXT, c BLOB, PRIMARY KEY(d, c))} 64 65 8 {CREATE TABLE t1(a INTEGER, b TEXT PRIMARY KEY, c BLOB)} 66 {CREATE TABLE t1(a INTEGER, d TEXT PRIMARY KEY, c BLOB)} 67 68 9 {CREATE TABLE t1(a, b TEXT, c, PRIMARY KEY(a, b), UNIQUE("B"))} 69 {CREATE TABLE t1(a, d TEXT, c, PRIMARY KEY(a, d), UNIQUE("d"))} 70 71 10 {CREATE TABLE t1(a, b, c); CREATE INDEX t1i ON t1(a, c)} 72 {{CREATE TABLE t1(a, d, c)} {CREATE INDEX t1i ON t1(a, c)}} 73 74 11 {CREATE TABLE t1(a, b, c); CREATE INDEX t1i ON t1(b, c)} 75 {{CREATE TABLE t1(a, d, c)} {CREATE INDEX t1i ON t1(d, c)}} 76 77 12 {CREATE TABLE t1(a, b, c); CREATE INDEX t1i ON t1(b+b+b+b, c) WHERE b>0} 78 {{CREATE TABLE t1(a, d, c)} {CREATE INDEX t1i ON t1(d+d+d+d, c) WHERE d>0}} 79 80 13 {CREATE TABLE t1(a, b, c, FOREIGN KEY (b) REFERENCES t2)} 81 {CREATE TABLE t1(a, d, c, FOREIGN KEY (d) REFERENCES t2)} 82 83 14 {CREATE TABLE t1(a INTEGER, b TEXT, c BLOB, PRIMARY KEY(b))} 84 {CREATE TABLE t1(a INTEGER, d TEXT, c BLOB, PRIMARY KEY(d))} 85 86 15 {CREATE TABLE t1(a INTEGER, b INTEGER, c BLOB, PRIMARY KEY(b))} 87 {CREATE TABLE t1(a INTEGER, d INTEGER, c BLOB, PRIMARY KEY(d))} 88 89 16 {CREATE TABLE t1(a INTEGER, b INTEGER PRIMARY KEY, c BLOB)} 90 {CREATE TABLE t1(a INTEGER, d INTEGER PRIMARY KEY, c BLOB)} 91 92 17 {CREATE TABLE t1(a INTEGER, b INTEGER PRIMARY KEY, c BLOB, FOREIGN KEY (b) REFERENCES t2)} 93 {CREATE TABLE t1(a INTEGER, d INTEGER PRIMARY KEY, c BLOB, FOREIGN KEY (d) REFERENCES t2)} 94 95} { 96 reset_db 97 do_execsql_test 1.$tn.0 $before 98 99 do_execsql_test 1.$tn.1 { 100 INSERT INTO t1 VALUES(1, 2, 3); 101 } 102 103 do_execsql_test 1.$tn.2 { 104 ALTER TABLE t1 RENAME COLUMN b TO d; 105 } 106 107 do_execsql_test 1.$tn.3 { 108 SELECT * FROM t1; 109 } {1 2 3} 110 111 if {[string first INDEX $before]>0} { 112 set res $after 113 } else { 114 set res [list $after] 115 } 116 do_execsql_test 1.$tn.4 { 117 SELECT sql FROM sqlite_master WHERE tbl_name='t1' AND sql!='' 118 } $res 119} 120 121#------------------------------------------------------------------------- 122# 123do_execsql_test 2.0 { 124 CREATE TABLE t3(a, b, c, d, e, f, g, h, i, j, k, l, m, FOREIGN KEY (b, c, d, e, f, g, h, i, j, k, l, m) REFERENCES t4); 125} 126 127sqlite3 db2 test.db 128do_execsql_test -db db2 2.1 { SELECT b FROM t3 } 129 130do_execsql_test 2.2 { 131 ALTER TABLE t3 RENAME b TO biglongname; 132 SELECT sql FROM sqlite_master WHERE name='t3'; 133} {{CREATE TABLE t3(a, biglongname, c, d, e, f, g, h, i, j, k, l, m, FOREIGN KEY (biglongname, c, d, e, f, g, h, i, j, k, l, m) REFERENCES t4)}} 134 135do_execsql_test -db db2 2.3 { SELECT biglongname FROM t3 } 136 137#------------------------------------------------------------------------- 138# 139do_execsql_test 3.0 { 140 CREATE TABLE t4(x, y, z); 141 CREATE TRIGGER ttt AFTER INSERT ON t4 WHEN new.y<0 BEGIN 142 SELECT x, y, z FROM t4; 143 DELETE FROM t4 WHERE y=32; 144 UPDATE t4 SET x=y+1, y=0 WHERE y=32; 145 INSERT INTO t4(x, y, z) SELECT 4, 5, 6 WHERE 0; 146 END; 147 INSERT INTO t4 VALUES(3, 2, 1); 148} 149 150do_execsql_test 3.1 { 151 ALTER TABLE t4 RENAME y TO abc; 152 SELECT sql FROM sqlite_master WHERE name='t4'; 153} {{CREATE TABLE t4(x, abc, z)}} 154 155do_execsql_test 3.2 { 156 SELECT * FROM t4; 157} {3 2 1} 158 159do_execsql_test 3.3 { INSERT INTO t4 VALUES(6, 5, 4); } {} 160 161do_execsql_test 3.4 { SELECT sql FROM sqlite_master WHERE type='trigger' } { 162{CREATE TRIGGER ttt AFTER INSERT ON t4 WHEN new.abc<0 BEGIN 163 SELECT x, abc, z FROM t4; 164 DELETE FROM t4 WHERE abc=32; 165 UPDATE t4 SET x=abc+1, abc=0 WHERE abc=32; 166 INSERT INTO t4(x, abc, z) SELECT 4, 5, 6 WHERE 0; 167 END} 168} 169 170#------------------------------------------------------------------------- 171# 172do_execsql_test 4.0 { 173 CREATE TABLE c1(a, b, FOREIGN KEY (a, b) REFERENCES p1(c, d)); 174 CREATE TABLE p1(c, d, PRIMARY KEY(c, d)); 175 PRAGMA foreign_keys = 1; 176 INSERT INTO p1 VALUES(1, 2); 177 INSERT INTO p1 VALUES(3, 4); 178} 179 180do_execsql_test 4.1 { 181 ALTER TABLE p1 RENAME d TO "silly name"; 182 SELECT sql FROM sqlite_master WHERE name IN ('c1', 'p1'); 183} { 184 {CREATE TABLE c1(a, b, FOREIGN KEY (a, b) REFERENCES p1(c, "silly name"))} 185 {CREATE TABLE p1(c, "silly name", PRIMARY KEY(c, "silly name"))} 186} 187 188do_execsql_test 4.2 { INSERT INTO c1 VALUES(1, 2); } 189 190do_execsql_test 4.3 { 191 CREATE TABLE c2(a, b, FOREIGN KEY (a, b) REFERENCES p1); 192} 193 194do_execsql_test 4.4 { 195 ALTER TABLE p1 RENAME "silly name" TO reasonable; 196 SELECT sql FROM sqlite_master WHERE name IN ('c1', 'c2', 'p1'); 197} { 198 {CREATE TABLE c1(a, b, FOREIGN KEY (a, b) REFERENCES p1(c, "reasonable"))} 199 {CREATE TABLE p1(c, "reasonable", PRIMARY KEY(c, "reasonable"))} 200 {CREATE TABLE c2(a, b, FOREIGN KEY (a, b) REFERENCES p1)} 201} 202 203#------------------------------------------------------------------------- 204 205do_execsql_test 5.0 { 206 CREATE TABLE t5(a, b, c); 207 CREATE INDEX t5a ON t5(a); 208 INSERT INTO t5 VALUES(1, 2, 3), (4, 5, 6); 209 ANALYZE; 210} 211 212do_execsql_test 5.1 { 213 ALTER TABLE t5 RENAME b TO big; 214 SELECT big FROM t5; 215} {2 5} 216 217do_catchsql_test 6.1 { 218 ALTER TABLE sqlite_stat1 RENAME tbl TO thetable; 219} {1 {table sqlite_stat1 may not be altered}} 220 221#------------------------------------------------------------------------- 222# 223do_execsql_test 6.0 { 224 CREATE TABLE blob( 225 rid INTEGER PRIMARY KEY, 226 rcvid INTEGER, 227 size INTEGER, 228 uuid TEXT UNIQUE NOT NULL, 229 content BLOB, 230 CHECK( length(uuid)>=40 AND rid>0 ) 231 ); 232} 233 234do_execsql_test 6.1 { 235 ALTER TABLE "blob" RENAME COLUMN "rid" TO "a1"; 236} 237 238do_catchsql_test 6.2 { 239 ALTER TABLE "blob" RENAME COLUMN "a1" TO [where]; 240} {0 {}} 241 242do_execsql_test 6.3 { 243 SELECT "where" FROM blob; 244} {} 245 246#------------------------------------------------------------------------- 247# Triggers. 248# 249reset_db 250do_execsql_test 7.0 { 251 CREATE TABLE c(x); 252 INSERT INTO c VALUES(0); 253 CREATE TABLE t6("col a", "col b", "col c"); 254 CREATE TRIGGER zzz AFTER UPDATE OF "col a", "col c" ON t6 BEGIN 255 UPDATE c SET x=x+1; 256 END; 257} 258 259do_execsql_test 7.1.1 { 260 INSERT INTO t6 VALUES(0, 0, 0); 261 UPDATE t6 SET "col c" = 1; 262 SELECT * FROM c; 263} {1} 264 265do_execsql_test 7.1.2 { 266 ALTER TABLE t6 RENAME "col c" TO "col 3"; 267} 268 269do_execsql_test 7.1.3 { 270 UPDATE t6 SET "col 3" = 0; 271 SELECT * FROM c; 272} {2} 273 274#------------------------------------------------------------------------- 275# Views. 276# 277reset_db 278do_execsql_test 8.0 { 279 CREATE TABLE a1(x INTEGER, y TEXT, z BLOB, PRIMARY KEY(x)); 280 CREATE TABLE a2(a, b, c); 281 CREATE VIEW v1 AS SELECT x, y, z FROM a1; 282} 283 284do_execsql_test 8.1 { 285 ALTER TABLE a1 RENAME y TO yyy; 286 SELECT sql FROM sqlite_master WHERE type='view'; 287} {{CREATE VIEW v1 AS SELECT x, yyy, z FROM a1}} 288 289do_execsql_test 8.2.1 { 290 DROP VIEW v1; 291 CREATE VIEW v2 AS SELECT x, x+x, a, a+a FROM a1, a2; 292} {} 293do_execsql_test 8.2.2 { 294 ALTER TABLE a1 RENAME x TO xxx; 295} 296do_execsql_test 8.2.3 { 297 SELECT sql FROM sqlite_master WHERE type='view'; 298} {{CREATE VIEW v2 AS SELECT xxx, xxx+xxx, a, a+a FROM a1, a2}} 299 300do_execsql_test 8.3.1 { 301 DROP TABLE a2; 302 DROP VIEW v2; 303 CREATE TABLE a2(a INTEGER PRIMARY KEY, b, c); 304 CREATE VIEW v2 AS SELECT xxx, xxx+xxx, a, a+a FROM a1, a2; 305} {} 306do_execsql_test 8.3.2 { 307 ALTER TABLE a1 RENAME xxx TO x; 308} 309do_execsql_test 8.3.3 { 310 SELECT sql FROM sqlite_master WHERE type='view'; 311} {{CREATE VIEW v2 AS SELECT x, x+x, a, a+a FROM a1, a2}} 312 313do_execsql_test 8.4.0 { 314 CREATE TABLE b1(a, b, c); 315 CREATE TABLE b2(x, y, z); 316} 317 318do_execsql_test 8.4.1 { 319 CREATE VIEW vvv AS SELECT c+c || coalesce(c, c) FROM b1, b2 WHERE x=c GROUP BY c HAVING c>0; 320 ALTER TABLE b1 RENAME c TO "a;b"; 321 SELECT sql FROM sqlite_master WHERE name='vvv'; 322} {{CREATE VIEW vvv AS SELECT "a;b"+"a;b" || coalesce("a;b", "a;b") FROM b1, b2 WHERE x="a;b" GROUP BY "a;b" HAVING "a;b">0}} 323 324do_execsql_test 8.4.2 { 325 CREATE VIEW www AS SELECT b FROM b1 UNION ALL SELECT y FROM b2; 326 ALTER TABLE b1 RENAME b TO bbb; 327 SELECT sql FROM sqlite_master WHERE name='www'; 328} {{CREATE VIEW www AS SELECT bbb FROM b1 UNION ALL SELECT y FROM b2}} 329 330db collate nocase {string compare} 331 332do_execsql_test 8.4.3 { 333 CREATE VIEW xxx AS SELECT a FROM b1 UNION SELECT x FROM b2 ORDER BY 1 COLLATE nocase; 334} 335 336do_execsql_test 8.4.4 { 337 ALTER TABLE b2 RENAME x TO hello; 338 SELECT sql FROM sqlite_master WHERE name='xxx'; 339} {{CREATE VIEW xxx AS SELECT a FROM b1 UNION SELECT hello FROM b2 ORDER BY 1 COLLATE nocase}} 340 341do_catchsql_test 8.4.5 { 342 CREATE VIEW zzz AS SELECT george, ringo FROM b1; 343 ALTER TABLE b1 RENAME a TO aaa; 344} {1 {error in view zzz: no such column: george}} 345 346#------------------------------------------------------------------------- 347# More triggers. 348# 349proc do_rename_column_test {tn old new lSchema} { 350 for {set i 0} {$i < 2} {incr i} { 351 drop_all_tables_and_views db 352 353 set lSorted [list] 354 foreach sql $lSchema { 355 execsql $sql 356 lappend lSorted [string trim $sql] 357 } 358 set lSorted [lsort $lSorted] 359 360 do_execsql_test $tn.$i.1 { 361 SELECT sql FROM sqlite_master WHERE sql!='' ORDER BY 1 362 } $lSorted 363 364 if {$i==1} { 365 db close 366 sqlite3 db test.db 367 } 368 369 do_execsql_test $tn.$i.2 "ALTER TABLE t1 RENAME $old TO $new" 370 371 do_execsql_test $tn.$i.3 { 372 SELECT sql FROM sqlite_master ORDER BY 1 373 } [string map [list $old $new] $lSorted] 374 } 375} 376 377foreach {tn old new lSchema} { 378 1 _x_ _xxx_ { 379 { CREATE TABLE t1(a, b, _x_) } 380 { CREATE TRIGGER AFTER INSERT ON t1 BEGIN 381 SELECT _x_ FROM t1; 382 END } 383 } 384 385 2 _x_ _xxx_ { 386 { CREATE TABLE t1(a, b, _x_) } 387 { CREATE TABLE t2(c, d, e) } 388 { CREATE TRIGGER ttt AFTER INSERT ON t2 BEGIN 389 SELECT _x_ FROM t1; 390 END } 391 } 392 393 3 _x_ _xxx_ { 394 { CREATE TABLE t1(a, b, _x_ INTEGER, PRIMARY KEY(_x_), CHECK(_x_>0)) } 395 { CREATE TABLE t2(c, d, e) } 396 { CREATE TRIGGER ttt AFTER UPDATE ON t1 BEGIN 397 INSERT INTO t2 VALUES(new.a, new.b, new._x_); 398 END } 399 } 400 401 4 _x_ _xxx_ { 402 { CREATE TABLE t1(a, b, _x_ INTEGER, PRIMARY KEY(_x_), CHECK(_x_>0)) } 403 { CREATE TRIGGER ttt AFTER UPDATE ON t1 BEGIN 404 INSERT INTO t1 VALUES(new.a, new.b, new._x_) 405 ON CONFLICT (_x_) WHERE _x_>10 DO UPDATE SET _x_ = _x_+1; 406 END } 407 } 408 409 4 _x_ _xxx_ { 410 { CREATE TABLE t1(a, b, _x_ INTEGER, PRIMARY KEY(_x_), CHECK(_x_>0)) } 411 { CREATE TRIGGER ttt AFTER UPDATE ON t1 BEGIN 412 INSERT INTO t1 VALUES(new.a, new.b, new._x_) 413 ON CONFLICT (_x_) WHERE _x_>10 DO NOTHING; 414 END } 415 } 416} { 417 do_rename_column_test 9.$tn $old $new $lSchema 418} 419 420#------------------------------------------------------------------------- 421# Test that views can be edited even if there are missing collation 422# sequences or user defined functions. 423# 424reset_db 425 426foreach {tn old new lSchema} { 427 1 _x_ _xxx_ { 428 { CREATE TABLE t1(a, b, _x_) } 429 { CREATE VIEW s1 AS SELECT a, b, _x_ FROM t1 WHERE _x_='abc' COLLATE xyz } 430 } 431 432 2 _x_ _xxx_ { 433 { CREATE TABLE t1(a, b, _x_) } 434 { CREATE VIEW v1 AS SELECT a, b, _x_ FROM t1 WHERE scalar(_x_) } 435 } 436 437 3 _x_ _xxx_ { 438 { CREATE TABLE t1(a, b, _x_) } 439 { CREATE VIEW v1 AS SELECT a, b, _x_ FROM t1 WHERE _x_ = unicode(1, 2, 3) } 440 } 441 442 4 _x_ _xxx_ { 443 { CREATE TABLE t1(a, b, _x_) } 444 { CREATE VIRTUAL TABLE e1 USING echo(t1) } 445 } 446} { 447 register_echo_module db 448 do_rename_column_test 10.$tn $old $new $lSchema 449} 450 451#-------------------------------------------------------------------------- 452# Test that if a view or trigger refers to a virtual table for which the 453# module is not available, RENAME COLUMN cannot proceed. 454# 455reset_db 456register_echo_module db 457do_execsql_test 11.0 { 458 CREATE TABLE x1(a, b, c); 459 CREATE VIRTUAL TABLE e1 USING echo(x1); 460} 461db close 462sqlite3 db test.db 463 464do_execsql_test 11.1 { 465 ALTER TABLE x1 RENAME b TO bbb; 466 SELECT sql FROM sqlite_master; 467} { {CREATE TABLE x1(a, bbb, c)} {CREATE VIRTUAL TABLE e1 USING echo(x1)} } 468 469do_execsql_test 11.2 { 470 CREATE VIEW v1 AS SELECT e1.*, x1.c FROM e1, x1; 471} 472 473do_catchsql_test 11.3 { 474 ALTER TABLE x1 RENAME c TO ccc; 475} {1 {error in view v1: no such module: echo}} 476 477#------------------------------------------------------------------------- 478# Test some error conditions: 479# 480# 1. Renaming a column of a system table, 481# 2. Renaming a column of a VIEW, 482# 3. Renaming a column of a virtual table. 483# 4. Renaming a column that does not exist. 484# 5. Renaming a column of a table that does not exist. 485# 486reset_db 487do_execsql_test 12.1.1 { 488 CREATE TABLE t1(a, b); 489 CREATE INDEX t1a ON t1(a); 490 INSERT INTO t1 VALUES(1, 1), (2, 2), (3, 4); 491 ANALYZE; 492} 493do_catchsql_test 12.1.2 { 494 ALTER TABLE sqlite_stat1 RENAME idx TO theindex; 495} {1 {table sqlite_stat1 may not be altered}} 496do_execsql_test 12.1.3 { 497 SELECT sql FROM sqlite_master WHERE tbl_name = 'sqlite_stat1' 498} {{CREATE TABLE sqlite_stat1(tbl,idx,stat)}} 499 500do_execsql_test 12.2.1 { 501 CREATE VIEW v1 AS SELECT * FROM t1; 502 CREATE VIEW v2(c, d) AS SELECT * FROM t1; 503} 504do_catchsql_test 12.2.2 { 505 ALTER TABLE v1 RENAME a TO z; 506} {1 {cannot rename columns of view "v1"}} 507do_catchsql_test 12.2.3 { 508 ALTER TABLE v2 RENAME c TO y; 509} {1 {cannot rename columns of view "v2"}} 510 511ifcapable fts5 { 512 do_execsql_test 12.3.1 { 513 CREATE VIRTUAL TABLE ft USING fts5(a, b, c); 514 } 515 do_catchsql_test 12.3.2 { 516 ALTER TABLE ft RENAME a TO z; 517 } {1 {columns of virtual table ft may not be renamed}} 518} 519 520do_execsql_test 12.4.1 { 521 CREATE TABLE t2(x, y, z); 522} 523do_catchsql_test 12.4.2 { 524 ALTER TABLE t2 RENAME COLUMN a TO b; 525} {1 {no such column: "a"}} 526 527do_catchsql_test 12.5.1 { 528 ALTER TABLE t3 RENAME COLUMN a TO b; 529} {1 {no such table: t3}} 530 531#------------------------------------------------------------------------- 532# Test the effect of some parse/resolve errors. 533# 534reset_db 535do_execsql_test 13.1.1 { 536 CREATE TABLE x1(i INTEGER, t TEXT UNIQUE); 537 CREATE TRIGGER tr1 AFTER INSERT ON x1 BEGIN 538 SELECT * FROM nosuchtable; 539 END; 540} 541 542do_catchsql_test 13.1.2 { 543 ALTER TABLE x1 RENAME COLUMN t TO ttt; 544} {1 {error in trigger tr1: no such table: main.nosuchtable}} 545 546do_execsql_test 13.1.3 { 547 DROP TRIGGER tr1; 548 CREATE INDEX x1i ON x1(i); 549 SELECT sql FROM sqlite_master WHERE name='x1i'; 550} {{CREATE INDEX x1i ON x1(i)}} 551 552do_execsql_test 13.1.4 { 553 PRAGMA writable_schema = 1; 554 UPDATE sqlite_master SET sql = 'CREATE INDEX x1i ON x1(j)' WHERE name='x1i'; 555} {} 556 557do_catchsql_test 13.1.5 { 558 ALTER TABLE x1 RENAME COLUMN t TO ttt; 559} {1 {error in index x1i: no such column: j}} 560 561do_execsql_test 13.1.6 { 562 UPDATE sqlite_master SET sql = '' WHERE name='x1i'; 563} {} 564 565do_catchsql_test 13.1.7 { 566 ALTER TABLE x1 RENAME COLUMN t TO ttt; 567} {1 {database disk image is malformed}} 568 569do_execsql_test 13.1.8 { 570 DELETE FROM sqlite_master WHERE name = 'x1i'; 571} 572 573do_execsql_test 13.2.0 { 574 CREATE TABLE data(x UNIQUE, y, z); 575} 576foreach {tn trigger error} { 577 1 { 578 CREATE TRIGGER tr1 AFTER INSERT ON x1 BEGIN 579 UPDATE data SET x=x+1 WHERE zzz=new.i; 580 END; 581 } {no such column: zzz} 582 583 2 { 584 CREATE TRIGGER tr1 AFTER INSERT ON x1 BEGIN 585 INSERT INTO data(x, y) VALUES(new.i, new.t, 1) 586 ON CONFLICT (x) DO UPDATE SET z=zz+1; 587 END; 588 } {no such column: zz} 589 590 3 { 591 CREATE TRIGGER tr1 AFTER INSERT ON x1 BEGIN 592 INSERT INTO x1(i, t) VALUES(new.i+1, new.t||'1') 593 ON CONFLICT (tttttt) DO UPDATE SET t=i+1; 594 END; 595 } {no such column: tttttt} 596 597 4 { 598 CREATE TRIGGER tr1 AFTER INSERT ON x1 BEGIN 599 INSERT INTO nosuchtable VALUES(new.i, new.t); 600 END; 601 } {no such table: main.nosuchtable} 602} { 603 do_execsql_test 13.2.$tn.1 " 604 DROP TRIGGER IF EXISTS tr1; 605 $trigger 606 " 607 608 do_catchsql_test 13.2.$tn.2 { 609 ALTER TABLE x1 RENAME COLUMN t TO ttt; 610 } "1 {error in trigger tr1: $error}" 611} 612 613#------------------------------------------------------------------------- 614# Passing invalid parameters directly to sqlite_rename_column(). 615# 616do_execsql_test 14.1 { 617 CREATE TABLE ddd(sql, type, object, db, tbl, icol, znew, bquote); 618 INSERT INTO ddd VALUES( 619 'CREATE TABLE x1(i INTEGER, t TEXT)', 620 'table', 'x1', 'main', 'x1', -1, 'zzz', 0 621 ), ( 622 'CREATE TABLE x1(i INTEGER, t TEXT)', 623 'table', 'x1', 'main', 'x1', 2, 'zzz', 0 624 ), ( 625 'CREATE TABLE x1(i INTEGER, t TEXT)', 626 'table', 'x1', 'main', 'notable', 0, 'zzz', 0 627 ); 628} {} 629 630do_execsql_test 14.2 { 631 SELECT 632 sqlite_rename_column(sql, type, object, db, tbl, icol, znew, bquote) 633 FROM ddd; 634} {{} {} {}} 635 636#------------------------------------------------------------------------- 637# 638reset_db 639do_execsql_test 15.0 { 640 CREATE TABLE xxx(a, b, c); 641 SELECT a AS d FROM xxx WHERE d=0; 642} 643 644do_execsql_test 15.1 { 645 CREATE VIEW vvv AS SELECT a AS d FROM xxx WHERE d=0; 646 ALTER TABLE xxx RENAME a TO xyz; 647} 648 649do_execsql_test 15.2 { 650 SELECT sql FROM sqlite_master WHERE type='view'; 651} {{CREATE VIEW vvv AS SELECT xyz AS d FROM xxx WHERE d=0}} 652 653#------------------------------------------------------------------------- 654# 655do_execsql_test 16.0 { 656 CREATE TABLE t1(a,b,c); 657 CREATE TABLE t2(d,e,f); 658 INSERT INTO t1 VALUES(1,2,3); 659 INSERT INTO t2 VALUES(4,5,6); 660 CREATE VIEW v4 AS SELECT a, d FROM t1, t2; 661 SELECT * FROM v4; 662} {1 4} 663 664do_catchsql_test 16.1 { 665 ALTER TABLE t2 RENAME d TO a; 666} {1 {error in view v4 after rename: ambiguous column name: a}} 667 668do_execsql_test 16.2 { 669 SELECT * FROM v4; 670} {1 4} 671 672do_execsql_test 16.3 { 673 CREATE UNIQUE INDEX t2d ON t2(d); 674 CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN 675 INSERT INTO t2 VALUES(new.a, new.b, new.c) 676 ON CONFLICT(d) DO UPDATE SET f = excluded.f; 677 END; 678} 679 680do_execsql_test 16.4 { 681 INSERT INTO t1 VALUES(4, 8, 456); 682 SELECT * FROM t2; 683} {4 5 456} 684 685do_execsql_test 16.5 { 686 ALTER TABLE t2 RENAME COLUMN f TO "big f"; 687 INSERT INTO t1 VALUES(4, 0, 20456); 688 SELECT * FROM t2; 689} {4 5 20456} 690 691do_execsql_test 16.6 { 692 ALTER TABLE t1 RENAME COLUMN c TO "big c"; 693 INSERT INTO t1 VALUES(4, 0, 0); 694 SELECT * FROM t2; 695} {4 5 0} 696 697finish_test 698