File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / corrupt6.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:16 2012 UTC (12 years, 4 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    1: # 2008 May 6
    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: # This file implements regression tests for SQLite library.
   12: #
   13: # This file implements tests to make sure SQLite does not crash or
   14: # segfault if it sees a corrupt database file.  It specifically focuses
   15: # on corrupt SerialTypeLen values.
   16: #
   17: # $Id: corrupt6.test,v 1.1.1.1 2012/02/21 17:04:16 misho Exp $
   18: 
   19: set testdir [file dirname $argv0]
   20: source $testdir/tester.tcl
   21: 
   22: # Do not use a codec for tests in this file, as the database file is
   23: # manipulated directly using tcl scripts (using the [hexio_write] command).
   24: #
   25: do_not_use_codec
   26: 
   27: # We must have the page_size pragma for these tests to work.
   28: #
   29: ifcapable !pager_pragmas {
   30:   finish_test
   31:   return
   32: }
   33: 
   34: # Create a simple, small database.
   35: #
   36: do_test corrupt6-1.1 {
   37:   execsql {
   38:     PRAGMA auto_vacuum=OFF;
   39:     PRAGMA page_size=1024;
   40:     CREATE TABLE t1(x);
   41:     INSERT INTO t1(x) VALUES('varint32-01234567890123456789012345678901234567890123456789');
   42:     INSERT INTO t1(x) VALUES('varint32-01234567890123456789012345678901234567890123456789');
   43:   }
   44:   file size test.db
   45: } [expr {1024*2}]
   46: 
   47: # Verify that the file format is as we expect.  The page size
   48: # should be 1024 bytes.
   49: #
   50: do_test corrupt6-1.2 {
   51:   hexio_get_int [hexio_read test.db 16 2]
   52: } 1024   ;# The page size is 1024
   53: do_test corrupt6-1.3 {
   54:   hexio_get_int [hexio_read test.db 20 1]
   55: } 0      ;# Unused bytes per page is 0
   56: 
   57: integrity_check corrupt6-1.4
   58: 
   59: # Verify SerialTypeLen for first field of two records as we expect.
   60: # SerialTypeLen = (len*2+12) = 60*2+12 = 132
   61: do_test corrupt6-1.5.1 {
   62:   hexio_read test.db 1923 2
   63: } 8103      ;# First text field size is 81 03 == 131
   64: do_test corrupt6-1.5.2 {
   65:   hexio_read test.db 1987 2
   66: } 8103      ;# Second text field size is 81 03 == 131
   67: 
   68: # Verify simple query results as expected.
   69: do_test corrupt6-1.6 {
   70:   db close
   71:   sqlite3 db test.db
   72:   catchsql {
   73:     SELECT substr(x,1,8) FROM t1
   74:   }
   75: } [list 0 {varint32 varint32} ]
   76: integrity_check corrupt6-1.7
   77: 
   78: # Adjust value of record 1 / field 1 SerialTypeLen and see if the
   79: # corruption is detected.
   80: # Increase SerialTypeLen by 2.
   81: do_test corrupt6-1.8.1 {
   82:   db close
   83:   hexio_write test.db 1923 8105
   84:   sqlite3 db test.db
   85:   catchsql {
   86:     SELECT substr(x,1,8) FROM t1
   87:   }
   88: } [list 1 {database disk image is malformed}]
   89: 
   90: # Adjust value of record 1 / field 1 SerialTypeLen and see if the
   91: # corruption is detected.
   92: # Decrease SerialTypeLen by 2.
   93: do_test corrupt6-1.8.2 {
   94:   db close
   95:   hexio_write test.db 1923 8101
   96:   sqlite3 db test.db
   97:   catchsql {
   98:     SELECT substr(x,1,8) FROM t1
   99:   }
  100: } [list 1 {database disk image is malformed}]
  101: 
  102: # Put value of record 1 / field 1 SerialTypeLen back.
  103: do_test corrupt6-1.8.3 {
  104:   db close
  105:   hexio_write test.db 1923 8103
  106:   sqlite3 db test.db
  107:   catchsql {
  108:     SELECT substr(x,1,8) FROM t1
  109:   }
  110: } [list 0 {varint32 varint32} ]
  111: integrity_check corrupt6-1.8.4
  112: 
  113: # Adjust value of record 2 / field 1 SerialTypeLen and see if the
  114: # corruption is detected.
  115: # Increase SerialTypeLen by 2.
  116: do_test corrupt6-1.9.1 {
  117:   db close
  118:   hexio_write test.db 1987 8105
  119:   sqlite3 db test.db
  120:   catchsql {
  121:     SELECT substr(x,1,8) FROM t1
  122:   }
  123: } [list 1 {database disk image is malformed}]
  124: 
  125: # Adjust value of record 2 / field 2 SerialTypeLen and see if the
  126: # corruption is detected.
  127: # Decrease SerialTypeLen by 2.
  128: do_test corrupt6-1.9.2 {
  129:   db close
  130:   hexio_write test.db 1987 8101
  131:   sqlite3 db test.db
  132:   catchsql {
  133:     SELECT substr(x,1,8) FROM t1
  134:   }
  135: } [list 1 {database disk image is malformed}]
  136: 
  137: # Put value of record 1 / field 2 SerialTypeLen back.
  138: do_test corrupt6-1.9.3 {
  139:   db close
  140:   hexio_write test.db 1987 8103
  141:   sqlite3 db test.db
  142:   catchsql {
  143:     SELECT substr(x,1,8) FROM t1
  144:   }
  145: } [list 0 {varint32 varint32} ]
  146: integrity_check corrupt6-1.9.4
  147: 
  148: # Adjust value of record 1 / field 1 SerialTypeLen and see if the
  149: # corruption is detected.
  150: # Set SerialTypeLen to FF 7F (2 bytes)
  151: do_test corrupt6-1.10.1 {
  152:   db close
  153:   hexio_write test.db 1923 FF7F
  154:   sqlite3 db test.db
  155:   catchsql {
  156:     SELECT substr(x,1,8) FROM t1
  157:   }
  158: } [list 1 {database disk image is malformed}]
  159: 
  160: # Adjust value of record 1 / field 1 SerialTypeLen and see if the
  161: # corruption is detected.
  162: # Set SerialTypeLen to FF FF 7F (3 bytes)
  163: do_test corrupt6-1.10.2 {
  164:   db close
  165:   hexio_write test.db 1923 FFFF7F
  166:   sqlite3 db test.db
  167:   catchsql {
  168:     SELECT substr(x,1,8) FROM t1
  169:   }
  170: } [list 1 {database disk image is malformed}]
  171: 
  172: # Adjust value of record 1 / field 1 SerialTypeLen and see if the
  173: # corruption is detected.
  174: # Set SerialTypeLen to FF FF FF 7F (4 bytes)
  175: do_test corrupt6-1.10.3 {
  176:   db close
  177:   hexio_write test.db 1923 FFFFFF7F
  178:   sqlite3 db test.db
  179:   catchsql {
  180:     SELECT substr(x,1,8) FROM t1
  181:   }
  182: } [list 1 {database disk image is malformed}]
  183: 
  184: # Adjust value of record 1 / field 1 SerialTypeLen and see if the
  185: # corruption is detected.
  186: # Set SerialTypeLen to FF FF FF FF 7F (5 bytes)
  187: do_test corrupt6-1.10.4 {
  188:   db close
  189:   hexio_write test.db 1923 FFFFFFFF7F
  190:   sqlite3 db test.db
  191:   catchsql {
  192:     SELECT substr(x,1,8) FROM t1
  193:   }
  194: } [list 1 {database disk image is malformed}]
  195: 
  196: # Adjust value of record 1 / field 1 SerialTypeLen and see if the
  197: # corruption is detected.
  198: # Set SerialTypeLen to FF FF FF FF FF 7F (6 bytes, and overflows).
  199: do_test corrupt6-1.10.5 {
  200:   db close
  201:   hexio_write test.db 1923 FFFFFFFFFF7F
  202:   sqlite3 db test.db
  203:   catchsql {
  204:     SELECT substr(x,1,8) FROM t1
  205:   }
  206: } [list 1 {database disk image is malformed}]
  207: 
  208: # Adjust value of record 1 / field 1 SerialTypeLen and see if the
  209: # corruption is detected.
  210: # Set SerialTypeLen to FF FF FF FF FF FF 7F (7 bytes, and overflows).
  211: do_test corrupt6-1.10.6 {
  212:   db close
  213:   hexio_write test.db 1923 FFFFFFFFFFFF7F
  214:   sqlite3 db test.db
  215:   catchsql {
  216:     SELECT substr(x,1,8) FROM t1
  217:   }
  218: } [list 1 {database disk image is malformed}]
  219: 
  220: # Adjust value of record 1 / field 1 SerialTypeLen and see if the
  221: # corruption is detected.
  222: # Set SerialTypeLen to FF FF FF FF FF FF FF 7F (8 bytes, and overflows).
  223: do_test corrupt6-1.10.7 {
  224:   db close
  225:   hexio_write test.db 1923 FFFFFFFFFFFFFF7F
  226:   sqlite3 db test.db
  227:   catchsql {
  228:     SELECT substr(x,1,8) FROM t1
  229:   }
  230: } [list 1 {database disk image is malformed}]
  231: 
  232: # Adjust value of record 1 / field 1 SerialTypeLen and see if the
  233: # corruption is detected.
  234: # Set SerialTypeLen to FF FF FF FF FF FF FF FF 7F (9 bytes, and overflows).
  235: do_test corrupt6-1.10.8 {
  236:   db close
  237:   hexio_write test.db 1923 FFFFFFFFFFFFFFFF7F
  238:   sqlite3 db test.db
  239:   catchsql {
  240:     SELECT substr(x,1,8) FROM t1
  241:   }
  242: } [list 1 {database disk image is malformed}]
  243: 
  244: # Adjust value of record 1 / field 1 SerialTypeLen and see if the
  245: # corruption is detected.
  246: # Set SerialTypeLen to FFFF FF FF FF FF FF FF FF 7F (10 bytes, and overflows).
  247: do_test corrupt6-1.10.9 {
  248:   db close
  249:   hexio_write test.db 1923 FFFFFFFFFFFFFFFFFF7F
  250:   sqlite3 db test.db
  251:   catchsql {
  252:     SELECT substr(x,1,8) FROM t1
  253:   }
  254: } [list 1 {database disk image is malformed}]
  255: 
  256: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>