/ Hex Artifact Content
Login

Artifact 1c7b6f77cf3f237fb7fbb5b61d6c921fd4c7b993:


0000: 23 20 32 30 31 32 20 4a 61 6e 75 61 72 79 20 31  # 2012 January 1
0010: 32 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  2.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an 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 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74  *******.#..set t
0170: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
0180: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
0190: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
01a0: 74 65 72 2e 74 63 6c 0a 73 65 74 20 74 65 73 74  ter.tcl.set test
01b0: 70 72 65 66 69 78 20 63 6f 72 72 75 70 74 46 0a  prefix corruptF.
01c0: 0a 23 20 44 6f 20 6e 6f 74 20 75 73 65 20 61 20  .# Do not use a 
01d0: 63 6f 64 65 63 20 66 6f 72 20 74 65 73 74 73 20  codec for tests 
01e0: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 61 73  in this file, as
01f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
0200: 6c 65 20 69 73 0a 23 20 6d 61 6e 69 70 75 6c 61  le is.# manipula
0210: 74 65 64 20 64 69 72 65 63 74 6c 79 20 75 73 69  ted directly usi
0220: 6e 67 20 74 63 6c 20 73 63 72 69 70 74 73 20 28  ng tcl scripts (
0230: 75 73 69 6e 67 20 74 68 65 20 5b 68 65 78 69 6f  using the [hexio
0240: 5f 77 72 69 74 65 5d 20 63 6f 6d 6d 61 6e 64 29  _write] command)
0250: 2e 0a 23 0a 64 6f 5f 6e 6f 74 5f 75 73 65 5f 63  ..#.do_not_use_c
0260: 6f 64 65 63 0a 0a 70 72 6f 63 20 73 74 72 20 7b  odec..proc str {
0270: 69 7d 20 7b 20 66 6f 72 6d 61 74 20 25 30 38 64  i} { format %08d
0280: 20 24 69 20 7d 0a 0a 23 20 43 72 65 61 74 65 20   $i }..# Create 
0290: 61 20 36 20 70 61 67 65 20 64 61 74 61 62 61 73  a 6 page databas
02a0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 73  e containing a s
02b0: 69 6e 67 6c 65 20 74 61 62 6c 65 20 2d 20 74 31  ingle table - t1
02c0: 2e 20 54 61 62 6c 65 20 74 31 20 0a 23 20 63 6f  . Table t1 .# co
02d0: 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 20 32  nsists of page 2
02e0: 20 28 74 68 65 20 72 6f 6f 74 20 70 61 67 65 29   (the root page)
02f0: 20 61 6e 64 20 70 61 67 65 73 20 35 20 61 6e 64   and pages 5 and
0300: 20 36 20 28 6c 65 61 66 20 70 61 67 65 73 29 2e   6 (leaf pages).
0310: 20 0a 23 20 44 61 74 61 62 61 73 65 20 70 61 67   .# Database pag
0320: 65 73 20 33 20 61 6e 64 20 34 20 61 72 65 20 6f  es 3 and 4 are o
0330: 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  n the free list.
0340: 0a 23 0a 70 72 6f 63 20 63 72 65 61 74 65 5f 74  .#.proc create_t
0350: 65 73 74 5f 64 62 20 7b 7d 20 7b 0a 20 20 63 61  est_db {} {.  ca
0360: 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  tch { db close }
0370: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
0380: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
0390: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62   db test.db.  db
03a0: 20 66 75 6e 63 20 73 74 72 20 73 74 72 0a 20 20   func str str.  
03b0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
03c0: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
03d0: 20 3d 20 30 3b 0a 20 20 20 20 50 52 41 47 4d 41   = 0;.    PRAGMA
03e0: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
03f0: 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  4;.    CREATE TA
0400: 42 4c 45 20 74 31 28 78 29 3b 20 20 20 20 20 20  BLE t1(x);      
0410: 20 20 20 2f 2a 20 72 6f 6f 74 20 70 61 67 65 20     /* root page 
0420: 3d 20 32 20 2a 2f 0a 20 20 20 20 43 52 45 41 54  = 2 */.    CREAT
0430: 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b 20 20  E TABLE t2(x);  
0440: 20 20 20 20 20 20 20 2f 2a 20 72 6f 6f 74 20 70         /* root p
0450: 61 67 65 20 3d 20 33 20 2a 2f 0a 20 20 20 20 43  age = 3 */.    C
0460: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 78  REATE TABLE t3(x
0470: 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 72 6f  );         /* ro
0480: 6f 74 20 70 61 67 65 20 3d 20 34 20 2a 2f 0a 0a  ot page = 4 */..
0490: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
04a0: 74 31 20 56 41 4c 55 45 53 28 73 74 72 28 31 29  t1 VALUES(str(1)
04b0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
04c0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 73 74 72  TO t1 SELECT str
04d0: 28 72 6f 77 69 64 2b 31 29 20 46 52 4f 4d 20 74  (rowid+1) FROM t
04e0: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
04f0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 73 74 72  TO t1 SELECT str
0500: 28 72 6f 77 69 64 2b 32 29 20 46 52 4f 4d 20 74  (rowid+2) FROM t
0510: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
0520: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 73 74 72  TO t1 SELECT str
0530: 28 72 6f 77 69 64 2b 34 29 20 46 52 4f 4d 20 74  (rowid+4) FROM t
0540: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
0550: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 73 74 72  TO t1 SELECT str
0560: 28 72 6f 77 69 64 2b 38 29 20 46 52 4f 4d 20 74  (rowid+8) FROM t
0570: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
0580: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 73 74 72  TO t1 SELECT str
0590: 28 72 6f 77 69 64 2b 31 36 29 20 46 52 4f 4d 20  (rowid+16) FROM 
05a0: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
05b0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 73 74  NTO t1 SELECT st
05c0: 72 28 72 6f 77 69 64 2b 33 32 29 20 46 52 4f 4d  r(rowid+32) FROM
05d0: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
05e0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 73  INTO t1 SELECT s
05f0: 74 72 28 72 6f 77 69 64 2b 36 34 29 20 46 52 4f  tr(rowid+64) FRO
0600: 4d 20 74 31 3b 0a 20 20 20 20 44 52 4f 50 20 54  M t1;.    DROP T
0610: 41 42 4c 45 20 74 32 3b 0a 20 20 20 20 44 52 4f  ABLE t2;.    DRO
0620: 50 20 54 41 42 4c 45 20 74 33 3b 0a 20 20 7d 0a  P TABLE t3;.  }.
0630: 20 20 64 62 20 63 6c 6f 73 65 0a 7d 0a 0a 64 6f    db close.}..do
0640: 5f 74 65 73 74 20 31 2e 31 20 7b 20 63 72 65 61  _test 1.1 { crea
0650: 74 65 5f 74 65 73 74 5f 64 62 20 7d 20 7b 7d 0a  te_test_db } {}.
0660: 0a 23 20 43 68 65 63 6b 20 74 68 65 20 64 62 20  .# Check the db 
0670: 69 73 20 61 73 20 77 65 20 65 78 70 65 63 74 2e  is as we expect.
0680: 20 36 20 70 61 67 65 73 20 69 6e 20 74 6f 74 61   6 pages in tota
0690: 6c 2c 20 77 69 74 68 20 33 20 61 6e 64 20 34 20  l, with 3 and 4 
06a0: 6f 6e 20 74 68 65 20 66 72 65 65 0a 23 20 6c 69  on the free.# li
06b0: 73 74 2e 20 50 61 67 65 20 33 20 69 73 20 74 68  st. Page 3 is th
06c0: 65 20 66 72 65 65 20 6c 69 73 74 20 74 72 75 6e  e free list trun
06d0: 6b 20 61 6e 64 20 70 61 67 65 20 34 20 69 73 20  k and page 4 is 
06e0: 61 20 6c 65 61 66 2e 0a 23 0a 64 6f 5f 74 65 73  a leaf..#.do_tes
06f0: 74 20 31 2e 32 20 7b 20 66 69 6c 65 20 73 69 7a  t 1.2 { file siz
0700: 65 20 74 65 73 74 2e 64 62 20 7d 20 5b 65 78 70  e test.db } [exp
0710: 72 20 36 2a 31 30 32 34 5d 0a 64 6f 5f 74 65 73  r 6*1024].do_tes
0720: 74 20 31 2e 33 20 7b 20 68 65 78 69 6f 5f 72 65  t 1.3 { hexio_re
0730: 61 64 20 74 65 73 74 2e 64 62 20 33 32 20 34 20  ad test.db 32 4 
0740: 7d 20 30 30 30 30 30 30 30 33 0a 64 6f 5f 74 65  } 00000003.do_te
0750: 73 74 20 31 2e 34 20 7b 20 68 65 78 69 6f 5f 72  st 1.4 { hexio_r
0760: 65 61 64 20 74 65 73 74 2e 64 62 20 5b 65 78 70  ead test.db [exp
0770: 72 20 32 2a 31 30 32 34 5d 20 31 32 20 7d 20 30  r 2*1024] 12 } 0
0780: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30  0000000000000010
0790: 30 30 30 30 30 30 34 0a 0a 23 20 43 68 61 6e 67  0000004..# Chang
07a0: 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
07b0: 65 6e 74 72 79 20 74 6f 20 70 61 67 65 20 36 20  entry to page 6 
07c0: 61 6e 64 20 72 65 6f 70 65 6e 20 74 68 65 20 64  and reopen the d
07d0: 62 20 66 69 6c 65 2e 0a 64 6f 5f 74 65 73 74 20  b file..do_test 
07e0: 31 2e 35 20 7b 20 0a 20 20 68 65 78 69 6f 5f 77  1.5 { .  hexio_w
07f0: 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78  rite test.db [ex
0800: 70 72 20 32 2a 31 30 32 34 20 2b 20 38 5d 20 30  pr 2*1024 + 8] 0
0810: 30 30 30 30 30 30 36 20 0a 20 20 73 71 6c 69 74  0000006 .  sqlit
0820: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 7d 20  e3 db test.db.} 
0830: 7b 7d 0a 0a 23 20 4e 6f 77 20 63 72 65 61 74 65  {}..# Now create
0840: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 20   a new table in 
0850: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0860: 65 2e 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 74  e. The root of t
0870: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 23 20 69  he new table.# i
0880: 73 20 70 61 67 65 20 36 2c 20 77 68 69 63 68 20  s page 6, which 
0890: 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
08a0: 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
08b0: 20 69 6e 20 74 61 62 6c 65 20 74 31 2e 0a 23 0a   in table t1..#.
08c0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
08d0: 31 2e 36 20 7b 20 0a 20 20 43 52 45 41 54 45 20  1.6 { .  CREATE 
08e0: 54 41 42 4c 45 20 74 34 28 78 29 3b 0a 20 20 53  TABLE t4(x);.  S
08f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
0900: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 7d 20 7b 0a  ite_master;.} {.
0910: 20 20 74 61 62 6c 65 20 74 31 20 74 31 20 32 20    table t1 t1 2 
0920: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  {CREATE TABLE t1
0930: 28 78 29 7d 20 0a 20 20 74 61 62 6c 65 20 74 34  (x)} .  table t4
0940: 20 74 34 20 36 20 7b 43 52 45 41 54 45 20 54 41   t4 6 {CREATE TA
0950: 42 4c 45 20 74 34 28 78 29 7d 0a 7d 0a 0a 23 20  BLE t4(x)}.}..# 
0960: 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69  At one point thi
0970: 73 20 77 61 73 20 63 61 75 73 69 6e 67 20 61 6e  s was causing an
0980: 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 2e   assert to fail.
0990: 0a 23 0a 23 20 54 68 69 73 20 73 74 61 74 65 6d  .#.# This statem
09a0: 65 6e 74 20 6f 70 65 6e 73 20 61 20 63 75 72 73  ent opens a curs
09b0: 6f 72 20 6f 6e 20 74 61 62 6c 65 20 74 31 20 61  or on table t1 a
09c0: 6e 64 20 64 6f 65 73 20 61 20 66 75 6c 6c 20 74  nd does a full t
09d0: 61 62 6c 65 20 73 63 61 6e 2e 20 41 73 0a 23 20  able scan. As.# 
09e0: 65 61 63 68 20 72 6f 77 20 69 73 20 76 69 73 69  each row is visi
09f0: 74 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65  ted, it is copie
0a00: 64 20 69 6e 74 6f 20 74 61 62 6c 65 20 74 34 2e  d into table t4.
0a10: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 74 65 6d   There is no tem
0a20: 70 6f 72 61 72 79 0a 23 20 74 61 62 6c 65 2e 0a  porary.# table..
0a30: 23 0a 23 20 57 68 65 6e 20 74 68 65 20 74 31 20  #.# When the t1 
0a40: 63 75 72 73 6f 72 20 72 65 61 63 68 65 73 20 70  cursor reaches p
0a50: 61 67 65 20 36 20 28 77 68 69 63 68 20 69 73 20  age 6 (which is 
0a60: 62 6f 74 68 20 74 68 65 20 72 69 67 68 74 2d 6d  both the right-m
0a70: 6f 73 74 20 6c 65 61 66 20 6f 66 0a 23 20 74 31  ost leaf of.# t1
0a80: 20 61 6e 64 20 74 68 65 20 72 6f 6f 74 20 6f 66   and the root of
0a90: 20 74 34 29 2c 20 69 74 20 63 6f 6e 74 69 6e 75   t4), it continu
0aa0: 65 73 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  es to iterate th
0ab0: 72 6f 75 67 68 20 74 68 65 20 6b 65 79 73 20 77  rough the keys w
0ac0: 69 74 68 69 6e 0a 23 20 69 74 20 28 77 68 69 63  ithin.# it (whic
0ad0: 68 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  h at this point 
0ae0: 61 72 65 20 6b 65 79 73 20 74 68 61 74 20 68 61  are keys that ha
0af0: 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  ve been inserted
0b00: 20 69 6e 74 6f 20 74 34 29 2e 20 41 6e 64 0a 23   into t4). And.#
0b10: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 76 69   for each row vi
0b20: 73 69 74 65 64 2c 20 61 6e 6f 74 68 65 72 20 72  sited, another r
0b30: 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 20 69  ow is inserted i
0b40: 6e 74 6f 20 70 61 67 65 20 36 20 2d 20 69 74 20  nto page 6 - it 
0b50: 62 65 69 6e 67 20 74 68 65 0a 23 20 72 6f 6f 74  being the.# root
0b60: 20 70 61 67 65 20 6f 66 20 74 34 2e 20 45 76 65   page of t4. Eve
0b70: 6e 74 75 61 6c 6c 79 2c 20 70 61 67 65 20 36 20  ntually, page 6 
0b80: 62 65 63 6f 6d 65 73 20 66 75 6c 6c 20 61 6e 64  becomes full and
0b90: 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74   the height of t
0ba0: 68 65 0a 23 20 62 2d 74 72 65 65 20 66 6f 72 20  he.# b-tree for 
0bb0: 74 61 62 6c 65 20 74 34 20 69 6e 63 72 65 61 73  table t4 increas
0bc0: 65 64 2e 20 46 72 6f 6d 20 74 68 65 20 70 6f 69  ed. From the poi
0bd0: 6e 74 20 6f 66 20 76 69 65 77 20 6f 66 20 74 68  nt of view of th
0be0: 65 20 74 31 20 63 75 72 73 6f 72 2c 0a 23 20 74  e t1 cursor,.# t
0bf0: 68 69 73 20 75 6e 65 78 70 65 63 74 65 64 6c 79  his unexpectedly
0c00: 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
0c10: 62 65 72 20 6f 66 20 6b 65 79 73 20 6f 6e 20 70  ber of keys on p
0c20: 61 67 65 20 36 20 69 6e 20 74 68 65 20 6d 69 64  age 6 in the mid
0c30: 64 6c 65 20 6f 66 0a 23 20 69 74 73 20 69 74 65  dle of.# its ite
0c40: 72 61 74 69 6f 6e 2c 20 77 68 69 63 68 20 63 61  ration, which ca
0c50: 75 73 65 73 20 61 6e 20 61 73 73 65 72 74 28 29  uses an assert()
0c60: 20 74 6f 20 66 61 69 6c 2e 0a 23 0a 64 62 5f 73   to fail..#.db_s
0c70: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 69 66  ave_and_close.if
0c80: 20 31 20 7b 0a 66 6f 72 20 7b 73 65 74 20 69 20   1 {.for {set i 
0c90: 30 7d 20 7b 24 69 20 3c 20 31 32 38 7d 20 7b 69  0} {$i < 128} {i
0ca0: 6e 63 72 20 69 7d 20 7b 0a 20 20 64 62 5f 72 65  ncr i} {.  db_re
0cb0: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
0cc0: 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 37 2e 24  .  do_test 1.7.$
0cd0: 69 20 7b 20 0a 20 20 20 20 73 65 74 20 72 65 73  i { .    set res
0ce0: 20 5b 0a 20 20 20 20 20 20 63 61 74 63 68 73 71   [.      catchsq
0cf0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
0d00: 74 34 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  t4 SELECT x FROM
0d10: 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 3e   t1 WHERE rowid>
0d20: 24 69 20 7d 0a 20 20 20 20 5d 0a 20 20 20 20 69  $i }.    ].    i
0d30: 66 20 7b 24 72 65 73 20 3d 3d 20 22 30 20 7b 7d  f {$res == "0 {}
0d40: 22 20 7c 7c 20 24 72 65 73 20 3d 3d 20 22 31 20  " || $res == "1 
0d50: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
0d60: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
0d70: 64 7d 22 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  d}"} {.      set
0d80: 20 72 65 73 20 22 22 0a 20 20 20 20 7d 0a 20 20   res "".    }.  
0d90: 20 20 73 65 74 20 72 65 73 0a 20 20 7d 20 7b 7d    set res.  } {}
0da0: 0a 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 32 2e  .}.}..do_test 2.
0db0: 31 20 7b 20 63 72 65 61 74 65 5f 74 65 73 74 5f  1 { create_test_
0dc0: 64 62 20 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  db } {}.do_test 
0dd0: 32 2e 32 20 7b 20 66 69 6c 65 20 73 69 7a 65 20  2.2 { file size 
0de0: 74 65 73 74 2e 64 62 20 7d 20 5b 65 78 70 72 20  test.db } [expr 
0df0: 36 2a 31 30 32 34 5d 0a 64 6f 5f 74 65 73 74 20  6*1024].do_test 
0e00: 32 2e 33 20 7b 20 68 65 78 69 6f 5f 72 65 61 64  2.3 { hexio_read
0e10: 20 74 65 73 74 2e 64 62 20 33 32 20 34 20 7d 20   test.db 32 4 } 
0e20: 30 30 30 30 30 30 30 33 0a 64 6f 5f 74 65 73 74  00000003.do_test
0e30: 20 32 2e 34 20 7b 20 68 65 78 69 6f 5f 72 65 61   2.4 { hexio_rea
0e40: 64 20 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20  d test.db [expr 
0e50: 32 2a 31 30 32 34 5d 20 31 32 20 7d 20 30 30 30  2*1024] 12 } 000
0e60: 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30  0000000000001000
0e70: 30 30 30 30 34 0a 0a 23 20 43 68 61 6e 67 65 20  00004..# Change 
0e80: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 65 6e  the free-list en
0e90: 74 72 79 20 74 6f 20 70 61 67 65 20 35 20 61 6e  try to page 5 an
0ea0: 64 20 72 65 6f 70 65 6e 20 74 68 65 20 64 62 20  d reopen the db 
0eb0: 66 69 6c 65 2e 0a 64 6f 5f 74 65 73 74 20 32 2e  file..do_test 2.
0ec0: 35 20 7b 20 0a 20 20 68 65 78 69 6f 5f 77 72 69  5 { .  hexio_wri
0ed0: 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70 72  te test.db [expr
0ee0: 20 32 2a 31 30 32 34 20 2b 20 38 5d 20 30 30 30   2*1024 + 8] 000
0ef0: 30 30 30 30 35 20 0a 20 20 73 71 6c 69 74 65 33  00005 .  sqlite3
0f00: 20 64 62 20 74 65 73 74 2e 64 62 0a 7d 20 7b 7d   db test.db.} {}
0f10: 0a 0a 23 20 4e 6f 77 20 63 72 65 61 74 65 20 61  ..# Now create a
0f20: 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 20 74 68   new table in th
0f30: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0f40: 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   The root of the
0f50: 20 6e 65 77 20 74 61 62 6c 65 0a 23 20 69 73 20   new table.# is 
0f60: 70 61 67 65 20 35 2c 20 77 68 69 63 68 20 69 73  page 5, which is
0f70: 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d   also the right-
0f80: 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 20 69  most leaf page i
0f90: 6e 20 74 61 62 6c 65 20 74 31 2e 0a 23 0a 64 6f  n table t1..#.do
0fa0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e  _execsql_test 2.
0fb0: 36 20 7b 20 0a 20 20 43 52 45 41 54 45 20 54 41  6 { .  CREATE TA
0fc0: 42 4c 45 20 74 34 28 78 29 3b 0a 20 20 53 45 4c  BLE t4(x);.  SEL
0fd0: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
0fe0: 65 5f 6d 61 73 74 65 72 3b 0a 7d 20 7b 0a 20 20  e_master;.} {.  
0ff0: 74 61 62 6c 65 20 74 31 20 74 31 20 32 20 7b 43  table t1 t1 2 {C
1000: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
1010: 29 7d 20 0a 20 20 74 61 62 6c 65 20 74 34 20 74  )} .  table t4 t
1020: 34 20 35 20 7b 43 52 45 41 54 45 20 54 41 42 4c  4 5 {CREATE TABL
1030: 45 20 74 34 28 78 29 7d 0a 7d 0a 0a 64 62 5f 73  E t4(x)}.}..db_s
1040: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 66 6f  ave_and_close.fo
1050: 72 20 7b 73 65 74 20 69 20 31 32 37 7d 20 7b 24  r {set i 127} {$
1060: 69 20 3e 3d 20 30 7d 20 7b 69 6e 63 72 20 69 20  i >= 0} {incr i 
1070: 2d 31 7d 20 7b 0a 20 20 64 62 5f 72 65 73 74 6f  -1} {.  db_resto
1080: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
1090: 64 6f 5f 74 65 73 74 20 32 2e 37 2e 24 69 20 7b  do_test 2.7.$i {
10a0: 20 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b 0a   .    set res [.
10b0: 20 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b        catchsql {
10c0: 20 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54   .        INSERT
10d0: 20 49 4e 54 4f 20 74 34 20 53 45 4c 45 43 54 20   INTO t4 SELECT 
10e0: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
10f0: 72 6f 77 69 64 3c 24 69 20 4f 52 44 45 52 20 42  rowid<$i ORDER B
1100: 59 20 72 6f 77 69 64 20 44 45 53 43 20 0a 20 20  Y rowid DESC .  
1110: 20 20 20 20 7d 0a 20 20 20 20 5d 0a 20 20 20 20      }.    ].    
1120: 69 66 20 7b 24 72 65 73 20 3d 3d 20 22 30 20 7b  if {$res == "0 {
1130: 7d 22 20 7c 7c 20 24 72 65 73 20 3d 3d 20 22 31  }" || $res == "1
1140: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
1150: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
1160: 65 64 7d 22 7d 20 7b 0a 20 20 20 20 20 20 73 65  ed}"} {.      se
1170: 74 20 72 65 73 20 22 22 0a 20 20 20 20 7d 0a 20  t res "".    }. 
1180: 20 20 20 73 65 74 20 72 65 73 0a 20 20 7d 20 7b     set res.  } {
1190: 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  }.}..finish_test
11a0: 0a                                               .