dan | c9461ec | 2018-08-29 21:00:16 +0000 | [diff] [blame] | 1 | # 2018 August 24 |
| 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 | |
| 13 | set testdir [file dirname $argv0] |
| 14 | source $testdir/tester.tcl |
| 15 | set testprefix altertab |
| 16 | |
| 17 | # If SQLITE_OMIT_ALTERTABLE is defined, omit this file. |
| 18 | ifcapable !altertable { |
| 19 | finish_test |
| 20 | return |
| 21 | } |
| 22 | |
| 23 | do_execsql_test 1.0 { |
| 24 | CREATE TABLE t1(a, b, CHECK(t1.a != t1.b)); |
| 25 | |
| 26 | CREATE TABLE t2(a, b); |
| 27 | CREATE INDEX t2expr ON t2(a) WHERE t2.b>0; |
| 28 | } |
| 29 | |
| 30 | do_execsql_test 1.1 { |
| 31 | SELECT sql FROM sqlite_master |
| 32 | } { |
| 33 | {CREATE TABLE t1(a, b, CHECK(t1.a != t1.b))} |
| 34 | {CREATE TABLE t2(a, b)} |
| 35 | {CREATE INDEX t2expr ON t2(a) WHERE t2.b>0} |
| 36 | } |
| 37 | |
| 38 | do_execsql_test 1.2 { |
| 39 | ALTER TABLE t1 RENAME TO t1new; |
| 40 | } |
| 41 | |
| 42 | do_execsql_test 1.3 { |
| 43 | CREATE TABLE t3(c, d); |
| 44 | ALTER TABLE t3 RENAME TO t3new; |
| 45 | DROP TABLE t3new; |
| 46 | } |
| 47 | |
| 48 | do_execsql_test 1.4 { |
| 49 | SELECT sql FROM sqlite_master |
| 50 | } { |
| 51 | {CREATE TABLE "t1new"(a, b, CHECK("t1new".a != "t1new".b))} |
| 52 | {CREATE TABLE t2(a, b)} |
| 53 | {CREATE INDEX t2expr ON t2(a) WHERE t2.b>0} |
| 54 | } |
| 55 | |
| 56 | |
| 57 | do_execsql_test 1.3 { |
| 58 | ALTER TABLE t2 RENAME TO t2new; |
| 59 | } |
| 60 | do_execsql_test 1.4 { |
| 61 | SELECT sql FROM sqlite_master |
| 62 | } { |
| 63 | {CREATE TABLE "t1new"(a, b, CHECK("t1new".a != "t1new".b))} |
| 64 | {CREATE TABLE "t2new"(a, b)} |
| 65 | {CREATE INDEX t2expr ON "t2new"(a) WHERE "t2new".b>0} |
| 66 | } |
| 67 | |
| 68 | |
| 69 | #------------------------------------------------------------------------- |
| 70 | reset_db |
dan | 7ea1edb | 2018-09-06 17:23:08 +0000 | [diff] [blame] | 71 | ifcapable vtab { |
| 72 | register_echo_module db |
dan | c9461ec | 2018-08-29 21:00:16 +0000 | [diff] [blame] | 73 | |
dan | 7ea1edb | 2018-09-06 17:23:08 +0000 | [diff] [blame] | 74 | do_execsql_test 2.0 { |
| 75 | CREATE TABLE abc(a, b, c); |
| 76 | INSERT INTO abc VALUES(1, 2, 3); |
| 77 | CREATE VIRTUAL TABLE eee USING echo('abc'); |
| 78 | SELECT * FROM eee; |
| 79 | } {1 2 3} |
dan | c9461ec | 2018-08-29 21:00:16 +0000 | [diff] [blame] | 80 | |
dan | 7ea1edb | 2018-09-06 17:23:08 +0000 | [diff] [blame] | 81 | do_execsql_test 2.1 { |
| 82 | ALTER TABLE eee RENAME TO fff; |
| 83 | SELECT * FROM fff; |
| 84 | } {1 2 3} |
dan | c9461ec | 2018-08-29 21:00:16 +0000 | [diff] [blame] | 85 | |
dan | 7ea1edb | 2018-09-06 17:23:08 +0000 | [diff] [blame] | 86 | db close |
| 87 | sqlite3 db test.db |
dan | c9461ec | 2018-08-29 21:00:16 +0000 | [diff] [blame] | 88 | |
dan | 7ea1edb | 2018-09-06 17:23:08 +0000 | [diff] [blame] | 89 | do_catchsql_test 2.2 { |
| 90 | ALTER TABLE fff RENAME TO ggg; |
| 91 | } {1 {no such module: echo}} |
| 92 | } |
dan | c9461ec | 2018-08-29 21:00:16 +0000 | [diff] [blame] | 93 | |
| 94 | #------------------------------------------------------------------------- |
| 95 | reset_db |
| 96 | |
| 97 | do_execsql_test 3.0 { |
| 98 | CREATE TABLE txx(a, b, c); |
| 99 | INSERT INTO txx VALUES(1, 2, 3); |
| 100 | CREATE VIEW vvv AS SELECT main.txx.a, txx.b, c FROM txx; |
| 101 | CREATE VIEW uuu AS SELECT main.one.a, one.b, c FROM txx AS one; |
| 102 | CREATE VIEW temp.ttt AS SELECT main.txx.a, txx.b, one.b, main.one.a FROM txx AS one, txx; |
| 103 | } |
| 104 | |
| 105 | do_execsql_test 3.1.1 { |
| 106 | SELECT * FROM vvv; |
| 107 | } {1 2 3} |
| 108 | do_execsql_test 3.1.2 { |
| 109 | ALTER TABLE txx RENAME TO "t xx"; |
| 110 | SELECT * FROM vvv; |
| 111 | } {1 2 3} |
| 112 | do_execsql_test 3.1.3 { |
| 113 | SELECT sql FROM sqlite_master WHERE name='vvv'; |
| 114 | } {{CREATE VIEW vvv AS SELECT main."t xx".a, "t xx".b, c FROM "t xx"}} |
| 115 | |
| 116 | |
| 117 | do_execsql_test 3.2.1 { |
| 118 | SELECT * FROM uuu; |
| 119 | } {1 2 3} |
| 120 | do_execsql_test 3.2.2 { |
| 121 | SELECT sql FROM sqlite_master WHERE name='uuu';; |
| 122 | } {{CREATE VIEW uuu AS SELECT main.one.a, one.b, c FROM "t xx" AS one}} |
| 123 | |
| 124 | do_execsql_test 3.3.1 { |
| 125 | SELECT * FROM ttt; |
| 126 | } {1 2 2 1} |
| 127 | do_execsql_test 3.3.2 { |
| 128 | SELECT sql FROM sqlite_temp_master WHERE name='ttt'; |
| 129 | } {{CREATE VIEW ttt AS SELECT main."t xx".a, "t xx".b, one.b, main.one.a FROM "t xx" AS one, "t xx"}} |
| 130 | |
| 131 | #------------------------------------------------------------------------- |
| 132 | reset_db |
| 133 | do_execsql_test 4.0 { |
| 134 | CREATE table t1(x, y); |
| 135 | CREATE table t2(a, b); |
| 136 | |
| 137 | CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN |
| 138 | SELECT t1.x, * FROM t1, t2; |
| 139 | INSERT INTO t2 VALUES(new.x, new.y); |
| 140 | END; |
| 141 | } |
| 142 | |
| 143 | do_execsql_test 4.1 { |
| 144 | INSERT INTO t1 VALUES(1, 1); |
| 145 | ALTER TABLE t1 RENAME TO t11; |
| 146 | INSERT INTO t11 VALUES(2, 2); |
| 147 | ALTER TABLE t2 RENAME TO t22; |
| 148 | INSERT INTO t11 VALUES(3, 3); |
| 149 | } |
| 150 | |
| 151 | proc squish {a} { |
| 152 | string trim [regsub -all {[[:space:]][[:space:]]*} $a { }] |
| 153 | } |
| 154 | db func squish squish |
| 155 | do_test 4.2 { |
| 156 | execsql { SELECT squish(sql) FROM sqlite_master WHERE name = 'tr1' } |
| 157 | } [list [squish { |
| 158 | CREATE TRIGGER tr1 AFTER INSERT ON "t11" BEGIN |
| 159 | SELECT "t11".x, * FROM "t11", "t22"; |
| 160 | INSERT INTO "t22" VALUES(new.x, new.y); |
| 161 | END |
| 162 | }]] |
| 163 | |
dan | 0ccda96 | 2018-08-30 16:26:48 +0000 | [diff] [blame] | 164 | #------------------------------------------------------------------------- |
| 165 | reset_db |
| 166 | do_execsql_test 5.0 { |
| 167 | CREATE TABLE t9(a, b, c); |
| 168 | CREATE TABLE t10(a, b, c); |
| 169 | CREATE TEMP TABLE t9(a, b, c); |
| 170 | |
| 171 | CREATE TRIGGER temp.t9t AFTER INSERT ON temp.t9 BEGIN |
| 172 | INSERT INTO t10 VALUES(new.a, new.b, new.c); |
| 173 | END; |
| 174 | |
| 175 | INSERT INTO temp.t9 VALUES(1, 2, 3); |
| 176 | SELECT * FROM t10; |
| 177 | } {1 2 3} |
| 178 | |
| 179 | do_execsql_test 5.1 { |
| 180 | ALTER TABLE temp.t9 RENAME TO 't1234567890' |
| 181 | } |
dan | c9461ec | 2018-08-29 21:00:16 +0000 | [diff] [blame] | 182 | |
dan | 9d32482 | 2018-08-30 20:03:44 +0000 | [diff] [blame] | 183 | do_execsql_test 5.2 { |
| 184 | CREATE TABLE t1(a, b); |
| 185 | CREATE TABLE t2(a, b); |
| 186 | INSERT INTO t1 VALUES(1, 2); |
| 187 | INSERT INTO t2 VALUES(3, 4); |
| 188 | CREATE VIEW v AS SELECT one.a, one.b, t2.a, t2.b FROM t1 AS one, t2; |
| 189 | SELECT * FROM v; |
| 190 | } {1 2 3 4} |
| 191 | |
| 192 | do_catchsql_test 5.3 { |
| 193 | ALTER TABLE t2 RENAME TO one; |
| 194 | } {1 {error in view v after rename: ambiguous column name: one.a}} |
| 195 | |
| 196 | do_execsql_test 5.4 { |
| 197 | SELECT * FROM v |
| 198 | } {1 2 3 4} |
| 199 | |
| 200 | do_execsql_test 5.5 { |
| 201 | DROP VIEW v; |
| 202 | CREATE VIEW temp.vv AS SELECT one.a, one.b, t2.a, t2.b FROM t1 AS one, t2; |
| 203 | SELECT * FROM vv; |
| 204 | } {1 2 3 4} |
| 205 | |
| 206 | do_catchsql_test 5.6 { |
| 207 | ALTER TABLE t2 RENAME TO one; |
| 208 | } {1 {error in view vv after rename: ambiguous column name: one.a}} |
| 209 | |
dan | b87a9a8 | 2018-09-01 20:23:28 +0000 | [diff] [blame] | 210 | #------------------------------------------------------------------------- |
| 211 | |
dan | 1041a6a | 2018-09-06 17:47:09 +0000 | [diff] [blame] | 212 | ifcapable vtab { |
| 213 | register_tcl_module db |
| 214 | proc tcl_command {method args} { |
| 215 | switch -- $method { |
| 216 | xConnect { |
| 217 | return "CREATE TABLE t1(a, b, c)" |
| 218 | } |
dan | b87a9a8 | 2018-09-01 20:23:28 +0000 | [diff] [blame] | 219 | } |
dan | 1041a6a | 2018-09-06 17:47:09 +0000 | [diff] [blame] | 220 | return {} |
dan | b87a9a8 | 2018-09-01 20:23:28 +0000 | [diff] [blame] | 221 | } |
dan | 1041a6a | 2018-09-06 17:47:09 +0000 | [diff] [blame] | 222 | |
| 223 | do_execsql_test 6.0 { |
| 224 | CREATE VIRTUAL TABLE x1 USING tcl(tcl_command); |
| 225 | } |
| 226 | |
| 227 | do_execsql_test 6.1 { |
| 228 | ALTER TABLE x1 RENAME TO x2; |
| 229 | SELECT sql FROM sqlite_master WHERE name = 'x2' |
| 230 | } {{CREATE VIRTUAL TABLE "x2" USING tcl(tcl_command)}} |
| 231 | |
| 232 | do_execsql_test 7.1 { |
| 233 | CREATE TABLE ddd(db, sql, zOld, zNew, bTemp); |
| 234 | INSERT INTO ddd VALUES( |
| 235 | 'main', 'CREATE TABLE x1(i INTEGER, t TEXT)', 'ddd', NULL, 0 |
| 236 | ), ( |
| 237 | 'main', 'CREATE TABLE x1(i INTEGER, t TEXT)', NULL, 'eee', 0 |
| 238 | ), ( |
| 239 | 'main', NULL, 'ddd', 'eee', 0 |
| 240 | ); |
| 241 | } {} |
| 242 | |
drh | 171c50e | 2020-01-01 15:43:30 +0000 | [diff] [blame] | 243 | sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db |
dan | 1041a6a | 2018-09-06 17:47:09 +0000 | [diff] [blame] | 244 | do_execsql_test 7.2 { |
| 245 | SELECT |
| 246 | sqlite_rename_table(db, 0, 0, sql, zOld, zNew, bTemp) |
| 247 | FROM ddd; |
| 248 | } {{} {} {}} |
drh | 171c50e | 2020-01-01 15:43:30 +0000 | [diff] [blame] | 249 | sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db |
dan | b87a9a8 | 2018-09-01 20:23:28 +0000 | [diff] [blame] | 250 | } |
| 251 | |
dan | 143df55 | 2018-09-01 20:38:42 +0000 | [diff] [blame] | 252 | #------------------------------------------------------------------------- |
| 253 | # |
| 254 | reset_db |
| 255 | forcedelete test.db2 |
| 256 | do_execsql_test 8.1 { |
| 257 | ATTACH 'test.db2' AS aux; |
| 258 | PRAGMA foreign_keys = on; |
| 259 | CREATE TABLE aux.p1(a INTEGER PRIMARY KEY, b); |
| 260 | CREATE TABLE aux.c1(x INTEGER PRIMARY KEY, y REFERENCES p1(a)); |
| 261 | INSERT INTO aux.p1 VALUES(1, 1); |
| 262 | INSERT INTO aux.p1 VALUES(2, 2); |
| 263 | INSERT INTO aux.c1 VALUES(NULL, 2); |
| 264 | CREATE TABLE aux.c2(x INTEGER PRIMARY KEY, y REFERENCES c1(a)); |
| 265 | } |
| 266 | |
| 267 | do_execsql_test 8.2 { |
| 268 | ALTER TABLE aux.p1 RENAME TO ppp; |
| 269 | } |
| 270 | |
| 271 | do_execsql_test 8.2 { |
| 272 | INSERT INTO aux.c1 VALUES(NULL, 1); |
| 273 | SELECT sql FROM aux.sqlite_master WHERE name = 'c1'; |
| 274 | } {{CREATE TABLE c1(x INTEGER PRIMARY KEY, y REFERENCES "ppp"(a))}} |
| 275 | |
dan | 65372fa | 2018-09-03 20:05:15 +0000 | [diff] [blame] | 276 | reset_db |
| 277 | do_execsql_test 9.0 { |
| 278 | CREATE TABLE t1(a, b, c); |
| 279 | CREATE VIEW v1 AS SELECT * FROM t2; |
| 280 | } |
| 281 | do_catchsql_test 9.1 { |
| 282 | ALTER TABLE t1 RENAME TO t3; |
| 283 | } {1 {error in view v1: no such table: main.t2}} |
| 284 | do_execsql_test 9.2 { |
| 285 | DROP VIEW v1; |
| 286 | CREATE TRIGGER tr AFTER INSERT ON t1 BEGIN |
| 287 | INSERT INTO t2 VALUES(new.a); |
| 288 | END; |
| 289 | } |
| 290 | do_catchsql_test 9.3 { |
| 291 | ALTER TABLE t1 RENAME TO t3; |
| 292 | } {1 {error in trigger tr: no such table: main.t2}} |
| 293 | |
| 294 | forcedelete test.db2 |
| 295 | do_execsql_test 9.4 { |
| 296 | DROP TRIGGER tr; |
| 297 | |
| 298 | ATTACH 'test.db2' AS aux; |
dan | c50f75d | 2018-09-06 18:56:36 +0000 | [diff] [blame] | 299 | CREATE TRIGGER tr AFTER INSERT ON t1 WHEN new.a IS NULL BEGIN SELECT 1, 2, 3; END; |
dan | 65372fa | 2018-09-03 20:05:15 +0000 | [diff] [blame] | 300 | |
| 301 | CREATE TABLE aux.t1(x); |
| 302 | CREATE TEMP TRIGGER tr AFTER INSERT ON aux.t1 BEGIN SELECT 1, 2, 3; END; |
| 303 | } |
| 304 | do_execsql_test 9.5 { |
| 305 | ALTER TABLE main.t1 RENAME TO t3; |
| 306 | } |
| 307 | do_execsql_test 9.6 { |
| 308 | SELECT sql FROM sqlite_temp_master; |
| 309 | SELECT sql FROM sqlite_master WHERE type='trigger'; |
| 310 | } { |
| 311 | {CREATE TRIGGER tr AFTER INSERT ON aux.t1 BEGIN SELECT 1, 2, 3; END} |
dan | c50f75d | 2018-09-06 18:56:36 +0000 | [diff] [blame] | 312 | {CREATE TRIGGER tr AFTER INSERT ON "t3" WHEN new.a IS NULL BEGIN SELECT 1, 2, 3; END} |
dan | 65372fa | 2018-09-03 20:05:15 +0000 | [diff] [blame] | 313 | } |
| 314 | |
dan | 5921f2b | 2018-09-05 17:45:17 +0000 | [diff] [blame] | 315 | #------------------------------------------------------------------------- |
| 316 | reset_db |
| 317 | ifcapable fts5 { |
| 318 | do_execsql_test 10.0 { |
| 319 | CREATE VIRTUAL TABLE fff USING fts5(x, y, z); |
| 320 | } |
| 321 | |
| 322 | do_execsql_test 10.1 { |
| 323 | BEGIN; |
| 324 | INSERT INTO fff VALUES('a', 'b', 'c'); |
| 325 | ALTER TABLE fff RENAME TO ggg; |
| 326 | COMMIT; |
| 327 | } |
| 328 | |
| 329 | do_execsql_test 10.2 { |
| 330 | SELECT * FROM ggg; |
| 331 | } {a b c} |
| 332 | } |
| 333 | |
dan | 1d85c6b | 2018-09-06 16:01:37 +0000 | [diff] [blame] | 334 | #------------------------------------------------------------------------- |
| 335 | reset_db |
| 336 | forcedelete test.db2 |
| 337 | db func trigger trigger |
| 338 | set ::trigger [list] |
| 339 | proc trigger {args} { |
| 340 | lappend ::trigger $args |
| 341 | } |
| 342 | do_execsql_test 11.0 { |
| 343 | ATTACH 'test.db2' AS aux; |
| 344 | CREATE TABLE aux.t1(a, b, c); |
| 345 | CREATE TABLE main.t1(a, b, c); |
| 346 | CREATE TEMP TRIGGER tr AFTER INSERT ON aux.t1 BEGIN |
| 347 | SELECT trigger(new.a, new.b, new.c); |
| 348 | END; |
| 349 | } |
dan | c9461ec | 2018-08-29 21:00:16 +0000 | [diff] [blame] | 350 | |
dan | 1d85c6b | 2018-09-06 16:01:37 +0000 | [diff] [blame] | 351 | do_execsql_test 11.1 { |
| 352 | INSERT INTO main.t1 VALUES(1, 2, 3); |
| 353 | INSERT INTO aux.t1 VALUES(4, 5, 6); |
| 354 | } |
| 355 | do_test 11.2 { set ::trigger } {{4 5 6}} |
| 356 | |
| 357 | do_execsql_test 11.3 { |
| 358 | SELECT name, tbl_name FROM sqlite_temp_master; |
| 359 | } {tr t1} |
| 360 | |
| 361 | do_execsql_test 11.4 { |
| 362 | ALTER TABLE main.t1 RENAME TO t2; |
| 363 | SELECT name, tbl_name FROM sqlite_temp_master; |
| 364 | } {tr t1} |
| 365 | |
| 366 | do_execsql_test 11.5 { |
| 367 | ALTER TABLE aux.t1 RENAME TO t2; |
| 368 | SELECT name, tbl_name FROM sqlite_temp_master; |
| 369 | } {tr t2} |
| 370 | |
| 371 | do_execsql_test 11.6 { |
| 372 | INSERT INTO aux.t2 VALUES(7, 8, 9); |
| 373 | } |
| 374 | do_test 11.7 { set ::trigger } {{4 5 6} {7 8 9}} |
| 375 | |
dan | d5e6fef | 2018-09-07 15:50:31 +0000 | [diff] [blame] | 376 | #------------------------------------------------------------------------- |
| 377 | reset_db |
| 378 | do_execsql_test 12.0 { |
| 379 | CREATE TABLE t1(a); |
| 380 | CREATE TABLE t2(w); |
| 381 | CREATE TRIGGER temp.r1 AFTER INSERT ON main.t2 BEGIN |
| 382 | INSERT INTO t1(a) VALUES(new.w); |
| 383 | END; |
| 384 | CREATE TEMP TABLE t2(x); |
| 385 | } |
| 386 | |
| 387 | do_execsql_test 12.1 { |
| 388 | ALTER TABLE main.t2 RENAME TO t3; |
| 389 | } |
| 390 | |
| 391 | do_execsql_test 12.2 { |
| 392 | INSERT INTO t3 VALUES('WWW'); |
| 393 | SELECT * FROM t1; |
| 394 | } {WWW} |
| 395 | |
dan | b280212 | 2018-09-07 18:56:31 +0000 | [diff] [blame] | 396 | |
| 397 | #------------------------------------------------------------------------- |
| 398 | reset_db |
| 399 | do_execsql_test 13.0 { |
| 400 | CREATE TABLE t1(x, y); |
| 401 | CREATE TABLE t2(a, b); |
| 402 | CREATE TABLE log(c); |
| 403 | CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN |
| 404 | INSERT INTO log SELECT y FROM t1, t2; |
| 405 | END; |
| 406 | } |
| 407 | |
| 408 | do_execsql_test 13.1 { |
| 409 | INSERT INTO t1 VALUES(1, 2); |
| 410 | } |
| 411 | |
| 412 | do_catchsql_test 13.2 { |
| 413 | ALTER TABLE t2 RENAME b TO y; |
| 414 | } {1 {error in trigger tr1 after rename: ambiguous column name: y}} |
| 415 | |
dan | 0208337 | 2018-09-17 08:27:23 +0000 | [diff] [blame] | 416 | #------------------------------------------------------------------------- |
| 417 | reset_db |
| 418 | |
| 419 | ifcapable rtree { |
| 420 | do_execsql_test 14.0 { |
| 421 | CREATE VIRTUAL TABLE rt USING rtree(id, minx, maxx, miny, maxy); |
| 422 | |
| 423 | CREATE TABLE "mytable" ( "fid" INTEGER PRIMARY KEY, "geom" BLOB); |
| 424 | |
| 425 | CREATE TRIGGER tr1 AFTER UPDATE OF "geom" ON "mytable" |
| 426 | WHEN OLD."fid" = NEW."fid" AND NEW."geom" IS NULL BEGIN |
| 427 | DELETE FROM rt WHERE id = OLD."fid"; |
| 428 | END; |
| 429 | |
| 430 | INSERT INTO mytable VALUES(1, X'abcd'); |
| 431 | } |
| 432 | |
| 433 | do_execsql_test 14.1 { |
| 434 | UPDATE mytable SET geom = X'1234' |
| 435 | } |
| 436 | |
| 437 | do_execsql_test 14.2 { |
| 438 | ALTER TABLE mytable RENAME TO mytable_renamed; |
| 439 | } |
| 440 | |
| 441 | do_execsql_test 14.3 { |
| 442 | CREATE TRIGGER tr2 AFTER INSERT ON mytable_renamed BEGIN |
| 443 | DELETE FROM rt WHERE id=(SELECT min(id) FROM rt); |
| 444 | END; |
| 445 | } |
| 446 | |
| 447 | do_execsql_test 14.4 { |
| 448 | ALTER TABLE mytable_renamed RENAME TO mytable2; |
| 449 | } |
| 450 | } |
| 451 | |
| 452 | reset_db |
| 453 | do_execsql_test 14.5 { |
| 454 | CREATE TABLE t1(a, b, c); |
| 455 | CREATE VIEW v1 AS SELECT * FROM t1; |
| 456 | CREATE TRIGGER xyz AFTER INSERT ON t1 BEGIN |
| 457 | SELECT a, b FROM v1; |
| 458 | END; |
| 459 | } |
| 460 | do_execsql_test 14.6 { |
| 461 | ALTER TABLE t1 RENAME TO tt1; |
| 462 | } |
| 463 | |
dan | 5351e88 | 2018-10-01 07:04:12 +0000 | [diff] [blame] | 464 | #------------------------------------------------------------------------- |
| 465 | reset_db |
| 466 | do_execsql_test 15.0 { |
| 467 | CREATE TABLE t1(a integer NOT NULL PRIMARY KEY); |
| 468 | CREATE VIEW v1 AS SELECT a FROM t1; |
| 469 | CREATE TRIGGER tr1 INSTEAD OF INSERT ON v1 BEGIN |
| 470 | UPDATE t1 SET a = NEW.a; |
| 471 | END; |
| 472 | CREATE TRIGGER tr2 INSTEAD OF INSERT ON v1 BEGIN |
| 473 | SELECT new.a; |
| 474 | END; |
| 475 | CREATE TABLE t2 (b); |
| 476 | } |
| 477 | |
| 478 | do_execsql_test 15.1 { |
| 479 | INSERT INTO v1 VALUES(1); |
| 480 | ALTER TABLE t2 RENAME TO t3; |
| 481 | } |
| 482 | |
| 483 | do_execsql_test 15.2 { |
| 484 | CREATE TABLE x(f1 integer NOT NULL); |
| 485 | CREATE VIEW y AS SELECT f1 AS f1 FROM x; |
| 486 | CREATE TRIGGER t INSTEAD OF UPDATE OF f1 ON y BEGIN |
| 487 | UPDATE x SET f1 = NEW.f1; |
| 488 | END; |
| 489 | CREATE TABLE z (f1 integer NOT NULL PRIMARY KEY); |
| 490 | ALTER TABLE z RENAME TO z2; |
| 491 | } |
| 492 | |
| 493 | do_execsql_test 15.3 { |
| 494 | INSERT INTO x VALUES(1), (2), (3); |
| 495 | ALTER TABLE x RENAME f1 TO f2; |
| 496 | SELECT * FROM x; |
| 497 | } {1 2 3} |
| 498 | |
| 499 | do_execsql_test 15.4 { |
| 500 | UPDATE y SET f1 = 'x' WHERE f1 = 1; |
| 501 | SELECT * FROM x; |
| 502 | } {x x x} |
| 503 | |
| 504 | do_execsql_test 15.5 { |
| 505 | SELECT sql FROM sqlite_master WHERE name = 'y'; |
| 506 | } {{CREATE VIEW y AS SELECT f2 AS f1 FROM x}} |
dan | 0208337 | 2018-09-17 08:27:23 +0000 | [diff] [blame] | 507 | |
dan | 397a78d | 2018-12-18 20:31:14 +0000 | [diff] [blame] | 508 | #------------------------------------------------------------------------- |
| 509 | # Test that it is not possible to rename a shadow table in DEFENSIVE mode. |
| 510 | # |
| 511 | ifcapable fts3 { |
| 512 | proc vtab_command {method args} { |
| 513 | switch -- $method { |
| 514 | xConnect { |
| 515 | if {[info exists ::vtab_connect_sql]} { |
| 516 | execsql $::vtab_connect_sql |
| 517 | } |
| 518 | return "CREATE TABLE t1(a, b, c)" |
| 519 | } |
| 520 | |
| 521 | xBestIndex { |
| 522 | set clist [lindex $args 0] |
| 523 | if {[llength $clist]!=1} { error "unexpected constraint list" } |
| 524 | catch { array unset C } |
| 525 | array set C [lindex $clist 0] |
| 526 | if {$C(usable)} { |
| 527 | return "omit 0 cost 0 rows 1 idxnum 555 idxstr eq!" |
| 528 | } else { |
| 529 | return "cost 1000000 rows 0 idxnum 0 idxstr scan..." |
| 530 | } |
| 531 | } |
| 532 | } |
| 533 | |
| 534 | return {} |
| 535 | } |
| 536 | |
| 537 | register_tcl_module db |
| 538 | |
| 539 | sqlite3_db_config db DEFENSIVE 1 |
| 540 | |
| 541 | do_execsql_test 16.0 { |
| 542 | CREATE VIRTUAL TABLE y1 USING fts3; |
| 543 | } |
| 544 | |
drh | d0c51d1 | 2019-11-16 12:04:38 +0000 | [diff] [blame] | 545 | do_catchsql_test 16.10 { |
dan | 397a78d | 2018-12-18 20:31:14 +0000 | [diff] [blame] | 546 | INSERT INTO y1_segments VALUES(1, X'1234567890'); |
| 547 | } {1 {table y1_segments may not be modified}} |
| 548 | |
drh | d0c51d1 | 2019-11-16 12:04:38 +0000 | [diff] [blame] | 549 | do_catchsql_test 16.20 { |
drh | d0c51d1 | 2019-11-16 12:04:38 +0000 | [diff] [blame] | 550 | DROP TABLE y1_segments; |
| 551 | } {1 {table y1_segments may not be dropped}} |
| 552 | |
drh | 527cbd4 | 2019-11-16 14:15:19 +0000 | [diff] [blame] | 553 | do_catchsql_test 16.20 { |
| 554 | ALTER TABLE y1_segments RENAME TO abc; |
| 555 | } {1 {table y1_segments may not be altered}} |
| 556 | sqlite3_db_config db DEFENSIVE 0 |
| 557 | do_catchsql_test 16.22 { |
| 558 | ALTER TABLE y1_segments RENAME TO abc; |
| 559 | } {0 {}} |
| 560 | sqlite3_db_config db DEFENSIVE 1 |
| 561 | do_catchsql_test 16.23 { |
| 562 | CREATE TABLE y1_segments AS SELECT * FROM abc; |
| 563 | } {1 {object name reserved for internal use: y1_segments}} |
| 564 | do_catchsql_test 16.24 { |
| 565 | CREATE VIEW y1_segments AS SELECT * FROM abc; |
| 566 | } {1 {object name reserved for internal use: y1_segments}} |
| 567 | sqlite3_db_config db DEFENSIVE 0 |
| 568 | do_catchsql_test 16.25 { |
| 569 | ALTER TABLE abc RENAME TO y1_segments; |
| 570 | } {0 {}} |
| 571 | sqlite3_db_config db DEFENSIVE 1 |
| 572 | |
drh | d0c51d1 | 2019-11-16 12:04:38 +0000 | [diff] [blame] | 573 | do_execsql_test 16.30 { |
dan | 397a78d | 2018-12-18 20:31:14 +0000 | [diff] [blame] | 574 | ALTER TABLE y1 RENAME TO z1; |
| 575 | } |
| 576 | |
drh | d0c51d1 | 2019-11-16 12:04:38 +0000 | [diff] [blame] | 577 | do_execsql_test 16.40 { |
dan | 397a78d | 2018-12-18 20:31:14 +0000 | [diff] [blame] | 578 | SELECT * FROM z1_segments; |
| 579 | } |
| 580 | } |
dan | 0208337 | 2018-09-17 08:27:23 +0000 | [diff] [blame] | 581 | |
dan | 65455fc | 2019-04-19 16:34:22 +0000 | [diff] [blame] | 582 | #------------------------------------------------------------------------- |
| 583 | reset_db |
| 584 | do_execsql_test 17.0 { |
| 585 | CREATE TABLE sqlite1234 (id integer); |
| 586 | ALTER TABLE sqlite1234 RENAME TO User; |
| 587 | SELECT name, sql FROM sqlite_master WHERE sql IS NOT NULL; |
| 588 | } { |
| 589 | User {CREATE TABLE "User" (id integer)} |
| 590 | } |
| 591 | |
dan | f9b0c45 | 2019-05-06 16:15:28 +0000 | [diff] [blame] | 592 | #------------------------------------------------------------------------- |
| 593 | reset_db |
| 594 | do_execsql_test 18.1.0 { |
| 595 | CREATE TABLE t0 (c0 INTEGER, PRIMARY KEY(c0)) WITHOUT ROWID; |
| 596 | } |
dan | f9b0c45 | 2019-05-06 16:15:28 +0000 | [diff] [blame] | 597 | do_execsql_test 18.1.1 { |
| 598 | ALTER TABLE t0 RENAME COLUMN c0 TO c1; |
| 599 | } |
| 600 | do_execsql_test 18.1.2 { |
| 601 | SELECT sql FROM sqlite_master; |
| 602 | } {{CREATE TABLE t0 (c1 INTEGER, PRIMARY KEY(c1)) WITHOUT ROWID}} |
| 603 | |
| 604 | reset_db |
| 605 | do_execsql_test 18.2.0 { |
| 606 | CREATE TABLE t0 (c0 INTEGER, PRIMARY KEY(c0)); |
| 607 | } |
| 608 | do_execsql_test 18.2.1 { |
| 609 | ALTER TABLE t0 RENAME COLUMN c0 TO c1; |
| 610 | } |
| 611 | do_execsql_test 18.2.2 { |
| 612 | SELECT sql FROM sqlite_master; |
| 613 | } {{CREATE TABLE t0 (c1 INTEGER, PRIMARY KEY(c1))}} |
| 614 | |
drh | 0990c41 | 2020-02-23 17:34:45 +0000 | [diff] [blame] | 615 | # 2020-02-23 ticket f50af3e8a565776b |
| 616 | reset_db |
| 617 | do_execsql_test 19.100 { |
| 618 | CREATE TABLE t1(x); |
| 619 | CREATE VIEW t2 AS SELECT 1 FROM t1, (t1 AS a0, t1); |
| 620 | ALTER TABLE t1 RENAME TO t3; |
| 621 | SELECT sql FROM sqlite_master; |
| 622 | } {{CREATE TABLE "t3"(x)} {CREATE VIEW t2 AS SELECT 1 FROM "t3", ("t3" AS a0, "t3")}} |
| 623 | do_execsql_test 19.110 { |
| 624 | INSERT INTO t3(x) VALUES(123); |
| 625 | SELECT * FROM t2; |
| 626 | } {1} |
| 627 | do_execsql_test 19.120 { |
| 628 | INSERT INTO t3(x) VALUES('xyz'); |
| 629 | SELECT * FROM t2; |
| 630 | } {1 1 1 1 1 1 1 1} |
| 631 | |
dan | fb99e38 | 2020-04-03 11:20:40 +0000 | [diff] [blame] | 632 | # Ticket 4722bdab08cb14 |
| 633 | reset_db |
| 634 | do_execsql_test 20.0 { |
| 635 | CREATE TABLE a(a); |
| 636 | CREATE VIEW b AS SELECT(SELECT *FROM c JOIN a USING(d, a, a, a) JOIN a) IN(); |
| 637 | } |
dan | fb99e38 | 2020-04-03 11:20:40 +0000 | [diff] [blame] | 638 | do_execsql_test 20.1 { |
| 639 | ALTER TABLE a RENAME a TO e; |
| 640 | } {} |
| 641 | |
dan | 4db7ab5 | 2020-04-03 11:52:59 +0000 | [diff] [blame] | 642 | reset_db |
| 643 | do_execsql_test 21.0 { |
| 644 | CREATE TABLE a(b); |
| 645 | CREATE VIEW c AS |
| 646 | SELECT NULL INTERSECT |
| 647 | SELECT NULL ORDER BY |
| 648 | likelihood(NULL, (d, (SELECT c))); |
| 649 | } {} |
| 650 | do_catchsql_test 21.1 { |
| 651 | SELECT likelihood(NULL, (d, (SELECT c))); |
| 652 | } {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}} |
| 653 | do_catchsql_test 21.2 { |
| 654 | SELECT * FROM c; |
| 655 | } {1 {1st ORDER BY term does not match any column in the result set}} |
| 656 | |
| 657 | do_catchsql_test 21.3 { |
| 658 | ALTER TABLE a RENAME TO e; |
| 659 | } {1 {error in view c: 1st ORDER BY term does not match any column in the result set}} |
| 660 | |
drh | e3863b5 | 2020-07-01 16:19:14 +0000 | [diff] [blame] | 661 | # After forum thread https://sqlite.org/forum/forumpost/ddbe1c7efa |
| 662 | # Ensure that PRAGMA schema_version=N causes a full schema reload. |
| 663 | # |
| 664 | reset_db |
| 665 | do_execsql_test 22.0 { |
| 666 | CREATE TABLE t1(a INT, b TEXT NOT NULL); |
| 667 | INSERT INTO t1 VALUES(1,2),('a','b'); |
| 668 | BEGIN; |
| 669 | PRAGMA writable_schema=ON; |
| 670 | UPDATE sqlite_schema SET sql='CREATE TABLE t1(a INT, b TEXT)' WHERE name LIKE 't1'; |
| 671 | PRAGMA schema_version=1234; |
| 672 | COMMIT; |
| 673 | PRAGMA integrity_check; |
| 674 | } {ok} |
| 675 | do_execsql_test 22.1 { |
| 676 | ALTER TABLE t1 ADD COLUMN c INT DEFAULT 78; |
| 677 | SELECT * FROM t1; |
| 678 | } {1 2 78 a b 78} |
dan | 4db7ab5 | 2020-04-03 11:52:59 +0000 | [diff] [blame] | 679 | |
dan | 936a305 | 2020-10-12 15:27:50 +0000 | [diff] [blame] | 680 | #------------------------------------------------------------------------- |
| 681 | reset_db |
| 682 | db collate compare64 compare64 |
| 683 | |
| 684 | do_execsql_test 23.1 { |
| 685 | CREATE TABLE gigo(a text); |
| 686 | CREATE TABLE idx(x text COLLATE compare64); |
| 687 | CREATE VIEW v1 AS SELECT * FROM idx WHERE x='abc'; |
| 688 | } |
| 689 | db close |
| 690 | sqlite3 db test.db |
| 691 | |
| 692 | do_execsql_test 23.2 { |
| 693 | alter table gigo rename to ggiiggoo; |
| 694 | alter table idx rename to idx2; |
| 695 | } |
| 696 | |
| 697 | do_execsql_test 23.3 { |
| 698 | SELECT sql FROM sqlite_master; |
| 699 | } { |
| 700 | {CREATE TABLE "ggiiggoo"(a text)} |
| 701 | {CREATE TABLE "idx2"(x text COLLATE compare64)} |
| 702 | {CREATE VIEW v1 AS SELECT * FROM "idx2" WHERE x='abc'} |
| 703 | } |
| 704 | |
| 705 | do_execsql_test 23.4 { |
| 706 | ALTER TABLE idx2 RENAME x TO y; |
| 707 | SELECT sql FROM sqlite_master; |
| 708 | } { |
| 709 | {CREATE TABLE "ggiiggoo"(a text)} |
| 710 | {CREATE TABLE "idx2"(y text COLLATE compare64)} |
| 711 | {CREATE VIEW v1 AS SELECT * FROM "idx2" WHERE y='abc'} |
| 712 | } |
| 713 | |
dan | 1d85c6b | 2018-09-06 16:01:37 +0000 | [diff] [blame] | 714 | finish_test |
dan | 936a305 | 2020-10-12 15:27:50 +0000 | [diff] [blame] | 715 | |