/ Hex Artifact Content
Login

Artifact 34d3217f2e1b783e68374430e4049a3416e1d9e9:


0000: 23 20 32 30 30 38 20 4a 75 6e 65 20 31 31 0a 23  # 2008 June 11.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c 65  ****.# This file
0170: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72   implements regr
0180: 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72  ession tests for
0190: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e   SQLite library.
01a0: 0a 23 0a 23 20 54 68 69 73 20 66 69 6c 65 20 69  .#.# This file i
01b0: 6d 70 6c 65 6d 65 6e 74 73 20 74 65 73 74 73 20  mplements tests 
01c0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c  to make sure SQL
01d0: 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 63 72 61  ite does not cra
01e0: 73 68 20 6f 72 0a 23 20 73 65 67 66 61 75 6c 74  sh or.# segfault
01f0: 20 69 66 20 69 74 20 73 65 65 73 20 61 20 63 6f   if it sees a co
0200: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
0210: 69 6c 65 2e 20 20 49 74 20 73 70 65 63 69 66 69  ile.  It specifi
0220: 63 61 6c 6c 79 20 66 6f 63 75 73 65 73 0a 23 20  cally focuses.# 
0230: 6f 6e 20 63 6f 72 72 75 70 74 20 63 65 6c 6c 20  on corrupt cell 
0240: 6f 66 66 73 65 74 73 20 69 6e 20 61 20 62 74 72  offsets in a btr
0250: 65 65 20 70 61 67 65 2e 0a 23 0a 23 20 24 49 64  ee page..#.# $Id
0260: 3a 20 63 6f 72 72 75 70 74 37 2e 74 65 73 74 2c  : corrupt7.test,
0270: 76 20 31 2e 34 20 32 30 30 38 2f 30 37 2f 32 36  v 1.4 2008/07/26
0280: 20 31 38 3a 32 36 3a 31 30 20 64 61 6e 69 65 6c   18:26:10 daniel
0290: 6b 31 39 37 37 20 45 78 70 20 24 0a 0a 73 65 74  k1977 Exp $..set
02a0: 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64   testdir [file d
02b0: 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73  irname $argv0].s
02c0: 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74  ource $testdir/t
02d0: 65 73 74 65 72 2e 74 63 6c 0a 0a 23 20 57 65 20  ester.tcl..# We 
02e0: 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 70 61  must have the pa
02f0: 67 65 5f 73 69 7a 65 20 70 72 61 67 6d 61 20 66  ge_size pragma f
0300: 6f 72 20 74 68 65 73 65 20 74 65 73 74 73 20 74  or these tests t
0310: 6f 20 77 6f 72 6b 2e 0a 23 0a 69 66 63 61 70 61  o work..#.ifcapa
0320: 62 6c 65 20 21 70 61 67 65 72 5f 70 72 61 67 6d  ble !pager_pragm
0330: 61 73 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  as {.  finish_te
0340: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23  st.  return.}..#
0350: 20 43 72 65 61 74 65 20 61 20 73 69 6d 70 6c 65   Create a simple
0360: 2c 20 73 6d 61 6c 6c 20 64 61 74 61 62 61 73 65  , small database
0370: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72  ..#.do_test corr
0380: 75 70 74 37 2d 31 2e 31 20 7b 0a 20 20 65 78 65  upt7-1.1 {.  exe
0390: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
03a0: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 4f 46  A auto_vacuum=OF
03b0: 46 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61  F;.    PRAGMA pa
03c0: 67 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20  ge_size=1024;.  
03d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
03e0: 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1(x);.    INSERT
03f0: 20 49 4e 54 4f 20 74 31 28 78 29 20 56 41 4c 55   INTO t1(x) VALU
0400: 45 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  ES(1);.    INSER
0410: 54 20 49 4e 54 4f 20 74 31 28 78 29 20 56 41 4c  T INTO t1(x) VAL
0420: 55 45 53 28 32 29 3b 0a 20 20 20 20 49 4e 53 45  UES(2);.    INSE
0430: 52 54 20 49 4e 54 4f 20 74 31 28 78 29 20 53 45  RT INTO t1(x) SE
0440: 4c 45 43 54 20 78 2b 32 20 46 52 4f 4d 20 74 31  LECT x+2 FROM t1
0450: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0460: 4f 20 74 31 28 78 29 20 53 45 4c 45 43 54 20 78  O t1(x) SELECT x
0470: 2b 34 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  +4 FROM t1;.    
0480: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 78  INSERT INTO t1(x
0490: 29 20 53 45 4c 45 43 54 20 78 2b 38 20 46 52 4f  ) SELECT x+8 FRO
04a0: 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 66 69 6c 65  M t1;.  }.  file
04b0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
04c0: 5b 65 78 70 72 20 7b 31 30 32 34 2a 32 7d 5d 0a  [expr {1024*2}].
04d0: 0a 23 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .# Verify that t
04e0: 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  he file format i
04f0: 73 20 61 73 20 77 65 20 65 78 70 65 63 74 2e 20  s as we expect. 
0500: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 0a 23   The page size.#
0510: 20 73 68 6f 75 6c 64 20 62 65 20 31 30 32 34 20   should be 1024 
0520: 62 79 74 65 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  bytes..#.do_test
0530: 20 63 6f 72 72 75 70 74 37 2d 31 2e 32 20 7b 0a   corrupt7-1.2 {.
0540: 20 20 68 65 78 69 6f 5f 67 65 74 5f 69 6e 74 20    hexio_get_int 
0550: 5b 68 65 78 69 6f 5f 72 65 61 64 20 74 65 73 74  [hexio_read test
0560: 2e 64 62 20 31 36 20 32 5d 0a 7d 20 31 30 32 34  .db 16 2].} 1024
0570: 20 20 20 3b 23 20 54 68 65 20 70 61 67 65 20 73     ;# The page s
0580: 69 7a 65 20 69 73 20 31 30 32 34 0a 64 6f 5f 74  ize is 1024.do_t
0590: 65 73 74 20 63 6f 72 72 75 70 74 37 2d 31 2e 33  est corrupt7-1.3
05a0: 20 7b 0a 20 20 68 65 78 69 6f 5f 67 65 74 5f 69   {.  hexio_get_i
05b0: 6e 74 20 5b 68 65 78 69 6f 5f 72 65 61 64 20 74  nt [hexio_read t
05c0: 65 73 74 2e 64 62 20 32 30 20 31 5d 0a 7d 20 30  est.db 20 1].} 0
05d0: 20 20 20 20 20 20 3b 23 20 55 6e 75 73 65 64 20        ;# Unused 
05e0: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
05f0: 73 20 30 0a 0a 69 6e 74 65 67 72 69 74 79 5f 63  s 0..integrity_c
0600: 68 65 63 6b 20 63 6f 72 72 75 70 74 37 2d 31 2e  heck corrupt7-1.
0610: 34 0a 0a 23 20 44 65 6c 69 62 65 72 61 74 65 6c  4..# Deliberatel
0620: 79 20 63 6f 72 72 75 70 74 20 73 6f 6d 65 20 6f  y corrupt some o
0630: 66 20 74 68 65 20 63 65 6c 6c 20 6f 66 66 73 65  f the cell offse
0640: 74 73 20 69 6e 20 74 68 65 20 62 74 72 65 65 20  ts in the btree 
0650: 70 61 67 65 0a 23 20 6f 6e 20 70 61 67 65 20 32  page.# on page 2
0660: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
0670: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72  ..#.do_test corr
0680: 75 70 74 37 2d 32 2e 31 20 7b 0a 20 20 64 62 20  upt7-2.1 {.  db 
0690: 63 6c 6f 73 65 0a 20 20 68 65 78 69 6f 5f 77 72  close.  hexio_wr
06a0: 69 74 65 20 74 65 73 74 2e 64 62 20 31 30 36 32  ite test.db 1062
06b0: 20 46 46 0a 20 20 73 71 6c 69 74 65 33 20 64 62   FF.  sqlite3 db
06c0: 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20 65 76   test.db.  db ev
06d0: 61 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67  al {PRAGMA integ
06e0: 72 69 74 79 5f 63 68 65 63 6b 28 31 29 7d 0a 7d  rity_check(1)}.}
06f0: 20 7b 7b 2a 2a 2a 20 69 6e 20 64 61 74 61 62 61   {{*** in databa
0700: 73 65 20 6d 61 69 6e 20 2a 2a 2a 0a 43 6f 72 72  se main ***.Corr
0710: 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
0720: 69 6e 20 63 65 6c 6c 20 31 35 20 6f 6e 20 70 61  in cell 15 on pa
0730: 67 65 20 32 7d 7d 0a 64 6f 5f 74 65 73 74 20 63  ge 2}}.do_test c
0740: 6f 72 72 75 70 74 37 2d 32 2e 32 20 7b 0a 20 20  orrupt7-2.2 {.  
0750: 64 62 20 63 6c 6f 73 65 0a 20 20 68 65 78 69 6f  db close.  hexio
0760: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 31  _write test.db 1
0770: 30 36 32 20 30 34 0a 20 20 73 71 6c 69 74 65 33  062 04.  sqlite3
0780: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62   db test.db.  db
0790: 20 65 76 61 6c 20 7b 50 52 41 47 4d 41 20 69 6e   eval {PRAGMA in
07a0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28 31 29  tegrity_check(1)
07b0: 7d 0a 7d 20 7b 7b 2a 2a 2a 20 69 6e 20 64 61 74  }.} {{*** in dat
07c0: 61 62 61 73 65 20 6d 61 69 6e 20 2a 2a 2a 0a 43  abase main ***.C
07d0: 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74  orruption detect
07e0: 65 64 20 69 6e 20 63 65 6c 6c 20 31 35 20 6f 6e  ed in cell 15 on
07f0: 20 70 61 67 65 20 32 7d 7d 0a 0a 64 6f 5f 74 65   page 2}}..do_te
0800: 73 74 20 63 6f 72 72 75 70 74 37 2d 33 2e 31 20  st corrupt7-3.1 
0810: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0820: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b    DROP TABLE t1;
0830: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
0840: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
0850: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0860: 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b  ALUES(1, 'one');
0870: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0880: 20 74 31 20 56 41 4c 55 45 53 28 31 30 30 2c 20   t1 VALUES(100, 
0890: 27 6f 6e 65 20 68 75 6e 64 72 65 64 27 29 3b 0a  'one hundred');.
08a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
08b0: 74 31 20 56 41 4c 55 45 53 28 31 30 30 30 30 30  t1 VALUES(100000
08c0: 2c 20 27 6f 6e 65 20 68 75 6e 64 72 65 64 20 74  , 'one hundred t
08d0: 68 6f 75 73 61 6e 64 27 29 3b 0a 20 20 20 20 43  housand');.    C
08e0: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
08f0: 4e 20 74 31 28 62 29 3b 0a 20 20 7d 0a 20 20 64  N t1(b);.  }.  d
0900: 62 20 63 6c 6f 73 65 0a 0a 20 20 23 20 4c 6f 63  b close..  # Loc
0910: 61 74 65 20 74 68 65 20 33 72 64 20 63 65 6c 6c  ate the 3rd cell
0920: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   in the index.. 
0930: 20 73 65 74 20 63 65 6c 6c 5f 6f 66 66 73 65 74   set cell_offset
0940: 20 5b 68 65 78 69 6f 5f 67 65 74 5f 69 6e 74 20   [hexio_get_int 
0950: 5b 68 65 78 69 6f 5f 72 65 61 64 20 74 65 73 74  [hexio_read test
0960: 2e 64 62 20 5b 65 78 70 72 20 31 30 32 34 2a 32  .db [expr 1024*2
0970: 20 2b 20 31 32 5d 20 32 5d 5d 0a 20 20 69 6e 63   + 12] 2]].  inc
0980: 72 20 63 65 6c 6c 5f 6f 66 66 73 65 74 20 5b 65  r cell_offset [e
0990: 78 70 72 20 31 30 32 34 2a 32 5d 0a 20 20 69 6e  xpr 1024*2].  in
09a0: 63 72 20 63 65 6c 6c 5f 6f 66 66 73 65 74 20 31  cr cell_offset 1
09b0: 0a 0a 20 20 23 20 54 68 69 73 20 77 72 69 74 65  ..  # This write
09c0: 20 63 6f 72 72 75 70 74 73 20 74 68 65 20 22 68   corrupts the "h
09d0: 65 61 64 65 72 2d 73 69 7a 65 22 20 66 69 65 6c  eader-size" fiel
09e0: 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
09f0: 65 20 72 65 63 6f 72 64 0a 20 20 23 20 73 74 6f  e record.  # sto
0a00: 72 65 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78  red in the index
0a10: 20 63 65 6c 6c 2e 20 41 74 20 6f 6e 65 20 70 6f   cell. At one po
0a20: 69 6e 74 20 74 68 69 73 20 77 61 73 20 63 61 75  int this was cau
0a30: 73 69 6e 67 20 73 71 6c 69 74 65 20 74 6f 20 0a  sing sqlite to .
0a40: 20 20 23 20 72 65 66 65 72 65 6e 63 65 20 69 6e    # reference in
0a50: 76 61 6c 69 64 20 6d 65 6d 6f 72 79 2e 0a 20 20  valid memory..  
0a60: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
0a70: 2e 64 62 20 24 63 65 6c 6c 5f 6f 66 66 73 65 74  .db $cell_offset
0a80: 20 46 46 46 46 37 46 0a 20 20 0a 20 20 73 71 6c   FFFF7F.  .  sql
0a90: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
0aa0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
0ab0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
0ac0: 31 20 57 48 45 52 45 20 62 20 3e 20 27 6f 27 20  1 WHERE b > 'o' 
0ad0: 41 4e 44 20 62 20 3c 20 27 70 27 3b 0a 20 20 7d  AND b < 'p';.  }
0ae0: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
0af0: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
0b00: 6c 66 6f 72 6d 65 64 7d 7d 0a 0a 66 69 6e 69 73  lformed}}..finis
0b10: 68 5f 74 65 73 74 0a                             h_test.