SQLite

Check-in [9e393a0edf]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Update "PRAGMA integrity_check" to detect inconsistencies between a single record's header and body.
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 9e393a0edf1a578ddecc16a72fe3c54b75c2a650d507bcbc37c9724fbede1494
User & Date: dan 2017-09-05 20:16:19.056
Context
2017-09-07
09:56
Prevent a possible crash when trying to recover using a carefully corrupted \ and truncated rollback journal. (Test case in TH3) (check-in: 02828d717e user: drh tags: trunk)
2017-09-05
20:16
Update "PRAGMA integrity_check" to detect inconsistencies between a single record's header and body. (check-in: 9e393a0edf user: dan tags: trunk)
17:23
Fix a comment describing the xRowid method of the "series" virtual table. No code changes. (check-in: 868cd19600 user: dan tags: trunk)
Changes
Unified Diff Ignore Whitespace Patch
Changes to src/pragma.c.
1579
1580
1581
1582
1583
1584
1585

1586
1587
1588
1589
1590
1591
1592
          zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName,
                              pTab->aCol[j].zName);
          sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC);
          integrityCheckResultRow(v, 3);
          sqlite3VdbeJumpHere(v, jmp2);
        }
        /* Verify CHECK constraints */

        if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){
          ExprList *pCheck = sqlite3ExprListDup(db, pTab->pCheck, 0);
          if( db->mallocFailed==0 ){
            int addrCkFault = sqlite3VdbeMakeLabel(v);
            int addrCkOk = sqlite3VdbeMakeLabel(v);
            char *zErr;
            int k;







>







1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
          zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName,
                              pTab->aCol[j].zName);
          sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC);
          integrityCheckResultRow(v, 3);
          sqlite3VdbeJumpHere(v, jmp2);
        }
        /* Verify CHECK constraints */
        sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nCol-1, 3);
        if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){
          ExprList *pCheck = sqlite3ExprListDup(db, pTab->pCheck, 0);
          if( db->mallocFailed==0 ){
            int addrCkFault = sqlite3VdbeMakeLabel(v);
            int addrCkOk = sqlite3VdbeMakeLabel(v);
            char *zErr;
            int k;
Changes to test/pragma.test.
1929
1930
1931
1932
1933
1934
1935





















1936
1937
    CREATE TABLE t2(x, y INTEGER REFERENCES t1);
  }
  db2 eval {
    PRAGMA foreign_key_list(t2);
  }
} {0 0 t1 y {} {NO ACTION} {NO ACTION} NONE}






















database_never_corrupt
finish_test







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
    CREATE TABLE t2(x, y INTEGER REFERENCES t1);
  }
  db2 eval {
    PRAGMA foreign_key_list(t2);
  }
} {0 0 t1 y {} {NO ACTION} {NO ACTION} NONE}

reset_db
do_execsql_test 24.0 {
  PRAGMA page_size = 1024;
  CREATE TABLE t1(a, b, c);
  CREATE INDEX i1 ON t1(b);
  INSERT INTO t1 VALUES('a', 'b', 'c');
  PRAGMA integrity_check;
} {ok}

set r [db one {SELECT rootpage FROM sqlite_master WHERE name = 't1'}]
db close
hexio_write test.db [expr $r*1024 - 16] 000000000000000701040f0f1f616263

sqlite3 db test.db
do_catchsql_test 24.1 {
  SELECT * FROM t1;
} {1 {database disk image is malformed}}
do_catchsql_test 24.2 {
  PRAGMA integrity_check;
} {1 {database disk image is malformed}}

database_never_corrupt
finish_test