Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix a problem with ALTER TABLE commands when the schema features an INSTEAD of trigger that uses NEW.* or OLD.*. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
c52f457e56eb9d573eb67093731eb231 |
User & Date: | dan 2018-10-01 07:04:12.490 |
Context
2018-10-01
| ||
13:54 | Fix a potential crash that can occur while reading an index from a corrupt database file. The corruption is a record-header-size that is larger than 0x7fffffff. Problem detected by OSSFuzz against GDAL and reported to us (with a suggested fix) by Even Rouault. The test case is in TH3. (check-in: 8ac2cdda68 user: drh tags: trunk) | |
07:04 | Fix a problem with ALTER TABLE commands when the schema features an INSTEAD of trigger that uses NEW.* or OLD.*. (check-in: c52f457e56 user: dan tags: trunk) | |
2018-09-28
| ||
23:53 | Fix test cases so that they work with ICU. (check-in: d04b2013b5 user: drh tags: trunk) | |
Changes
Changes to src/alter.c.
︙ | ︙ | |||
1057 1058 1059 1060 1061 1062 1063 | memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; assert( pNew->pTabSchema ); pParse->pTriggerTab = sqlite3FindTable(db, pNew->table, db->aDb[sqlite3SchemaToIndex(db, pNew->pTabSchema)].zDbSName ); pParse->eTriggerOp = pNew->op; | > > | > | | 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 | memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; assert( pNew->pTabSchema ); pParse->pTriggerTab = sqlite3FindTable(db, pNew->table, db->aDb[sqlite3SchemaToIndex(db, pNew->pTabSchema)].zDbSName ); pParse->eTriggerOp = pNew->op; if( pParse->pTriggerTab ){ rc = sqlite3ViewGetColumnNames(pParse, pParse->pTriggerTab); } /* Resolve symbols in WHEN clause */ if( rc==SQLITE_OK && pNew->pWhen ){ rc = sqlite3ResolveExprNames(&sNC, pNew->pWhen); } for(pStep=pNew->step_list; rc==SQLITE_OK && pStep; pStep=pStep->pNext){ if( pStep->pSelect ){ sqlite3SelectPrep(pParse, pStep->pSelect, &sNC); if( pParse->nErr ) rc = pParse->rc; |
︙ | ︙ |
Changes to test/altertab.test.
︙ | ︙ | |||
455 456 457 458 459 460 461 462 463 464 465 | SELECT a, b FROM v1; END; } do_execsql_test 14.6 { ALTER TABLE t1 RENAME TO tt1; } finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 | SELECT a, b FROM v1; END; } do_execsql_test 14.6 { ALTER TABLE t1 RENAME TO tt1; } #------------------------------------------------------------------------- reset_db do_execsql_test 15.0 { CREATE TABLE t1(a integer NOT NULL PRIMARY KEY); CREATE VIEW v1 AS SELECT a FROM t1; CREATE TRIGGER tr1 INSTEAD OF INSERT ON v1 BEGIN UPDATE t1 SET a = NEW.a; END; CREATE TRIGGER tr2 INSTEAD OF INSERT ON v1 BEGIN SELECT new.a; END; CREATE TABLE t2 (b); } do_execsql_test 15.1 { INSERT INTO v1 VALUES(1); ALTER TABLE t2 RENAME TO t3; } do_execsql_test 15.2 { CREATE TABLE x(f1 integer NOT NULL); CREATE VIEW y AS SELECT f1 AS f1 FROM x; CREATE TRIGGER t INSTEAD OF UPDATE OF f1 ON y BEGIN UPDATE x SET f1 = NEW.f1; END; CREATE TABLE z (f1 integer NOT NULL PRIMARY KEY); ALTER TABLE z RENAME TO z2; } do_execsql_test 15.3 { INSERT INTO x VALUES(1), (2), (3); ALTER TABLE x RENAME f1 TO f2; SELECT * FROM x; } {1 2 3} do_execsql_test 15.4 { UPDATE y SET f1 = 'x' WHERE f1 = 1; SELECT * FROM x; } {x x x} do_execsql_test 15.5 { SELECT sql FROM sqlite_master WHERE name = 'y'; } {{CREATE VIEW y AS SELECT f2 AS f1 FROM x}} finish_test |