github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/corruptN.test (about)

     1  # 2020-12-16
     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  
    14  set testdir [file dirname $argv0]
    15  source $testdir/tester.tcl
    16  set testprefix corruptN
    17  
    18  # These tests deal with corrupt database files
    19  #
    20  database_may_be_corrupt
    21  
    22  reset_db
    23  do_test 1.0 {
    24    sqlite3 db {}
    25    db deserialize [decode_hexdb {
    26  .open --hexdb
    27  | size 4096 pagesize 512 filename sql024239.txt.db
    28  | page 1 offset 0
    29  |      0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00   SQLite format 3.
    30  |     16: 02 00 01 01 00 40 20 20 00 00 00 0c 00 00 00 07   .....@  ........
    31  |     32: 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 04   ................
    32  |     48: 00 00 00 00 89 00 00 04 00 10 00 01 0a 00 00 01   ................
    33  |     80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0c   ................
    34  |     96: 00 2e 2c 50 0d 00 00 00 06 01 06 00 01 da 01 b0   ..,P............
    35  |    112: 01 56 01 86 01 2a 01 06 00 00 00 00 00 00 00 00   .V...*..........
    36  |    256: 00 00 00 00 00 00 22 07 06 17 11 11 01 31 74 61   .............1ta
    37  |    272: 62 6c 65 74 34 74 34 07 43 52 45 41 54 45 20 54   blet4t4.CREATE T
    38  |    288: 41 42 4c 45 20 74 34 28 78 29 2a 06 06 17 13 11   ABLE t4(x)*.....
    39  |    304: 01 3f 69 6e 64 65 78 74 33 78 74 33 05 43 52 45   .?indext3xt3.CRE
    40  |    320: 41 54 45 20 49 4e 44 45 58 20 74 33 78 20 4f 4e   ATE INDEX t3x ON
    41  |    336: 20 74 33 28 78 29 2e 04 06 17 15 11 01 45 69 6e    t3(x).......Ein
    42  |    352: 64 65 78 74 32 63 64 74 32 05 43 52 45 41 54 45   dext2cdt2.CREATE
    43  |    368: 20 49 4e 44 45 58 20 74 32 63 64 20 4f 4e 20 74    INDEX t2cd ON t
    44  |    384: 32 28 63 2c 64 29 28 05 06 17 11 11 01 3d 74 61   2(c,d)(......=ta
    45  |    400: 62 6c 65 74 33 74 33 07 43 52 45 41 54 45 20 54   blet3t3.CREATE T
    46  |    416: 41 42 4c 45 20 74 33 28 63 2c 78 2c 65 2c 66 29   ABLE t3(c,x,e,f)
    47  |    432: 28 02 06 17 11 11 01 3d 74 61 62 6c 65 74 32 74   (......=tablet2t
    48  |    448: 32 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   2.CREATE TABLE t
    49  |    464: 32 28 63 2c 64 2c 65 2c 66 29 24 01 06 17 11 11   2(c,d,e,f)$.....
    50  |    480: 01 35 74 61 62 6c 65 74 31 74 31 02 43 52 45 41   .5tablet1t1.CREA
    51  |    496: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 29   TE TABLE t1(a,b)
    52  | page 2 offset 512
    53  |      0: 0d 00 00 00 04 01 41 00 01 fa 01 f3 01 de 01 cf   ......A.........
    54  |    160: 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00   .. .............
    55  |    448: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d   ................
    56  |    464: 04 03 17 17 73 65 76 65 6e 65 69 67 68 74 13 03   ....seveneight..
    57  |    480: 03 07 07 40 14 00 00 00 00 00 00 40 18 00 00 00   ...@.......@....
    58  |    496: 00 00 00 05 02 03 01 01 03 04 04 01 03 09 01 02   ................
    59  | page 3 offset 1024
    60  |      0: 0d 00 00 00 08 01 54 00 01 f7 01 ec 01 c5 01 aa   ......T.........
    61  |     16: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
    62  |    112: 00 00 dd 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
    63  |    336: 00 00 00 00 19 08 05 17 17 17 17 65 69 67 68 74   ...........eight
    64  |    352: 65 69 67 68 74 73 65 76 65 6e 73 65 76 65 6e 25   eightsevenseven%
    65  |    368: 07 05 07 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
    66  |    432: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08   ................
    67  |    480: 00 00 0f 04 17 17 01 65 69 67 68 74 65 69 67 68   .......eighteigh
    68  |    496: 74 08 15 04 07 07 01 40 18 00 00 00 00 00 00 40   t......@.......@
    69  | page 4 offset 1536
    70  |      0: 18 00 00 00 00 00 00 07 07 04 01 01 01 04 04 06   ................
    71  |     16: 07 04 01 01 01 02 02 05 0f 04 17 17 01 73 6d 76   .............smv
    72  |     32: 65 6e 65 69 67 68 74 04 15 04 07 07 01 40 14 00   eneight......@..
    73  | page 5 offset 2048
    74  |      0: 0a 00 00 00 08 01 96 00 01 fa 01 c4 01 f2 01 bc   ................
    75  |     16: 01 dc 01 e1 01 96 01 cc 00 00 00 00 00 00 00 00   ................
    76  |    160: 00 00 00 00 00 00 32 00 00 00 00 00 00 00 00 00   ......2.........
    77  |    368: 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00   ................
    78  |    400: 00 00 00 00 00 00 0f 04 17 17 01 85 69 67 68 74   ............ight
    79  |    416: 65 69 67 68 74 08 15 04 07 07 01 40 18 00 00 00   eight......@....
    80  |    432: 00 00 00 40 18 00 00 00 00 00 00 07 07 04 01 01   ...@............
    81  |    448: 01 04 04 06 07 04 01 01 01 02 02 05 0f 04 17 17   ................
    82  |    464: 01 73 6d 76 65 6e 65 69 67 68 74 04 15 04 07 07   .smveneight.....
    83  |    480: 01 40 14 00 00 00 00 00 00 40 18 00 00 00 00 00   .@.......@......
    84  |    496: 00 03 07 04 01 01 01 03 04 02 05 04 03 01 09 02   ................
    85  | page 6 offset 2560
    86  |      0: 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
    87  |     16: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00   ................
    88  |    304: 00 00 00 26 00 00 00 00 00 00 00 00 00 00 00 00   ...&............
    89  | page 7 offset 3072
    90  |      0: 0d 00 00 00 08 01 c2 00 01 fb 01 f6 01 f1 01 ec   ................
    91  |     16: 01 e0 01 d4 01 cb 01 c2 00 00 00 00 00 00 00 00   ................
    92  |    128: 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 04   ............. ..
    93  |    384: 00 00 00 00 00 00 00 00 00 07 08 02 17 65 69 fc   .............ei.
    94  |    400: 68 74 07 07 02 17 65 69 67 68 74 0a fb fd f8 bf   ht....eight.....
    95  |    416: e7 ff ff ff 00 00 00 0a 05 02 07 40 18 00 00 00   ...........@....
    96  |    432: 00 00 00 03 04 02 01 04 03 03 02 01 04 03 02 01   ................
    97  |    448: ff ff ff ff ff ff 00 00 00 00 00 00 00 00 00 00   ................
    98  | end sql024239.txt.db
    99  }]} {}
   100  
   101  do_catchsql_test 1.1 {
   102    VACUUM;
   103  } {1 {database disk image is malformed}}
   104  
   105  # 2021-04-05 dbsqlfuzz b92b72e4de80b5140c30ab71372ca719b8feb618
   106  do_test 2.0 {
   107    sqlite3 db {}
   108    db deserialize [decode_hexdb {
   109  | size 16384 pagesize 4096 filename c-b92b.txt.db
   110  | page 1 offset 0
   111  |      0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00   SQLite format 3.
   112  |     16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 04   .....@  ........
   113  |     32: 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 04   ................
   114  |     48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00   ................
   115  |     96: 00 00 00 00 0d 0f f8 00 04 0f 12 00 0f 91 0f d3   ................
   116  |    112: 0f 67 0f 12 00 00 00 00 00 00 00 00 00 00 00 00   .g..............
   117  |   3856: 00 00 53 04 07 1b 13 11 08 81 0d 74 72 69 67 67   ..S........trigg
   118  |   3872: 65 72 74 72 30 74 31 43 52 45 41 54 45 20 54 52   ertr0t1CREATE TR
   119  |   3888: 49 47 47 45 52 20 74 72 30 20 44 45 4c 45 54 45   IGGER tr0 DELETE
   120  |   3904: 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 55    ON t1 BEGIN.  U
   121  |   3920: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d   PDATE t1 SET b =
   122  |   3936: 20 61 3b 0a 45 4e 44 28 03 06 17 11 11 01 3d 69    a;.END(......=i
   123  |   3952: 6e 64 65 78 69 30 74 31 04 43 52 45 41 54 45 20   ndexi0t1.CREATE 
   124  |   3968: 49 4e 44 45 58 20 69 30 20 4f 4e 20 74 31 28 62   INDEX i0 ON t1(b
   125  |   3984: 29 40 01 06 17 11 11 01 6d 74 61 62 6c 65 74 31   )@......mtablet1
   126  |   4000: 74 31 02 43 52 45 41 54 45 20 54 41 42 4c 45 20   t1.CREATE TABLE 
   127  |   4016: 74 31 28 61 20 55 4e 49 51 55 45 20 4f 4e 20 43   t1(a UNIQUE ON C
   128  |   4032: 4f 4e 46 4c 49 43 54 20 52 45 50 4c 41 43 45 2c   ONFLICT REPLACE,
   129  |   4048: 20 62 29 23 02 06 17 37 11 01 00 69 6e 64 65 78    b)#...7...index
   130  |   4064: 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78   sqlite_autoindex
   131  |   4080: 5f 74 31 5f 31 74 31 03 00 00 00 08 00 00 00 00   _t1_1t1.........
   132  | page 2 offset 4096
   133  |      0: 0d 00 00 00 02 0f 00 00 00 00 00 00 00 00 00 00   ................
   134  |   4080: 00 00 05 02 03 01 01 09 0d 05 01 03 01 01 04 0c   ................
   135  | page 3 offset 8192
   136  |      0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00   ................
   137  |   4080: 00 00 00 00 00 05 03 01 01 09 02 04 03 01 09 04   ................
   138  | page 4 offset 12288
   139  |      0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00   ................
   140  |   4080: 00 00 00 00 00 05 03 01 01 0d 02 04 03 00 00 00   ................
   141  | end c-b92b.txt.db
   142  }]} {}
   143  
   144  prng_seed 0 db
   145  do_catchsql_test 2.1 {
   146  SELECT count(*) FROM sqlite_schema;
   147  WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<1000)
   148  INSERT INTO t1(a) SELECT randomblob(null) FROM c;
   149  } {1 {database disk image is malformed}}
   150  
   151  reset_db
   152  if {![info exists ::G(perm:presql)]} {
   153    do_execsql_test 3.0 {
   154      CREATE TABLE t1(x INTEGER PRIMARY KEY AUTOINCREMENT, y);
   155      PRAGMA writable_schema = 1;
   156      UPDATE sqlite_schema 
   157        SET sql = 'CREATE TABLE sqlite_sequence(name-seq)' 
   158        WHERE name = 'sqlite_sequence';
   159    }
   160    db close
   161    sqlite3 db test.db
   162    do_catchsql_test 3.1 {
   163      PRAGMA writable_schema = 1;
   164      INSERT INTO t1(y) VALUES('abc');
   165    } {1 {database disk image is malformed}}
   166    reset_db
   167  
   168    do_execsql_test 4.1 {
   169      CREATE TABLE x1(a INTEGER PRIMARY KEY, b UNIQUE, c UNIQUE);
   170      INSERT INTO x1 VALUES(1, 1, 2);
   171      INSERT INTO x1 VALUES(2, 2, 3);
   172      INSERT INTO x1 VALUES(3, 3, 4);
   173      INSERT INTO x1 VALUES(4, 5, 6);
   174      PRAGMA writable_schema = 1;
   175  
   176      UPDATE sqlite_schema SET rootpage = (
   177        SELECT rootpage FROM sqlite_schema WHERE name = 'sqlite_autoindex_x1_2'
   178      ) WHERE name = 'sqlite_autoindex_x1_1';
   179    }
   180  
   181    db close
   182    sqlite3 db test.db
   183    breakpoint
   184    do_catchsql_test 4.2 {
   185      PRAGMA writable_schema = 1;
   186      REPLACE INTO x1 VALUES(5, 2, 3);
   187    } {1 {database disk image is malformed}}
   188  
   189  }
   190  
   191  #-------------------------------------------------------------------------
   192  
   193  reset_db
   194  
   195  ifcapable json1&&vtab {
   196    db func strreplace strreplace
   197    proc strreplace {orig a b} {
   198      string map [list $a $b] $orig
   199    }
   200  
   201    do_execsql_test 5.0 {
   202      CREATE TABLE t1(a, b);
   203      CREATE INDEX t1a ON t1(a);
   204      CREATE INDEX t1b ON t1(b);
   205  
   206      PRAGMA writable_schema = 1;
   207      UPDATE sqlite_schema 
   208        SET sql = strreplace(sql, 't1', 'json_each') 
   209        WHERE type='index';
   210    }
   211  
   212    # Do not run this tests if there is any presql (SQL run from within
   213    # the [sqlite3] command) configured. In this case the schema is parsed
   214    # before the "PRAGMA writable_schema" command is executed and the 
   215    # script throws and exception.
   216    if {[info exists ::G(perm:presql)]==0 || $::G(perm:presql)==""} {
   217      db close
   218      sqlite3 db test.db
   219  
   220      do_execsql_test 5.1 {
   221        PRAGMA writable_schema = 1;
   222        SELECT * FROM t1
   223      }
   224    }
   225  }; # ifcapable json1&&vtab
   226  
   227  
   228  finish_test