/ Hex Artifact Content
Login

Artifact b036f94bda4b0b23a2919bf717046ce9ecca4543:


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 38 20 32 30 30 39 2f 30 38 2f 31 30  v 1.8 2009/08/10
0280: 20 31 30 3a 31 38 3a 30 38 20 64 61 6e 69 65 6c   10:18:08 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 54 68 69  ester.tcl..# Thi
02e0: 73 20 6d 6f 64 75 6c 65 20 75 73 65 73 20 68 61  s module uses ha
02f0: 72 64 2d 63 6f 64 65 64 20 6f 66 66 73 65 74 73  rd-coded offsets
0300: 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 77 6f   which do not wo
0310: 72 6b 20 69 66 20 74 68 65 20 72 65 73 65 72 76  rk if the reserv
0320: 65 64 5f 62 79 74 65 73 0a 23 20 76 61 6c 75 65  ed_bytes.# value
0330: 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 0a 69 66 20   is nonzero..if 
0340: 7b 5b 6e 6f 6e 7a 65 72 6f 5f 72 65 73 65 72 76  {[nonzero_reserv
0350: 65 64 5f 62 79 74 65 73 5d 7d 20 7b 66 69 6e 69  ed_bytes]} {fini
0360: 73 68 5f 74 65 73 74 3b 20 72 65 74 75 72 6e 3b  sh_test; return;
0370: 7d 0a 0a 23 20 54 68 65 73 65 20 74 65 73 74 73  }..# These tests
0380: 20 64 65 61 6c 20 77 69 74 68 20 63 6f 72 72 75   deal with corru
0390: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
03a0: 73 0a 23 0a 64 61 74 61 62 61 73 65 5f 6d 61 79  s.#.database_may
03b0: 5f 62 65 5f 63 6f 72 72 75 70 74 0a 0a 23 20 57  _be_corrupt..# W
03c0: 65 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  e must have the 
03d0: 70 61 67 65 5f 73 69 7a 65 20 70 72 61 67 6d 61  page_size pragma
03e0: 20 66 6f 72 20 74 68 65 73 65 20 74 65 73 74 73   for these tests
03f0: 20 74 6f 20 77 6f 72 6b 2e 0a 23 0a 69 66 63 61   to work..#.ifca
0400: 70 61 62 6c 65 20 21 70 61 67 65 72 5f 70 72 61  pable !pager_pra
0410: 67 6d 61 73 20 7b 0a 20 20 66 69 6e 69 73 68 5f  gmas {.  finish_
0420: 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a  test.  return.}.
0430: 0a 23 20 43 72 65 61 74 65 20 61 20 73 69 6d 70  .# Create a simp
0440: 6c 65 2c 20 73 6d 61 6c 6c 20 64 61 74 61 62 61  le, small databa
0450: 73 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 63 6f  se..#.do_test co
0460: 72 72 75 70 74 37 2d 31 2e 31 20 7b 0a 20 20 65  rrupt7-1.1 {.  e
0470: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
0480: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d  GMA auto_vacuum=
0490: 4f 46 46 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  OFF;.    PRAGMA 
04a0: 70 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a  page_size=1024;.
04b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
04c0: 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45   t1(x);.    INSE
04d0: 52 54 20 49 4e 54 4f 20 74 31 28 78 29 20 56 41  RT INTO t1(x) VA
04e0: 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 49 4e 53  LUES(1);.    INS
04f0: 45 52 54 20 49 4e 54 4f 20 74 31 28 78 29 20 56  ERT INTO t1(x) V
0500: 41 4c 55 45 53 28 32 29 3b 0a 20 20 20 20 49 4e  ALUES(2);.    IN
0510: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 78 29 20  SERT INTO t1(x) 
0520: 53 45 4c 45 43 54 20 78 2b 32 20 46 52 4f 4d 20  SELECT x+2 FROM 
0530: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
0540: 4e 54 4f 20 74 31 28 78 29 20 53 45 4c 45 43 54  NTO t1(x) SELECT
0550: 20 78 2b 34 20 46 52 4f 4d 20 74 31 3b 0a 20 20   x+4 FROM t1;.  
0560: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0570: 28 78 29 20 53 45 4c 45 43 54 20 78 2b 38 20 46  (x) SELECT x+8 F
0580: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 66 69  ROM t1;.  }.  fi
0590: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
05a0: 7d 20 5b 65 78 70 72 20 7b 31 30 32 34 2a 32 7d  } [expr {1024*2}
05b0: 5d 0a 0a 23 20 56 65 72 69 66 79 20 74 68 61 74  ]..# Verify that
05c0: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
05d0: 20 69 73 20 61 73 20 77 65 20 65 78 70 65 63 74   is as we expect
05e0: 2e 20 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  .  The page size
05f0: 0a 23 20 73 68 6f 75 6c 64 20 62 65 20 31 30 32  .# should be 102
0600: 34 20 62 79 74 65 73 2e 0a 23 0a 64 6f 5f 74 65  4 bytes..#.do_te
0610: 73 74 20 63 6f 72 72 75 70 74 37 2d 31 2e 32 20  st corrupt7-1.2 
0620: 7b 0a 20 20 68 65 78 69 6f 5f 67 65 74 5f 69 6e  {.  hexio_get_in
0630: 74 20 5b 68 65 78 69 6f 5f 72 65 61 64 20 74 65  t [hexio_read te
0640: 73 74 2e 64 62 20 31 36 20 32 5d 0a 7d 20 31 30  st.db 16 2].} 10
0650: 32 34 20 20 20 3b 23 20 54 68 65 20 70 61 67 65  24   ;# The page
0660: 20 73 69 7a 65 20 69 73 20 31 30 32 34 0a 64 6f   size is 1024.do
0670: 5f 74 65 73 74 20 63 6f 72 72 75 70 74 37 2d 31  _test corrupt7-1
0680: 2e 33 20 7b 0a 20 20 68 65 78 69 6f 5f 67 65 74  .3 {.  hexio_get
0690: 5f 69 6e 74 20 5b 68 65 78 69 6f 5f 72 65 61 64  _int [hexio_read
06a0: 20 74 65 73 74 2e 64 62 20 32 30 20 31 5d 0a 7d   test.db 20 1].}
06b0: 20 30 20 20 20 20 20 20 3b 23 20 55 6e 75 73 65   0      ;# Unuse
06c0: 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  d bytes per page
06d0: 20 69 73 20 30 0a 0a 69 6e 74 65 67 72 69 74 79   is 0..integrity
06e0: 5f 63 68 65 63 6b 20 63 6f 72 72 75 70 74 37 2d  _check corrupt7-
06f0: 31 2e 34 0a 0a 23 20 44 65 6c 69 62 65 72 61 74  1.4..# Deliberat
0700: 65 6c 79 20 63 6f 72 72 75 70 74 20 73 6f 6d 65  ely corrupt some
0710: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 6f 66 66   of the cell off
0720: 73 65 74 73 20 69 6e 20 74 68 65 20 62 74 72 65  sets in the btre
0730: 65 20 70 61 67 65 0a 23 20 6f 6e 20 70 61 67 65  e page.# on page
0740: 20 32 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   2 of the databa
0750: 73 65 2e 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72  se..do_test corr
0760: 75 70 74 37 2d 32 2e 31 20 7b 0a 20 20 64 62 20  upt7-2.1 {.  db 
0770: 63 6c 6f 73 65 0a 20 20 68 65 78 69 6f 5f 77 72  close.  hexio_wr
0780: 69 74 65 20 74 65 73 74 2e 64 62 20 31 30 36 32  ite test.db 1062
0790: 20 46 46 0a 20 20 73 71 6c 69 74 65 33 20 64 62   FF.  sqlite3 db
07a0: 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20 65 76   test.db.  db ev
07b0: 61 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67  al {PRAGMA integ
07c0: 72 69 74 79 5f 63 68 65 63 6b 28 31 29 7d 0a 7d  rity_check(1)}.}
07d0: 20 7b 7b 2a 2a 2a 20 69 6e 20 64 61 74 61 62 61   {{*** in databa
07e0: 73 65 20 6d 61 69 6e 20 2a 2a 2a 0a 4f 6e 20 74  se main ***.On t
07f0: 72 65 65 20 70 61 67 65 20 32 20 63 65 6c 6c 20  ree page 2 cell 
0800: 31 35 3a 20 4f 66 66 73 65 74 20 36 35 34 35 37  15: Offset 65457
0810: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 39 34   out of range 94
0820: 35 2e 2e 31 30 32 30 7d 7d 0a 64 6f 5f 74 65 73  5..1020}}.do_tes
0830: 74 20 63 6f 72 72 75 70 74 37 2d 32 2e 32 20 7b  t corrupt7-2.2 {
0840: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 68 65  .  db close.  he
0850: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
0860: 62 20 31 30 36 32 20 30 34 0a 20 20 73 71 6c 69  b 1062 04.  sqli
0870: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
0880: 20 64 62 20 65 76 61 6c 20 7b 50 52 41 47 4d 41   db eval {PRAGMA
0890: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
08a0: 28 31 29 7d 0a 7d 20 7b 7b 2a 2a 2a 20 69 6e 20  (1)}.} {{*** in 
08b0: 64 61 74 61 62 61 73 65 20 6d 61 69 6e 20 2a 2a  database main **
08c0: 2a 0a 4f 6e 20 74 72 65 65 20 70 61 67 65 20 32  *.On tree page 2
08d0: 20 63 65 6c 6c 20 31 35 3a 20 4f 66 66 73 65 74   cell 15: Offset
08e0: 20 31 32 30 31 20 6f 75 74 20 6f 66 20 72 61 6e   1201 out of ran
08f0: 67 65 20 39 34 35 2e 2e 31 30 32 30 7d 7d 0a 20  ge 945..1020}}. 
0900: 20 0a 23 20 54 68 65 20 63 6f 64 65 20 70 61 74   .# The code pat
0910: 68 20 74 68 61 74 20 77 61 73 20 63 61 75 73 69  h that was causi
0920: 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 6f 76  ng the buffer ov
0930: 65 72 72 75 6e 20 74 68 61 74 20 74 68 69 73 20  errun that this 
0940: 74 65 73 74 0a 23 20 63 61 73 65 20 77 61 73 20  test.# case was 
0950: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 77 61 73  checking for was
0960: 20 72 65 6d 6f 76 65 64 2e 0a 23 0a 23 64 6f 5f   removed..#.#do_
0970: 74 65 73 74 20 63 6f 72 72 75 70 74 37 2d 33 2e  test corrupt7-3.
0980: 31 20 7b 0a 23 20 20 65 78 65 63 73 71 6c 20 7b  1 {.#  execsql {
0990: 0a 23 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  .#    DROP TABLE
09a0: 20 74 31 3b 0a 23 20 20 20 20 43 52 45 41 54 45   t1;.#    CREATE
09b0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
09c0: 0a 23 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  .#    INSERT INT
09d0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27  O t1 VALUES(1, '
09e0: 6f 6e 65 27 29 3b 0a 23 20 20 20 20 49 4e 53 45  one');.#    INSE
09f0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0a00: 53 28 31 30 30 2c 20 27 6f 6e 65 20 68 75 6e 64  S(100, 'one hund
0a10: 72 65 64 27 29 3b 0a 23 20 20 20 20 49 4e 53 45  red');.#    INSE
0a20: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0a30: 53 28 31 30 30 30 30 30 2c 20 27 6f 6e 65 20 68  S(100000, 'one h
0a40: 75 6e 64 72 65 64 20 74 68 6f 75 73 61 6e 64 27  undred thousand'
0a50: 29 3b 0a 23 20 20 20 20 43 52 45 41 54 45 20 49  );.#    CREATE I
0a60: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 29  NDEX i1 ON t1(b)
0a70: 3b 0a 23 20 20 7d 0a 23 20 20 64 62 20 63 6c 6f  ;.#  }.#  db clo
0a80: 73 65 0a 23 0a 23 20 20 23 20 4c 6f 63 61 74 65  se.#.#  # Locate
0a90: 20 74 68 65 20 33 72 64 20 63 65 6c 6c 20 69 6e   the 3rd cell in
0aa0: 20 74 68 65 20 69 6e 64 65 78 2e 0a 23 20 20 73   the index..#  s
0ab0: 65 74 20 63 65 6c 6c 5f 6f 66 66 73 65 74 20 5b  et cell_offset [
0ac0: 68 65 78 69 6f 5f 67 65 74 5f 69 6e 74 20 5b 68  hexio_get_int [h
0ad0: 65 78 69 6f 5f 72 65 61 64 20 74 65 73 74 2e 64  exio_read test.d
0ae0: 62 20 5b 65 78 70 72 20 31 30 32 34 2a 32 20 2b  b [expr 1024*2 +
0af0: 20 31 32 5d 20 32 5d 5d 0a 23 20 20 69 6e 63 72   12] 2]].#  incr
0b00: 20 63 65 6c 6c 5f 6f 66 66 73 65 74 20 5b 65 78   cell_offset [ex
0b10: 70 72 20 31 30 32 34 2a 32 5d 0a 23 20 20 69 6e  pr 1024*2].#  in
0b20: 63 72 20 63 65 6c 6c 5f 6f 66 66 73 65 74 20 31  cr cell_offset 1
0b30: 0a 23 0a 23 20 20 23 20 54 68 69 73 20 77 72 69  .#.#  # This wri
0b40: 74 65 20 63 6f 72 72 75 70 74 73 20 74 68 65 20  te corrupts the 
0b50: 22 68 65 61 64 65 72 2d 73 69 7a 65 22 20 66 69  "header-size" fi
0b60: 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  eld of the datab
0b70: 61 73 65 20 72 65 63 6f 72 64 0a 23 20 20 23 20  ase record.#  # 
0b80: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e  stored in the in
0b90: 64 65 78 20 63 65 6c 6c 2e 20 41 74 20 6f 6e 65  dex cell. At one
0ba0: 20 70 6f 69 6e 74 20 74 68 69 73 20 77 61 73 20   point this was 
0bb0: 63 61 75 73 69 6e 67 20 73 71 6c 69 74 65 20 74  causing sqlite t
0bc0: 6f 20 0a 23 20 20 23 20 72 65 66 65 72 65 6e 63  o .#  # referenc
0bd0: 65 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79  e invalid memory
0be0: 2e 0a 23 20 20 68 65 78 69 6f 5f 77 72 69 74 65  ..#  hexio_write
0bf0: 20 74 65 73 74 2e 64 62 20 24 63 65 6c 6c 5f 6f   test.db $cell_o
0c00: 66 66 73 65 74 20 46 46 46 46 37 46 0a 23 20 20  ffset FFFF7F.#  
0c10: 0a 23 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  .#  sqlite3 db t
0c20: 65 73 74 2e 64 62 0a 23 20 20 63 61 74 63 68 73  est.db.#  catchs
0c30: 71 6c 20 7b 0a 23 20 20 20 20 53 45 4c 45 43 54  ql {.#    SELECT
0c40: 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   b FROM t1 WHERE
0c50: 20 62 20 3e 20 27 6f 27 20 41 4e 44 20 62 20 3c   b > 'o' AND b <
0c60: 20 27 70 27 3b 0a 23 20 20 7d 0a 23 7d 20 7b 31   'p';.#  }.#} {1
0c70: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
0c80: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
0c90: 65 64 7d 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73  ed}}..finish_tes
0ca0: 74 0a                                            t.