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

     1  # 2019-08-12
     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  # Check to ensure that the type, name, and tbl_name fields of the
    13  # sqlite_master table are validated and errors are reported if they
    14  # are inconsistent with the sql.
    15  #
    16  
    17  set testdir [file dirname $argv0]
    18  source $testdir/tester.tcl
    19  set testprefix corruptM
    20  
    21  # These tests deal with corrupt database files
    22  #
    23  database_may_be_corrupt
    24  
    25  proc open_db2_and_catchsql {sql} {
    26    set rc [catch { sqlite3 db2 test.db } msg]
    27    if {$rc} {
    28      return [list $rc $msg]
    29    }
    30    set res [catchsql $sql db2]
    31    db2 close
    32    set res
    33  }
    34  
    35  db close
    36  forcedelete test.db
    37  sqlite3 db test.db
    38  do_execsql_test corruptM-100 {
    39    CREATE TABLE t1(a,b,c);
    40    INSERT INTO t1 VALUES(111,222,333);
    41    CREATE INDEX i1 ON t1(b);
    42    CREATE VIEW v2 AS SELECT 15,22;
    43    CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN SELECT 5; END;
    44    SELECT type, name, tbl_name, '|' FROM sqlite_master;
    45  } {table t1 t1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
    46  do_execsql_test corruptM-101 {
    47    PRAGMA writable_schema=on;
    48    UPDATE sqlite_master SET tbl_name=NULL WHERE name='t1';
    49    SELECT type, name, tbl_name, '|' FROM sqlite_master;
    50  } {table t1 {} | index i1 t1 | view v2 v2 | trigger r1 t1 |}
    51  do_test corruptM-102 {
    52    open_db2_and_catchsql {
    53      PRAGMA quick_check;
    54    }
    55  } {1 {malformed database schema (t1)}}
    56  
    57  do_execsql_test corruptM-110 {
    58    UPDATE sqlite_master SET tbl_name='tx' WHERE name='t1';
    59    SELECT type, name, tbl_name, '|' FROM sqlite_master;
    60  } {table t1 tx | index i1 t1 | view v2 v2 | trigger r1 t1 |}
    61  do_test corruptM-111 {
    62    open_db2_and_catchsql {
    63      PRAGMA quick_check;
    64    }
    65  } {1 {malformed database schema (t1)}}
    66  do_execsql_test corruptM-112 {
    67    UPDATE sqlite_master SET tbl_name='t1', type='tabl' WHERE name='t1';
    68    SELECT type, name, tbl_name, '|' FROM sqlite_master;
    69  } {tabl t1 t1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
    70  do_test corruptM-113 {
    71    open_db2_and_catchsql {
    72      PRAGMA quick_check;
    73    }
    74  } {1 {malformed database schema (t1)}}
    75  do_execsql_test corruptM-114 {
    76    UPDATE sqlite_master SET tbl_name='t9',type='table',name='t9'WHERE name='t1';
    77    SELECT type, name, tbl_name, '|' FROM sqlite_master;
    78  } {table t9 t9 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
    79  do_test corruptM-114 {
    80    open_db2_and_catchsql {
    81      PRAGMA quick_check;
    82    }
    83  } {1 {malformed database schema (t9)}}
    84  
    85  do_execsql_test corruptM-120 {
    86    UPDATE sqlite_master SET name='t1',tbl_name='T1' WHERE name='t9';
    87    SELECT type, name, tbl_name, '|' FROM sqlite_master;
    88  } {table t1 T1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
    89  do_test corruptM-121 {
    90    open_db2_and_catchsql {
    91      PRAGMA quick_check;
    92      SELECT * FROM t1, v2;
    93    } 
    94  } {0 {ok 111 222 333 15 22}}
    95  
    96  do_execsql_test corruptM-130 {
    97    UPDATE sqlite_master SET type='view' WHERE name='t1';
    98    SELECT type, name, tbl_name, '|' FROM sqlite_master;
    99  } {view t1 T1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
   100  do_test corruptM-131 {
   101    open_db2_and_catchsql {
   102      PRAGMA quick_check;
   103      SELECT * FROM t1, v2;
   104    }
   105  } {1 {malformed database schema (t1)}}
   106  
   107  do_execsql_test corruptM-140 {
   108    UPDATE sqlite_master SET type='table', tbl_name='t1' WHERE name='t1';
   109    UPDATE sqlite_master SET tbl_name='tx' WHERE name='i1';
   110    SELECT type, name, tbl_name, '|' FROM sqlite_master;
   111  } {table t1 t1 | index i1 tx | view v2 v2 | trigger r1 t1 |}
   112  do_test corruptM-141 {
   113    open_db2_and_catchsql {
   114      PRAGMA quick_check;
   115      SELECT * FROM t1, v2;
   116    }
   117  } {1 {malformed database schema (i1)}}
   118  
   119  do_execsql_test corruptM-150 {
   120    UPDATE sqlite_master SET type='table', tbl_name='t1' WHERE name='i1';
   121    SELECT type, name, tbl_name, '|' FROM sqlite_master;
   122  } {table t1 t1 | table i1 t1 | view v2 v2 | trigger r1 t1 |}
   123  do_test corruptM-151 {
   124    open_db2_and_catchsql {
   125      PRAGMA quick_check;
   126      SELECT * FROM t1, v2;
   127    }
   128  } {1 {malformed database schema (i1)}}
   129  
   130  do_execsql_test corruptM-160 {
   131    UPDATE sqlite_master SET type='view', tbl_name='t1' WHERE name='i1';
   132    SELECT type, name, tbl_name, '|' FROM sqlite_master;
   133  } {table t1 t1 | view i1 t1 | view v2 v2 | trigger r1 t1 |}
   134  do_test corruptM-161 {
   135    open_db2_and_catchsql {
   136      PRAGMA quick_check;
   137      SELECT * FROM t1, v2;
   138    }
   139  } {1 {malformed database schema (i1)}}
   140  
   141  do_execsql_test corruptM-170 {
   142    UPDATE sqlite_master SET type='index', tbl_name='t1' WHERE name='i1';
   143    UPDATE sqlite_master SET type='table', tbl_name='v2' WHERE name='v2';
   144    SELECT type, name, tbl_name, '|' FROM sqlite_master;
   145  } {table t1 t1 | index i1 t1 | table v2 v2 | trigger r1 t1 |}
   146  do_test corruptM-171 {
   147    open_db2_and_catchsql {
   148      PRAGMA quick_check;
   149      SELECT * FROM t1, v2;
   150    }
   151  } {1 {malformed database schema (v2)}}
   152  
   153  do_execsql_test corruptM-180 {
   154    UPDATE sqlite_master SET type='view',name='v3',tbl_name='v3' WHERE name='v2';
   155    SELECT type, name, tbl_name, '|' FROM sqlite_master;
   156  } {table t1 t1 | index i1 t1 | view v3 v3 | trigger r1 t1 |}
   157  do_test corruptM-181 {
   158    open_db2_and_catchsql {
   159      PRAGMA quick_check;
   160      SELECT * FROM t1, v2;
   161    }
   162  } {1 {malformed database schema (v3)}}
   163  
   164  do_execsql_test corruptM-190 {
   165    UPDATE sqlite_master SET type='view',name='v2',tbl_name='v2' WHERE name='v3';
   166    UPDATE sqlite_master SET type='view' WHERE name='r1';
   167    SELECT type, name, tbl_name, '|' FROM sqlite_master;
   168  } {table t1 t1 | index i1 t1 | view v2 v2 | view r1 t1 |}
   169  do_test corruptM-191 {
   170    open_db2_and_catchsql {
   171      PRAGMA quick_check;
   172      SELECT * FROM t1, v2;
   173    }
   174  } {1 {malformed database schema (r1)}}
   175  do_execsql_test corruptM-192 {
   176    UPDATE sqlite_master SET type='trigger',tbl_name='v2' WHERE name='r1';
   177    SELECT type, name, tbl_name, '|' FROM sqlite_master;
   178  } {table t1 t1 | index i1 t1 | view v2 v2 | trigger r1 v2 |}
   179  do_test corruptM-193 {
   180    open_db2_and_catchsql {
   181      PRAGMA quick_check;
   182      SELECT * FROM t1, v2;
   183    }
   184  } {1 {malformed database schema (r1)}}
   185  
   186  finish_test