SQLite

Check-in [c52f457e56]
Login

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: c52f457e56eb9d573eb67093731eb231aaf6fd6dbdc397e6f948b82736fbe3ab
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
Unified Diff Ignore Whitespace Patch
Changes to src/alter.c.
1057
1058
1059
1060
1061
1062
1063


1064

1065
1066
1067
1068
1069
1070
1071
1072
1073
  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;




  /* Resolve symbols in WHEN clause */
  if( 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;







>
>
|
>

|







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