System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 90cbb789ab970e2bc8e505976c4d12764e4a0551:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 34 20 32 30 30 35 2f 30 35 2f  c,v 1.4 2005/05/
0190: 32 34 20 32 32 3a 31 30 3a 32 38 20 72 6d 73 69  24 22:10:28 rmsi
01a0: 6d 70 73 6f 6e 20 45 78 70 20 24 0a 2a 2a 0a 2a  mpson Exp $.**.*
01b0: 2a 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c  * This file impl
01c0: 65 6d 65 6e 74 73 20 61 20 65 78 74 65 72 6e 61  ements a externa
01d0: 6c 20 28 64 69 73 6b 2d 62 61 73 65 64 29 20 64  l (disk-based) d
01e0: 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 42 54  atabase using BT
01f0: 72 65 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 20 64  rees..** For a d
0200: 65 74 61 69 6c 65 64 20 64 69 73 63 75 73 73 69  etailed discussi
0210: 6f 6e 20 6f 66 20 42 54 72 65 65 73 2c 20 72 65  on of BTrees, re
0220: 66 65 72 20 74 6f 0a 2a 2a 0a 2a 2a 20 20 20 20  fer to.**.**    
0230: 20 44 6f 6e 61 6c 64 20 45 2e 20 4b 6e 75 74 68   Donald E. Knuth
0240: 2c 20 54 48 45 20 41 52 54 20 4f 46 20 43 4f 4d  , THE ART OF COM
0250: 50 55 54 45 52 20 50 52 4f 47 52 41 4d 4d 49 4e  PUTER PROGRAMMIN
0260: 47 2c 20 56 6f 6c 75 6d 65 20 33 3a 0a 2a 2a 20  G, Volume 3:.** 
0270: 20 20 20 20 22 53 6f 72 74 69 6e 67 20 41 6e 64      "Sorting And
0280: 20 53 65 61 72 63 68 69 6e 67 22 2c 20 70 61 67   Searching", pag
0290: 65 73 20 34 37 33 2d 34 38 30 2e 20 41 64 64 69  es 473-480. Addi
02a0: 73 6f 6e 2d 57 65 73 6c 65 79 0a 2a 2a 20 20 20  son-Wesley.**   
02b0: 20 20 50 75 62 6c 69 73 68 69 6e 67 20 43 6f 6d    Publishing Com
02c0: 70 61 6e 79 2c 20 52 65 61 64 69 6e 67 2c 20 4d  pany, Reading, M
02d0: 61 73 73 61 63 68 75 73 65 74 74 73 2e 0a 2a 2a  assachusetts..**
02e0: 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
02f0: 65 61 20 69 73 20 74 68 61 74 20 65 61 63 68 20  ea is that each 
0300: 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
0310: 20 63 6f 6e 74 61 69 6e 73 20 4e 20 64 61 74 61   contains N data
0320: 62 61 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20  base.** entries 
0330: 61 6e 64 20 4e 2b 31 20 70 6f 69 6e 74 65 72 73  and N+1 pointers
0340: 20 74 6f 20 73 75 62 70 61 67 65 73 2e 0a 2a 2a   to subpages..**
0350: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 7c 20 20 50  ------.**   |  P
03a0: 74 72 28 30 29 20 7c 20 4b 65 79 28 30 29 20 7c  tr(0) | Key(0) |
03b0: 20 50 74 72 28 31 29 20 7c 20 4b 65 79 28 31 29   Ptr(1) | Key(1)
03c0: 20 7c 20 2e 2e 2e 20 7c 20 4b 65 79 28 4e 29 20   | ... | Key(N) 
03d0: 7c 20 50 74 72 28 4e 2b 31 29 20 7c 0a 2a 2a 20  | Ptr(N+1) |.** 
03e0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0420: 2d 2d 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  --.**.** All of 
0430: 74 68 65 20 6b 65 79 73 20 6f 6e 20 74 68 65 20  the keys on the 
0440: 70 61 67 65 20 74 68 61 74 20 50 74 72 28 30 29  page that Ptr(0)
0450: 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 76 65 20   points to have 
0460: 76 61 6c 75 65 73 20 6c 65 73 73 0a 2a 2a 20 74  values less.** t
0470: 68 61 6e 20 4b 65 79 28 30 29 2e 20 20 41 6c 6c  han Key(0).  All
0480: 20 6f 66 20 74 68 65 20 6b 65 79 73 20 6f 6e 20   of the keys on 
0490: 70 61 67 65 20 50 74 72 28 31 29 20 61 6e 64 20  page Ptr(1) and 
04a0: 69 74 73 20 73 75 62 70 61 67 65 73 20 68 61 76  its subpages hav
04b0: 65 0a 2a 2a 20 76 61 6c 75 65 73 20 67 72 65 61  e.** values grea
04c0: 74 65 72 20 74 68 61 6e 20 4b 65 79 28 30 29 20  ter than Key(0) 
04d0: 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 4b 65  and less than Ke
04e0: 79 28 31 29 2e 20 20 41 6c 6c 20 6f 66 20 74 68  y(1).  All of th
04f0: 65 20 6b 65 79 73 0a 2a 2a 20 6f 6e 20 50 74 72  e keys.** on Ptr
0500: 28 4e 2b 31 29 20 61 6e 64 20 69 74 73 20 73 75  (N+1) and its su
0510: 62 70 61 67 65 73 20 68 61 76 65 20 76 61 6c 75  bpages have valu
0520: 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  es greater than 
0530: 4b 65 79 28 4e 29 2e 20 20 41 6e 64 0a 2a 2a 20  Key(N).  And.** 
0540: 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20  so forth..**.** 
0550: 46 69 6e 64 69 6e 67 20 61 20 70 61 72 74 69 63  Finding a partic
0560: 75 6c 61 72 20 6b 65 79 20 72 65 71 75 69 72 65  ular key require
0570: 73 20 72 65 61 64 69 6e 67 20 4f 28 6c 6f 67 28  s reading O(log(
0580: 4d 29 29 20 70 61 67 65 73 20 66 72 6f 6d 20 74  M)) pages from t
0590: 68 65 20 0a 2a 2a 20 64 69 73 6b 20 77 68 65 72  he .** disk wher
05a0: 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e M is the numbe
05b0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
05c0: 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
05d0: 49 6e 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e  In this implemen
05e0: 74 61 74 69 6f 6e 2c 20 61 20 73 69 6e 67 6c 65  tation, a single
05f0: 20 66 69 6c 65 20 63 61 6e 20 68 6f 6c 64 20 6f   file can hold o
0600: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  ne or more separ
0610: 61 74 65 20 0a 2a 2a 20 42 54 72 65 65 73 2e 20  ate .** BTrees. 
0620: 20 45 61 63 68 20 42 54 72 65 65 20 69 73 20 69   Each BTree is i
0630: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
0640: 20 69 6e 64 65 78 20 6f 66 20 69 74 73 20 72 6f   index of its ro
0650: 6f 74 20 70 61 67 65 2e 20 20 54 68 65 0a 2a 2a  ot page.  The.**
0660: 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 66 6f   key and data fo
0670: 72 20 61 6e 79 20 65 6e 74 72 79 20 61 72 65 20  r any entry are 
0680: 63 6f 6d 62 69 6e 65 64 20 74 6f 20 66 6f 72 6d  combined to form
0690: 20 74 68 65 20 22 70 61 79 6c 6f 61 64 22 2e 20   the "payload". 
06a0: 20 41 0a 2a 2a 20 66 69 78 65 64 20 61 6d 6f 75   A.** fixed amou
06b0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 63 61  nt of payload ca
06c0: 6e 20 62 65 20 63 61 72 72 69 65 64 20 64 69 72  n be carried dir
06d0: 65 63 74 6c 79 20 6f 6e 20 74 68 65 20 64 61 74  ectly on the dat
06e0: 61 62 61 73 65 0a 2a 2a 20 70 61 67 65 2e 20 20  abase.** page.  
06f0: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69  If the payload i
0700: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
0710: 65 20 70 72 65 73 65 74 20 61 6d 6f 75 6e 74 20  e preset amount 
0720: 74 68 65 6e 20 73 75 72 70 6c 75 73 0a 2a 2a 20  then surplus.** 
0730: 62 79 74 65 73 20 61 72 65 20 73 74 6f 72 65 64  bytes are stored
0740: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
0750: 65 73 2e 20 20 54 68 65 20 70 61 79 6c 6f 61 64  es.  The payload
0760: 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 0a 2a 2a   for an entry.**
0770: 20 61 6e 64 20 74 68 65 20 70 72 65 63 65 64 69   and the precedi
0780: 6e 67 20 70 6f 69 6e 74 65 72 20 61 72 65 20 63  ng pointer are c
0790: 6f 6d 62 69 6e 65 64 20 74 6f 20 66 6f 72 6d 20  ombined to form 
07a0: 61 20 22 43 65 6c 6c 22 2e 20 20 45 61 63 68 20  a "Cell".  Each 
07b0: 0a 2a 2a 20 70 61 67 65 20 68 61 73 20 61 20 73  .** page has a s
07c0: 6d 61 6c 6c 20 68 65 61 64 65 72 20 77 68 69 63  mall header whic
07d0: 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 50  h contains the P
07e0: 74 72 28 4e 2b 31 29 20 70 6f 69 6e 74 65 72 20  tr(N+1) pointer 
07f0: 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 69 6e 66  and other.** inf
0800: 6f 72 6d 61 74 69 6f 6e 20 73 75 63 68 20 61 73  ormation such as
0810: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 6b 65 79   the size of key
0820: 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a   and data..**.**
0830: 20 46 4f 52 4d 41 54 20 44 45 54 41 49 4c 53 0a   FORMAT DETAILS.
0840: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 69  **.** The file i
0850: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 70  s divided into p
0860: 61 67 65 73 2e 20 20 54 68 65 20 66 69 72 73 74  ages.  The first
0870: 20 70 61 67 65 20 69 73 20 63 61 6c 6c 65 64 20   page is called 
0880: 70 61 67 65 20 31 2c 0a 2a 2a 20 74 68 65 20 73  page 1,.** the s
0890: 65 63 6f 6e 64 20 69 73 20 70 61 67 65 20 32 2c  econd is page 2,
08a0: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   and so forth.  
08b0: 41 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  A page number of
08c0: 20 7a 65 72 6f 20 69 6e 64 69 63 61 74 65 73 0a   zero indicates.
08d0: 2a 2a 20 22 6e 6f 20 73 75 63 68 20 70 61 67 65  ** "no such page
08e0: 22 2e 20 20 54 68 65 20 70 61 67 65 20 73 69 7a  ".  The page siz
08f0: 65 20 63 61 6e 20 62 65 20 61 6e 79 74 68 69 6e  e can be anythin
0900: 67 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  g between 512 an
0910: 64 20 36 35 35 33 36 2e 0a 2a 2a 20 45 61 63 68  d 65536..** Each
0920: 20 70 61 67 65 20 63 61 6e 20 62 65 20 65 69 74   page can be eit
0930: 68 65 72 20 61 20 62 74 72 65 65 20 70 61 67 65  her a btree page
0940: 2c 20 61 20 66 72 65 65 6c 69 73 74 20 70 61 67  , a freelist pag
0950: 65 20 6f 72 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e or an overflow
0960: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
0970: 54 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  The first page i
0980: 73 20 61 6c 77 61 79 73 20 61 20 62 74 72 65 65  s always a btree
0990: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
09a0: 74 20 31 30 30 20 62 79 74 65 73 20 6f 66 20 74  t 100 bytes of t
09b0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 70 61 67 65  he first.** page
09c0: 20 63 6f 6e 74 61 69 6e 20 61 20 73 70 65 63 69   contain a speci
09d0: 61 6c 20 68 65 61 64 65 72 20 28 74 68 65 20 22  al header (the "
09e0: 66 69 6c 65 20 68 65 61 64 65 72 22 29 20 74 68  file header") th
09f0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
0a00: 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 66 6f   file..** The fo
0a10: 72 6d 61 74 20 6f 66 20 74 68 65 20 66 69 6c 65  rmat of the file
0a20: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
0a30: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
0a40: 46 46 53 45 54 20 20 20 53 49 5a 45 20 20 20 20  FFSET   SIZE    
0a50: 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20 20  DESCRIPTION.**  
0a60: 20 20 20 20 30 20 20 20 20 20 20 31 36 20 20 20      0      16   
0a70: 20 20 48 65 61 64 65 72 20 73 74 72 69 6e 67 3a    Header string:
0a80: 20 22 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20   "SQLite format 
0a90: 33 5c 30 30 30 22 0a 2a 2a 20 20 20 20 20 31 36  3\000".**     16
0aa0: 20 20 20 20 20 20 20 32 20 20 20 20 20 50 61 67         2     Pag
0ab0: 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 2e  e size in bytes.
0ac0: 20 20 0a 2a 2a 20 20 20 20 20 31 38 20 20 20 20    .**     18    
0ad0: 20 20 20 31 20 20 20 20 20 46 69 6c 65 20 66 6f     1     File fo
0ae0: 72 6d 61 74 20 77 72 69 74 65 20 76 65 72 73 69  rmat write versi
0af0: 6f 6e 0a 2a 2a 20 20 20 20 20 31 39 20 20 20 20  on.**     19    
0b00: 20 20 20 31 20 20 20 20 20 46 69 6c 65 20 66 6f     1     File fo
0b10: 72 6d 61 74 20 72 65 61 64 20 76 65 72 73 69 6f  rmat read versio
0b20: 6e 0a 2a 2a 20 20 20 20 20 32 30 20 20 20 20 20  n.**     20     
0b30: 20 20 31 20 20 20 20 20 42 79 74 65 73 20 6f 66    1     Bytes of
0b40: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74   unused space at
0b50: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
0b60: 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 32 31 20   page.**     21 
0b70: 20 20 20 20 20 20 31 20 20 20 20 20 4d 61 78 20        1     Max 
0b80: 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
0b90: 20 66 72 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20   fraction.**    
0ba0: 20 32 32 20 20 20 20 20 20 20 31 20 20 20 20 20   22       1     
0bb0: 4d 69 6e 20 65 6d 62 65 64 64 65 64 20 70 61 79  Min embedded pay
0bc0: 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a 2a  load fraction.**
0bd0: 20 20 20 20 20 32 33 20 20 20 20 20 20 20 31 20       23       1 
0be0: 20 20 20 20 4d 69 6e 20 6c 65 61 66 20 70 61 79      Min leaf pay
0bf0: 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a 2a  load fraction.**
0c00: 20 20 20 20 20 32 34 20 20 20 20 20 20 20 34 20       24       4 
0c10: 20 20 20 20 46 69 6c 65 20 63 68 61 6e 67 65 20      File change 
0c20: 63 6f 75 6e 74 65 72 0a 2a 2a 20 20 20 20 20 32  counter.**     2
0c30: 38 20 20 20 20 20 20 20 34 20 20 20 20 20 52 65  8       4     Re
0c40: 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
0c50: 65 20 75 73 65 0a 2a 2a 20 20 20 20 20 33 32 20  e use.**     32 
0c60: 20 20 20 20 20 20 34 20 20 20 20 20 46 69 72 73        4     Firs
0c70: 74 20 66 72 65 65 6c 69 73 74 20 70 61 67 65 0a  t freelist page.
0c80: 2a 2a 20 20 20 20 20 33 36 20 20 20 20 20 20 20  **     36       
0c90: 34 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20  4     Number of 
0ca0: 66 72 65 65 6c 69 73 74 20 70 61 67 65 73 20 69  freelist pages i
0cb0: 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  n the file.**   
0cc0: 20 20 34 30 20 20 20 20 20 20 36 30 20 20 20 20    40      60    
0cd0: 20 31 35 20 34 2d 62 79 74 65 20 6d 65 74 61 20   15 4-byte meta 
0ce0: 76 61 6c 75 65 73 20 70 61 73 73 65 64 20 74 6f  values passed to
0cf0: 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 0a 2a   higher layers.*
0d00: 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
0d10: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 61  integer values a
0d20: 72 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 28 6d  re big-endian (m
0d30: 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20  ost significant 
0d40: 62 79 74 65 20 66 69 72 73 74 29 2e 0a 2a 2a 0a  byte first)..**.
0d50: 2a 2a 20 54 68 65 20 66 69 6c 65 20 63 68 61 6e  ** The file chan
0d60: 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e  ge counter is in
0d70: 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 20 74  cremented when t
0d80: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
0d90: 68 61 6e 67 65 64 20 6d 6f 72 65 0a 2a 2a 20 74  hanged more.** t
0da0: 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20  han once within 
0db0: 74 68 65 20 73 61 6d 65 20 73 65 63 6f 6e 64 2e  the same second.
0dc0: 20 20 54 68 69 73 20 63 6f 75 6e 74 65 72 2c 20    This counter, 
0dd0: 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68  together with th
0de0: 65 0a 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f  e.** modificatio
0df0: 6e 20 74 69 6d 65 20 6f 66 20 74 68 65 20 66 69  n time of the fi
0e00: 6c 65 2c 20 61 6c 6c 6f 77 73 20 6f 74 68 65 72  le, allows other
0e10: 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20 6b 6e   processes to kn
0e20: 6f 77 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 66  ow.** when the f
0e30: 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
0e40: 61 6e 64 20 74 68 75 73 20 77 68 65 6e 20 74 68  and thus when th
0e50: 65 79 20 6e 65 65 64 20 74 6f 20 66 6c 75 73 68  ey need to flush
0e60: 20 74 68 65 69 72 0a 2a 2a 20 63 61 63 68 65 2e   their.** cache.
0e70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 20 65  .**.** The max e
0e80: 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 20  mbedded payload 
0e90: 66 72 61 63 74 69 6f 6e 20 69 73 20 74 68 65 20  fraction is the 
0ea0: 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 74 6f  amount of the to
0eb0: 74 61 6c 20 75 73 61 62 6c 65 0a 2a 2a 20 73 70  tal usable.** sp
0ec0: 61 63 65 20 69 6e 20 61 20 70 61 67 65 20 74 68  ace in a page th
0ed0: 61 74 20 63 61 6e 20 62 65 20 63 6f 6e 73 75 6d  at can be consum
0ee0: 65 64 20 62 79 20 61 20 73 69 6e 67 6c 65 20 63  ed by a single c
0ef0: 65 6c 6c 20 66 6f 72 20 73 74 61 6e 64 61 72 64  ell for standard
0f00: 0a 2a 2a 20 42 2d 74 72 65 65 20 28 6e 6f 6e 2d  .** B-tree (non-
0f10: 4c 45 41 46 44 41 54 41 29 20 74 61 62 6c 65 73  LEAFDATA) tables
0f20: 2e 20 20 41 20 76 61 6c 75 65 20 6f 66 20 32 35  .  A value of 25
0f30: 35 20 6d 65 61 6e 73 20 31 30 30 25 2e 20 20 54  5 means 100%.  T
0f40: 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 69 73  he default.** is
0f50: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6d 61   to limit the ma
0f60: 78 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  ximum cell size 
0f70: 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
0f80: 20 34 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69   4 cells will fi
0f90: 74 0a 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61 67 65  t.** on one page
0fa0: 2e 20 20 54 68 75 73 20 74 68 65 20 64 65 66 61  .  Thus the defa
0fb0: 75 6c 74 20 6d 61 78 20 65 6d 62 65 64 64 65 64  ult max embedded
0fc0: 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f   payload fractio
0fd0: 6e 20 69 73 20 36 34 2e 0a 2a 2a 0a 2a 2a 20 49  n is 64..**.** I
0fe0: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f  f the payload fo
0ff0: 72 20 61 20 63 65 6c 6c 20 69 73 20 6c 61 72 67  r a cell is larg
1000: 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78 20  er than the max 
1010: 70 61 79 6c 6f 61 64 2c 20 74 68 65 6e 20 65 78  payload, then ex
1020: 74 72 61 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 69  tra.** payload i
1030: 73 20 73 70 69 6c 6c 65 64 20 74 6f 20 6f 76 65  s spilled to ove
1040: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 4f 6e  rflow pages.  On
1050: 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
1060: 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  age is allocated
1070: 2c 0a 2a 2a 20 61 73 20 6d 61 6e 79 20 62 79 74  ,.** as many byt
1080: 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 61  es as possible a
1090: 72 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68  re moved into th
10a0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
10b0: 20 77 69 74 68 6f 75 74 20 6c 65 74 74 69 6e 67   without letting
10c0: 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 73 69 7a  .** the cell siz
10d0: 65 20 64 72 6f 70 20 62 65 6c 6f 77 20 74 68 65  e drop below the
10e0: 20 6d 69 6e 20 65 6d 62 65 64 64 65 64 20 70 61   min embedded pa
10f0: 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 2e 0a  yload fraction..
1100: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 20 6c 65  **.** The min le
1110: 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  af payload fract
1120: 69 6f 6e 20 69 73 20 6c 69 6b 65 20 74 68 65 20  ion is like the 
1130: 6d 69 6e 20 65 6d 62 65 64 64 65 64 20 70 61 79  min embedded pay
1140: 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a 2a  load fraction.**
1150: 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20   except that it 
1160: 61 70 70 6c 69 65 73 20 74 6f 20 6c 65 61 66 20  applies to leaf 
1170: 6e 6f 64 65 73 20 69 6e 20 61 20 4c 45 41 46 44  nodes in a LEAFD
1180: 41 54 41 20 74 72 65 65 2e 20 20 54 68 65 20 6d  ATA tree.  The m
1190: 61 78 69 6d 75 6d 0a 2a 2a 20 70 61 79 6c 6f 61  aximum.** payloa
11a0: 64 20 66 72 61 63 74 69 6f 6e 20 66 6f 72 20 61  d fraction for a
11b0: 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 69   LEAFDATA tree i
11c0: 73 20 61 6c 77 61 79 73 20 31 30 30 25 20 28 6f  s always 100% (o
11d0: 72 20 32 35 35 29 20 61 6e 64 20 69 74 0a 2a 2a  r 255) and it.**
11e0: 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 69   not specified i
11f0: 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
1200: 0a 2a 2a 20 45 61 63 68 20 62 74 72 65 65 20 70  .** Each btree p
1210: 61 67 65 73 20 69 73 20 64 69 76 69 64 65 64 20  ages is divided 
1220: 69 6e 74 6f 20 74 68 72 65 65 20 73 65 63 74 69  into three secti
1230: 6f 6e 73 3a 20 20 54 68 65 20 68 65 61 64 65 72  ons:  The header
1240: 2c 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 20 70 6f  , the.** cell po
1250: 69 6e 74 65 72 20 61 72 72 61 79 2c 20 61 6e 64  inter array, and
1260: 20 74 68 65 20 63 65 6c 6c 20 61 72 65 61 20 61   the cell area a
1270: 72 65 61 2e 20 20 50 61 67 65 20 31 20 61 6c 73  rea.  Page 1 als
1280: 6f 20 68 61 73 20 61 20 31 30 30 2d 62 79 74 65  o has a 100-byte
1290: 0a 2a 2a 20 66 69 6c 65 20 68 65 61 64 65 72 20  .** file header 
12a0: 74 68 61 74 20 6f 63 63 75 72 73 20 62 65 66 6f  that occurs befo
12b0: 72 65 20 74 68 65 20 70 61 67 65 20 68 65 61 64  re the page head
12c0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 7c  er..**.**      |
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e0: 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 66 69 6c 65  |.**      | file
12f0: 20 68 65 61 64 65 72 20 20 20 20 7c 20 20 20 31   header    |   1
1300: 30 30 20 62 79 74 65 73 2e 20 20 50 61 67 65 20  00 bytes.  Page 
1310: 31 20 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20 20 20  1 only..**      
1320: 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  |---------------
1330: 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 70 61 67  -|.**      | pag
1340: 65 20 68 65 61 64 65 72 20 20 20 20 7c 20 20 20  e header    |   
1350: 38 20 62 79 74 65 73 20 66 6f 72 20 6c 65 61 76  8 bytes for leav
1360: 65 73 2e 20 20 31 32 20 62 79 74 65 73 20 66 6f  es.  12 bytes fo
1370: 72 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73  r interior nodes
1380: 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d  .**      |------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 20 20  ----------|.**  
13a0: 20 20 20 20 7c 20 63 65 6c 6c 20 70 6f 69 6e 74      | cell point
13b0: 65 72 20 20 20 7c 20 20 20 7c 20 20 32 20 62 79  er   |   |  2 by
13c0: 74 65 73 20 70 65 72 20 63 65 6c 6c 2e 20 20 53  tes per cell.  S
13d0: 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2a 20  orted order..** 
13e0: 20 20 20 20 20 7c 20 61 72 72 61 79 20 20 20 20       | array    
13f0: 20 20 20 20 20 20 7c 20 20 20 7c 20 20 47 72 6f        |   |  Gro
1400: 77 73 20 64 6f 77 6e 77 61 72 64 0a 2a 2a 20 20  ws downward.**  
1410: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1420: 20 20 20 20 20 7c 20 20 20 76 0a 2a 2a 20 20 20       |   v.**   
1430: 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     |------------
1440: 2d 2d 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20  ----|.**      | 
1450: 75 6e 61 6c 6c 6f 63 61 74 65 64 20 20 20 20 7c  unallocated    |
1460: 0a 2a 2a 20 20 20 20 20 20 7c 20 73 70 61 63 65  .**      | space
1470: 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
1480: 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      |-----------
1490: 2d 2d 2d 2d 2d 7c 20 20 20 5e 20 20 47 72 6f 77  -----|   ^  Grow
14a0: 73 20 75 70 77 61 72 64 73 0a 2a 2a 20 20 20 20  s upwards.**    
14b0: 20 20 7c 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74    | cell content
14c0: 20 20 20 7c 20 20 20 7c 20 20 41 72 62 69 74 72     |   |  Arbitr
14d0: 61 72 79 20 6f 72 64 65 72 20 69 6e 74 65 72 73  ary order inters
14e0: 70 65 72 73 65 64 20 77 69 74 68 20 66 72 65 65  persed with free
14f0: 62 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 20  blocks..**      
1500: 7c 20 61 72 65 61 20 20 20 20 20 20 20 20 20 20  | area          
1510: 20 7c 20 20 20 7c 20 20 61 6e 64 20 66 72 65 65   |   |  and free
1520: 20 73 70 61 63 65 20 66 72 61 67 6d 65 6e 74 73   space fragments
1530: 2e 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d 2d  ..**      |-----
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 0a  -----------|.**.
1550: 2a 2a 20 54 68 65 20 70 61 67 65 20 68 65 61 64  ** The page head
1560: 65 72 73 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  ers looks like t
1570: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 46 46  his:.**.**   OFF
1580: 53 45 54 20 20 20 53 49 5a 45 20 20 20 20 20 44  SET   SIZE     D
1590: 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20 20 20  ESCRIPTION.**   
15a0: 20 20 20 30 20 20 20 20 20 20 20 31 20 20 20 20     0       1    
15b0: 20 20 46 6c 61 67 73 2e 20 31 3a 20 69 6e 74 6b    Flags. 1: intk
15c0: 65 79 2c 20 32 3a 20 7a 65 72 6f 64 61 74 61 2c  ey, 2: zerodata,
15d0: 20 34 3a 20 6c 65 61 66 64 61 74 61 2c 20 38 3a   4: leafdata, 8:
15e0: 20 6c 65 61 66 0a 2a 2a 20 20 20 20 20 20 31 20   leaf.**      1 
15f0: 20 20 20 20 20 20 32 20 20 20 20 20 20 62 79 74        2      byt
1600: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
1610: 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 0a  first freeblock.
1620: 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
1630: 32 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66  2      number of
1640: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 69 73 20 70   cells on this p
1650: 61 67 65 0a 2a 2a 20 20 20 20 20 20 35 20 20 20  age.**      5   
1660: 20 20 20 20 32 20 20 20 20 20 20 66 69 72 73 74      2      first
1670: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
1680: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a  l content area.*
1690: 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 31  *      7       1
16a0: 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
16b0: 66 72 61 67 6d 65 6e 74 65 64 20 66 72 65 65 20  fragmented free 
16c0: 62 79 74 65 73 0a 2a 2a 20 20 20 20 20 20 38 20  bytes.**      8 
16d0: 20 20 20 20 20 20 34 20 20 20 20 20 20 52 69 67        4      Rig
16e0: 68 74 20 63 68 69 6c 64 20 28 74 68 65 20 50 74  ht child (the Pt
16f0: 72 28 4e 2b 31 29 20 76 61 6c 75 65 29 2e 20 20  r(N+1) value).  
1700: 4f 6d 69 74 74 65 64 20 6f 6e 20 6c 65 61 76 65  Omitted on leave
1710: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  s..**.** The fla
1720: 67 73 20 64 65 66 69 6e 65 20 74 68 65 20 66 6f  gs define the fo
1730: 72 6d 61 74 20 6f 66 20 74 68 69 73 20 62 74 72  rmat of this btr
1740: 65 65 20 70 61 67 65 2e 20 20 54 68 65 20 6c 65  ee page.  The le
1750: 61 66 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68  af flag means th
1760: 61 74 0a 2a 2a 20 74 68 69 73 20 70 61 67 65 20  at.** this page 
1770: 68 61 73 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2e  has no children.
1780: 20 20 54 68 65 20 7a 65 72 6f 64 61 74 61 20 66    The zerodata f
1790: 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74  lag means that t
17a0: 68 69 73 20 70 61 67 65 20 63 61 72 72 69 65 73  his page carries
17b0: 0a 2a 2a 20 6f 6e 6c 79 20 6b 65 79 73 20 61 6e  .** only keys an
17c0: 64 20 6e 6f 20 64 61 74 61 2e 20 20 54 68 65 20  d no data.  The 
17d0: 69 6e 74 6b 65 79 20 66 6c 61 67 20 6d 65 61 6e  intkey flag mean
17e0: 73 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 69  s that the key i
17f0: 73 20 61 20 69 6e 74 65 67 65 72 0a 2a 2a 20 77  s a integer.** w
1800: 68 69 63 68 20 69 73 20 73 74 6f 72 65 64 20 69  hich is stored i
1810: 6e 20 74 68 65 20 6b 65 79 20 73 69 7a 65 20 65  n the key size e
1820: 6e 74 72 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  ntry of the cell
1830: 20 68 65 61 64 65 72 20 72 61 74 68 65 72 20 74   header rather t
1840: 68 61 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 70 61  han in.** the pa
1850: 79 6c 6f 61 64 20 61 72 65 61 2e 0a 2a 2a 0a 2a  yload area..**.*
1860: 2a 20 54 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  * The cell point
1870: 65 72 20 61 72 72 61 79 20 62 65 67 69 6e 73 20  er array begins 
1880: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 62 79 74  on the first byt
1890: 65 20 61 66 74 65 72 20 74 68 65 20 70 61 67 65  e after the page
18a0: 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 65 20   header..** The 
18b0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
18c0: 61 79 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  ay contains zero
18d0: 20 6f 72 20 6d 6f 72 65 20 32 2d 62 79 74 65 20   or more 2-byte 
18e0: 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
18f0: 65 0a 2a 2a 20 6f 66 66 73 65 74 73 20 66 72 6f  e.** offsets fro
1900: 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
1910: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  of the page to t
1920: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
1930: 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 63  in the cell.** c
1940: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
1950: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20  e cell pointers 
1960: 6f 63 63 75 72 20 69 6e 20 73 6f 72 74 65 64 20  occur in sorted 
1970: 6f 72 64 65 72 2e 20 20 54 68 65 20 73 79 73 74  order.  The syst
1980: 65 6d 20 73 74 72 69 76 65 73 0a 2a 2a 20 74 6f  em strives.** to
1990: 20 6b 65 65 70 20 66 72 65 65 20 73 70 61 63 65   keep free space
19a0: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
19b0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 73 6f 20  cell pointer so 
19c0: 74 68 61 74 20 6e 65 77 20 63 65 6c 6c 73 20 63  that new cells c
19d0: 61 6e 0a 2a 2a 20 62 65 20 65 61 73 69 6c 79 20  an.** be easily 
19e0: 61 64 64 65 64 20 77 69 74 68 6f 75 74 20 68 61  added without ha
19f0: 76 69 6e 67 20 74 6f 20 64 65 66 72 61 67 6d 65  ving to defragme
1a00: 6e 74 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  nt the page..**.
1a10: 2a 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ** Cell content 
1a20: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
1a30: 20 76 65 72 79 20 65 6e 64 20 6f 66 20 74 68 65   very end of the
1a40: 20 70 61 67 65 20 61 6e 64 20 67 72 6f 77 73 20   page and grows 
1a50: 74 6f 77 61 72 64 20 74 68 65 0a 2a 2a 20 62 65  toward the.** be
1a60: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70  ginning of the p
1a70: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 55 6e 75 73 65  age..**.** Unuse
1a80: 64 20 73 70 61 63 65 20 77 69 74 68 69 6e 20 74  d space within t
1a90: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
1aa0: 61 72 65 61 20 69 73 20 63 6f 6c 6c 65 63 74 65  area is collecte
1ab0: 64 20 69 6e 74 6f 20 61 20 6c 69 6e 6b 65 64 20  d into a linked 
1ac0: 6c 69 73 74 20 6f 66 0a 2a 2a 20 66 72 65 65 62  list of.** freeb
1ad0: 6c 6f 63 6b 73 2e 20 20 45 61 63 68 20 66 72 65  locks.  Each fre
1ae0: 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 6c 65 61  eblock is at lea
1af0: 73 74 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  st 4 bytes in si
1b00: 7a 65 2e 20 20 54 68 65 20 62 79 74 65 20 6f 66  ze.  The byte of
1b10: 66 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 66  fset.** to the f
1b20: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 69  irst freeblock i
1b30: 73 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 68  s given in the h
1b40: 65 61 64 65 72 2e 20 20 46 72 65 65 62 6c 6f 63  eader.  Freebloc
1b50: 6b 73 20 6f 63 63 75 72 20 69 6e 0a 2a 2a 20 69  ks occur in.** i
1b60: 6e 63 72 65 61 73 69 6e 67 20 6f 72 64 65 72 2e  ncreasing order.
1b70: 20 20 42 65 63 61 75 73 65 20 61 20 66 72 65 65    Because a free
1b80: 62 6c 6f 63 6b 20 6d 75 73 74 20 62 65 20 61 74  block must be at
1b90: 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 69   least 4 bytes i
1ba0: 6e 20 73 69 7a 65 2c 0a 2a 2a 20 61 6e 79 20 67  n size,.** any g
1bb0: 72 6f 75 70 20 6f 66 20 33 20 6f 72 20 66 65 77  roup of 3 or few
1bc0: 65 72 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  er unused bytes 
1bd0: 69 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  in the cell cont
1be0: 65 6e 74 20 61 72 65 61 20 63 61 6e 6e 6f 74 0a  ent area cannot.
1bf0: 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
1c00: 66 72 65 65 62 6c 6f 63 6b 20 63 68 61 69 6e 2e  freeblock chain.
1c10: 20 20 41 20 67 72 6f 75 70 20 6f 66 20 33 20 6f    A group of 3 o
1c20: 72 20 66 65 77 65 72 20 66 72 65 65 20 62 79 74  r fewer free byt
1c30: 65 73 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  es is called.** 
1c40: 61 20 66 72 61 67 6d 65 6e 74 2e 20 20 54 68 65  a fragment.  The
1c50: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1c60: 20 62 79 74 65 73 20 69 6e 20 61 6c 6c 20 66 72   bytes in all fr
1c70: 61 67 6d 65 6e 74 73 20 69 73 20 72 65 63 6f 72  agments is recor
1c80: 64 65 64 2e 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ded..** in the p
1c90: 61 67 65 20 68 65 61 64 65 72 20 61 74 20 6f 66  age header at of
1ca0: 66 73 65 74 20 37 2e 0a 2a 2a 0a 2a 2a 20 20 20  fset 7..**.**   
1cb0: 20 53 49 5a 45 20 20 20 20 44 45 53 43 52 49 50   SIZE    DESCRIP
1cc0: 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 32 20 20  TION.**      2  
1cd0: 20 20 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f     Byte offset o
1ce0: 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62  f the next freeb
1cf0: 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 20 32 20 20  lock.**      2  
1d00: 20 20 20 42 79 74 65 73 20 69 6e 20 74 68 69 73     Bytes in this
1d10: 20 66 72 65 65 62 6c 6f 63 6b 0a 2a 2a 0a 2a 2a   freeblock.**.**
1d20: 20 43 65 6c 6c 73 20 61 72 65 20 6f 66 20 76 61   Cells are of va
1d30: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 2e 20 20  riable length.  
1d40: 43 65 6c 6c 73 20 61 72 65 20 73 74 6f 72 65 64  Cells are stored
1d50: 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   in the cell con
1d60: 74 65 6e 74 20 61 72 65 61 20 61 74 0a 2a 2a 20  tent area at.** 
1d70: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
1d80: 61 67 65 2e 20 20 50 6f 69 6e 74 65 72 73 20 74  age.  Pointers t
1d90: 6f 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20  o the cells are 
1da0: 69 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  in the cell poin
1db0: 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 74 68 61  ter array.** tha
1dc0: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
1dd0: 6c 6c 6f 77 73 20 74 68 65 20 70 61 67 65 20 68  llows the page h
1de0: 65 61 64 65 72 2e 20 20 43 65 6c 6c 73 20 69 73  eader.  Cells is
1df0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1e00: 0a 2a 2a 20 63 6f 6e 74 69 67 75 6f 75 73 20 6f  .** contiguous o
1e10: 72 20 69 6e 20 6f 72 64 65 72 2c 20 62 75 74 20  r in order, but 
1e20: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 72  cell pointers ar
1e30: 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 6e 64  e contiguous and
1e40: 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a   in order..**.**
1e50: 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6d 61   Cell content ma
1e60: 6b 65 73 20 75 73 65 20 6f 66 20 76 61 72 69 61  kes use of varia
1e70: 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
1e80: 65 72 73 2e 20 20 41 20 76 61 72 69 61 62 6c 65  ers.  A variable
1e90: 0a 2a 2a 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  .** length integ
1ea0: 65 72 20 69 73 20 31 20 74 6f 20 39 20 62 79 74  er is 1 to 9 byt
1eb0: 65 73 20 77 68 65 72 65 20 74 68 65 20 6c 6f 77  es where the low
1ec0: 65 72 20 37 20 62 69 74 73 20 6f 66 20 65 61 63  er 7 bits of eac
1ed0: 68 20 0a 2a 2a 20 62 79 74 65 20 61 72 65 20 75  h .** byte are u
1ee0: 73 65 64 2e 20 20 54 68 65 20 69 6e 74 65 67 65  sed.  The intege
1ef0: 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6c  r consists of al
1f00: 6c 20 62 79 74 65 73 20 74 68 61 74 20 68 61 76  l bytes that hav
1f10: 65 20 62 69 74 20 38 20 73 65 74 20 61 6e 64 0a  e bit 8 set and.
1f20: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
1f30: 65 20 77 69 74 68 20 62 69 74 20 38 20 63 6c 65  e with bit 8 cle
1f40: 61 72 2e 20 20 54 68 65 20 6d 6f 73 74 20 73 69  ar.  The most si
1f50: 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65 20 6f  gnificant byte o
1f60: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
1f70: 20 61 70 70 65 61 72 73 20 66 69 72 73 74 2e 20   appears first. 
1f80: 20 41 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67   A variable-leng
1f90: 74 68 20 69 6e 74 65 67 65 72 20 6d 61 79 20 6e  th integer may n
1fa0: 6f 74 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ot be more than 
1fb0: 39 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a  9 bytes long..**
1fc0: 20 41 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   As a special ca
1fd0: 73 65 2c 20 61 6c 6c 20 38 20 62 79 74 65 73 20  se, all 8 bytes 
1fe0: 6f 66 20 74 68 65 20 39 74 68 20 62 79 74 65 20  of the 9th byte 
1ff0: 61 72 65 20 75 73 65 64 20 61 73 20 64 61 74 61  are used as data
2000: 2e 20 20 54 68 69 73 0a 2a 2a 20 61 6c 6c 6f 77  .  This.** allow
2010: 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  s a 64-bit integ
2020: 65 72 20 74 6f 20 62 65 20 65 6e 63 6f 64 65 64  er to be encoded
2030: 20 69 6e 20 39 20 62 79 74 65 73 2e 0a 2a 2a 0a   in 9 bytes..**.
2040: 2a 2a 20 20 20 20 30 78 30 30 20 20 20 20 20 20  **    0x00      
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30 30  becomes  0x00000
2070: 30 30 30 0a 2a 2a 20 20 20 20 30 78 37 66 20 20  000.**    0x7f  
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 62 65 63 6f 6d 65 73 20 20 30 78 30      becomes  0x0
20a0: 30 30 30 30 30 37 66 0a 2a 2a 20 20 20 20 30 78  000007f.**    0x
20b0: 38 31 20 30 78 30 30 20 20 20 20 20 20 20 20 20  81 0x00         
20c0: 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20          becomes 
20d0: 20 30 78 30 30 30 30 30 30 38 30 0a 2a 2a 20 20   0x00000080.**  
20e0: 20 20 30 78 38 32 20 30 78 30 30 20 20 20 20 20    0x82 0x00     
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63 6f              beco
2100: 6d 65 73 20 20 30 78 30 30 30 30 30 31 30 30 0a  mes  0x00000100.
2110: 2a 2a 20 20 20 20 30 78 38 30 20 30 78 37 66 20  **    0x80 0x7f 
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30 30  becomes  0x00000
2140: 30 37 66 0a 2a 2a 20 20 20 20 30 78 38 61 20 30  07f.**    0x8a 0
2150: 78 39 31 20 30 78 64 31 20 30 78 61 63 20 30 78  x91 0xd1 0xac 0x
2160: 37 38 20 20 62 65 63 6f 6d 65 73 20 20 30 78 31  78  becomes  0x1
2170: 32 33 34 35 36 37 38 0a 2a 2a 20 20 20 20 30 78  2345678.**    0x
2180: 38 31 20 30 78 38 31 20 30 78 38 31 20 30 78 38  81 0x81 0x81 0x8
2190: 31 20 30 78 30 31 20 20 62 65 63 6f 6d 65 73 20  1 0x01  becomes 
21a0: 20 30 78 31 30 32 30 34 30 38 31 0a 2a 2a 0a 2a   0x10204081.**.*
21b0: 2a 20 56 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  * Variable lengt
21c0: 68 20 69 6e 74 65 67 65 72 73 20 61 72 65 20 75  h integers are u
21d0: 73 65 64 20 66 6f 72 20 72 6f 77 69 64 73 20 61  sed for rowids a
21e0: 6e 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  nd to hold the n
21f0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65  umber of.** byte
2200: 73 20 6f 66 20 6b 65 79 20 61 6e 64 20 64 61 74  s of key and dat
2210: 61 20 69 6e 20 61 20 62 74 72 65 65 20 63 65 6c  a in a btree cel
2220: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  l..**.** The con
2230: 74 65 6e 74 20 6f 66 20 61 20 63 65 6c 6c 20 6c  tent of a cell l
2240: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
2250: 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20 20  **.**    SIZE   
2260: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
2270: 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65 20       4     Page 
2280: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c 65  number of the le
2290: 66 74 20 63 68 69 6c 64 2e 20 4f 6d 69 74 74 65  ft child. Omitte
22a0: 64 20 69 66 20 6c 65 61 66 20 66 6c 61 67 20 69  d if leaf flag i
22b0: 73 20 73 65 74 2e 0a 2a 2a 20 20 20 20 20 76 61  s set..**     va
22c0: 72 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62  r    Number of b
22d0: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 20 4f 6d  ytes of data. Om
22e0: 69 74 74 65 64 20 69 66 20 74 68 65 20 7a 65 72  itted if the zer
22f0: 6f 64 61 74 61 20 66 6c 61 67 20 69 73 20 73 65  odata flag is se
2300: 74 2e 0a 2a 2a 20 20 20 20 20 76 61 72 20 20 20  t..**     var   
2310: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2320: 20 6f 66 20 6b 65 79 2e 20 4f 72 20 74 68 65 20   of key. Or the 
2330: 6b 65 79 20 69 74 73 65 6c 66 20 69 66 20 69 6e  key itself if in
2340: 74 6b 65 79 20 66 6c 61 67 20 69 73 20 73 65 74  tkey flag is set
2350: 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 20 20 20  ..**      *     
2360: 50 61 79 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20  Payload.**      
2370: 34 20 20 20 20 20 46 69 72 73 74 20 70 61 67 65  4     First page
2380: 20 6f 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   of the overflow
2390: 20 63 68 61 69 6e 2e 20 20 4f 6d 69 74 74 65 64   chain.  Omitted
23a0: 20 69 66 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   if no overflow.
23b0: 2a 2a 0a 2a 2a 20 4f 76 65 72 66 6c 6f 77 20 70  **.** Overflow p
23c0: 61 67 65 73 20 66 6f 72 6d 20 61 20 6c 69 6e 6b  ages form a link
23d0: 65 64 20 6c 69 73 74 2e 20 20 45 61 63 68 20 70  ed list.  Each p
23e0: 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20 6c  age except the l
23f0: 61 73 74 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ast is completel
2400: 79 0a 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68  y.** filled with
2410: 20 64 61 74 61 20 28 70 61 67 65 73 69 7a 65 20   data (pagesize 
2420: 2d 20 34 20 62 79 74 65 73 29 2e 20 20 54 68 65  - 4 bytes).  The
2430: 20 6c 61 73 74 20 70 61 67 65 20 63 61 6e 20 68   last page can h
2440: 61 76 65 20 61 73 20 6c 69 74 74 6c 65 0a 2a 2a  ave as little.**
2450: 20 61 73 20 31 20 62 79 74 65 20 6f 66 20 64 61   as 1 byte of da
2460: 74 61 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a  ta..**.**    SIZ
2470: 45 20 20 20 20 44 45 53 43 52 49 50 54 49 4f 4e  E    DESCRIPTION
2480: 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 50  .**      4     P
2490: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65  age number of ne
24a0: 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
24b0: 0a 2a 2a 20 20 20 20 20 20 2a 20 20 20 20 20 44  .**      *     D
24c0: 61 74 61 0a 2a 2a 0a 2a 2a 20 46 72 65 65 6c 69  ata.**.** Freeli
24d0: 73 74 20 70 61 67 65 73 20 63 6f 6d 65 20 69 6e  st pages come in
24e0: 20 74 77 6f 20 73 75 62 74 79 70 65 73 3a 20 74   two subtypes: t
24f0: 72 75 6e 6b 20 70 61 67 65 73 20 61 6e 64 20 6c  runk pages and l
2500: 65 61 66 20 70 61 67 65 73 2e 20 20 54 68 65 0a  eaf pages.  The.
2510: 2a 2a 20 66 69 6c 65 20 68 65 61 64 65 72 20 70  ** file header p
2520: 6f 69 6e 74 73 20 74 6f 20 66 69 72 73 74 20 69  oints to first i
2530: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
2540: 6f 66 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 20  of trunk page.  
2550: 45 61 63 68 20 74 72 75 6e 6b 0a 2a 2a 20 70 61  Each trunk.** pa
2560: 67 65 20 70 6f 69 6e 74 73 20 74 6f 20 6d 75 6c  ge points to mul
2570: 74 69 70 6c 65 20 6c 65 61 66 20 70 61 67 65 73  tiple leaf pages
2580: 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  .  The content o
2590: 66 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  f a leaf page is
25a0: 0a 2a 2a 20 75 6e 73 70 65 63 69 66 69 65 64 2e  .** unspecified.
25b0: 20 20 41 20 74 72 75 6e 6b 20 70 61 67 65 20 6c    A trunk page l
25c0: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
25d0: 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20 20  **.**    SIZE   
25e0: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
25f0: 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65 20       4     Page 
2600: 6e 75 6d 62 65 72 20 6f 66 20 6e 65 78 74 20 74  number of next t
2610: 72 75 6e 6b 20 70 61 67 65 0a 2a 2a 20 20 20 20  runk page.**    
2620: 20 20 34 20 20 20 20 20 4e 75 6d 62 65 72 20 6f    4     Number o
2630: 66 20 6c 65 61 66 20 70 6f 69 6e 74 65 72 73 20  f leaf pointers 
2640: 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a 20  on this page.** 
2650: 20 20 20 20 20 2a 20 20 20 20 20 7a 65 72 6f 20       *     zero 
2660: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 6e 75  or more pages nu
2670: 6d 62 65 72 73 20 6f 66 20 6c 65 61 76 65 73 0a  mbers of leaves.
2680: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
2690: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
26a0: 64 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69 6e  de "pager.h".#in
26b0: 63 6c 75 64 65 20 22 62 74 72 65 65 2e 68 22 0a  clude "btree.h".
26c0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
26d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
26e0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .h>../*.** This 
26f0: 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c  macro rounds val
2700: 75 65 73 20 75 70 20 73 6f 20 74 68 61 74 20 69  ues up so that i
2710: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
2720: 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a 20  n address it.** 
2730: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2740: 20 62 65 20 61 6e 20 61 64 64 72 65 73 73 20 74   be an address t
2750: 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20 74  hat is aligned t
2760: 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  o an 8-byte boun
2770: 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  dary..*/.#define
2780: 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
2790: 28 58 29 20 20 20 28 28 28 58 29 2b 37 29 26 7e  (X)   (((X)+7)&~
27a0: 37 29 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  7)../* The follo
27b0: 77 69 6e 67 20 76 61 6c 75 65 20 69 73 20 74 68  wing value is th
27c0: 65 20 6d 61 78 69 6d 75 6d 20 63 65 6c 6c 20 73  e maximum cell s
27d0: 69 7a 65 20 61 73 73 75 6d 69 6e 67 20 61 20 6d  ize assuming a m
27e0: 61 78 69 6d 75 6d 20 70 61 67 65 0a 2a 2a 20 73  aximum page.** s
27f0: 69 7a 65 20 67 69 76 65 20 61 62 6f 76 65 2e 0a  ize give above..
2800: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 45  */.#define MX_CE
2810: 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 20 28 70  LL_SIZE(pBt)  (p
2820: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 38 29 0a  Bt->pageSize-8).
2830: 0a 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  ./* The maximum 
2840: 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2850: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  on a single page
2860: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2870: 2e 20 20 54 68 69 73 0a 2a 2a 20 61 73 73 75 6d  .  This.** assum
2880: 65 73 20 61 20 6d 69 6e 69 6d 75 6d 20 63 65 6c  es a minimum cel
2890: 6c 20 73 69 7a 65 20 6f 66 20 33 20 62 79 74 65  l size of 3 byte
28a0: 73 2e 20 20 53 75 63 68 20 73 6d 61 6c 6c 20 63  s.  Such small c
28b0: 65 6c 6c 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  ells will be.** 
28c0: 65 78 63 65 65 64 69 6e 67 6c 79 20 72 61 72 65  exceedingly rare
28d0: 2c 20 62 75 74 20 74 68 65 79 20 61 72 65 20 70  , but they are p
28e0: 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66  ossible..*/.#def
28f0: 69 6e 65 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ine MX_CELL(pBt)
2900: 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
2910: 2d 38 29 2f 33 29 0a 0a 2f 2a 20 46 6f 72 77 61  -8)/3)../* Forwa
2920: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd declarations 
2930: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2940: 74 20 4d 65 6d 50 61 67 65 20 4d 65 6d 50 61 67  t MemPage MemPag
2950: 65 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  e;../*.** This i
2960: 73 20 61 20 6d 61 67 69 63 20 73 74 72 69 6e 67  s a magic string
2970: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
2980: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
2990: 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69 74  f every.** SQLit
29a0: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72  e database in or
29b0: 64 65 72 20 74 6f 20 69 64 65 6e 74 69 66 79 20  der to identify 
29c0: 74 68 65 20 66 69 6c 65 20 61 73 20 61 20 72 65  the file as a re
29d0: 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  al database..** 
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
2a10: 36 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  6 */.static cons
2a20: 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48 65 61  t char zMagicHea
2a30: 64 65 72 5b 5d 20 3d 20 22 53 51 4c 69 74 65 20  der[] = "SQLite 
2a40: 66 6f 72 6d 61 74 20 33 22 3b 0a 0a 2f 2a 0a 2a  format 3";../*.*
2a50: 2a 20 50 61 67 65 20 74 79 70 65 20 66 6c 61 67  * Page type flag
2a60: 73 2e 20 20 41 6e 20 4f 52 65 64 20 63 6f 6d 62  s.  An ORed comb
2a70: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65  ination of these
2a80: 20 66 6c 61 67 73 20 61 70 70 65 61 72 20 61 73   flags appear as
2a90: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 62 79   the.** first by
2aa0: 74 65 20 6f 66 20 65 76 65 72 79 20 42 54 72 65  te of every BTre
2ab0: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 64 65 66 69  e page..*/.#defi
2ac0: 6e 65 20 50 54 46 5f 49 4e 54 4b 45 59 20 20 20  ne PTF_INTKEY   
2ad0: 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 50 54   0x01.#define PT
2ae0: 46 5f 5a 45 52 4f 44 41 54 41 20 20 30 78 30 32  F_ZERODATA  0x02
2af0: 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 4c 45 41  .#define PTF_LEA
2b00: 46 44 41 54 41 20 20 30 78 30 34 0a 23 64 65 66  FDATA  0x04.#def
2b10: 69 6e 65 20 50 54 46 5f 4c 45 41 46 20 20 20 20  ine PTF_LEAF    
2b20: 20 20 30 78 30 38 0a 0a 2f 2a 0a 2a 2a 20 41 73    0x08../*.** As
2b30: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 74 68   each page of th
2b40: 65 20 66 69 6c 65 20 69 73 20 6c 6f 61 64 65 64  e file is loaded
2b50: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2c 20 61 6e   into memory, an
2b60: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2b70: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
2b80: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 65 6e  ructure is appen
2b90: 64 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ded and initiali
2ba0: 7a 65 64 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  zed to zero.  Th
2bb0: 69 73 20 73 74 72 75 63 74 75 72 65 20 73 74 6f  is structure sto
2bc0: 72 65 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  res.** informati
2bd0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  on about the pag
2be0: 65 20 74 68 61 74 20 69 73 20 64 65 63 6f 64 65  e that is decode
2bf0: 64 20 66 72 6f 6d 20 74 68 65 20 72 61 77 20 66  d from the raw f
2c00: 69 6c 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ile page..**.** 
2c10: 54 68 65 20 70 50 61 72 65 6e 74 20 66 69 65 6c  The pParent fiel
2c20: 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 20 74 6f  d points back to
2c30: 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2c40: 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 75  .  This allows u
2c50: 73 20 74 6f 0a 2a 2a 20 77 61 6c 6b 20 75 70 20  s to.** walk up 
2c60: 74 68 65 20 42 54 72 65 65 20 66 72 6f 6d 20 61  the BTree from a
2c70: 6e 79 20 6c 65 61 66 20 74 6f 20 74 68 65 20 72  ny leaf to the r
2c80: 6f 6f 74 2e 20 20 43 61 72 65 20 6d 75 73 74 20  oot.  Care must 
2c90: 62 65 20 74 61 6b 65 6e 20 74 6f 0a 2a 2a 20 75  be taken to.** u
2ca0: 6e 72 65 66 28 29 20 74 68 65 20 70 61 72 65 6e  nref() the paren
2cb0: 74 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 77  t page pointer w
2cc0: 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73  hen this page is
2cd0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 66 65 72   no longer refer
2ce0: 65 6e 63 65 64 2e 0a 2a 2a 20 54 68 65 20 70 61  enced..** The pa
2cf0: 67 65 44 65 73 74 72 75 63 74 6f 72 28 29 20 72  geDestructor() r
2d00: 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 74  outine handles t
2d10: 68 61 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 73 74  hat chore..*/.st
2d20: 72 75 63 74 20 4d 65 6d 50 61 67 65 20 7b 0a 20  ruct MemPage {. 
2d30: 20 75 38 20 69 73 49 6e 69 74 3b 20 20 20 20 20   u8 isInit;     
2d40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2d50: 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 69 74   previously init
2d60: 69 61 6c 69 7a 65 64 2e 20 4d 55 53 54 20 42 45  ialized. MUST BE
2d70: 20 46 49 52 53 54 21 20 2a 2f 0a 20 20 75 38 20   FIRST! */.  u8 
2d80: 69 64 78 53 68 69 66 74 3b 20 20 20 20 20 20 20  idxShift;       
2d90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 43 65 6c    /* True if Cel
2da0: 6c 20 69 6e 64 69 63 65 73 20 68 61 76 65 20 63  l indices have c
2db0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 6e  hanged */.  u8 n
2dc0: 4f 76 65 72 66 6c 6f 77 3b 20 20 20 20 20 20 20  Overflow;       
2dd0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 76   /* Number of ov
2de0: 65 72 66 6c 6f 77 20 63 65 6c 6c 20 62 6f 64 69  erflow cell bodi
2df0: 65 73 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 2a 2f  es in aCell[] */
2e00: 0a 20 20 75 38 20 69 6e 74 4b 65 79 3b 20 20 20  .  u8 intKey;   
2e10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e20: 69 66 20 69 6e 74 6b 65 79 20 66 6c 61 67 20 69  if intkey flag i
2e30: 73 20 73 65 74 20 2a 2f 0a 20 20 75 38 20 6c 65  s set */.  u8 le
2e40: 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
2e50: 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 61 66 20  /* True if leaf 
2e60: 66 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 20  flag is set */. 
2e70: 20 75 38 20 7a 65 72 6f 44 61 74 61 3b 20 20 20   u8 zeroData;   
2e80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e90: 20 74 61 62 6c 65 20 73 74 6f 72 65 73 20 6b 65   table stores ke
2ea0: 79 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20  ys only */.  u8 
2eb0: 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20  leafData;       
2ec0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 61 62    /* True if tab
2ed0: 6c 65 73 20 73 74 6f 72 65 73 20 64 61 74 61 20  les stores data 
2ee0: 6f 6e 20 6c 65 61 76 65 73 20 6f 6e 6c 79 20 2a  on leaves only *
2ef0: 2f 0a 20 20 75 38 20 68 61 73 44 61 74 61 3b 20  /.  u8 hasData; 
2f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2f10: 20 69 66 20 74 68 69 73 20 70 61 67 65 20 73 74   if this page st
2f20: 6f 72 65 73 20 64 61 74 61 20 2a 2f 0a 20 20 75  ores data */.  u
2f30: 38 20 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  8 hdrOffset;    
2f40: 20 20 20 20 2f 2a 20 31 30 30 20 66 6f 72 20 70      /* 100 for p
2f50: 61 67 65 20 31 2e 20 20 30 20 6f 74 68 65 72 77  age 1.  0 otherw
2f60: 69 73 65 20 2a 2f 0a 20 20 75 38 20 63 68 69 6c  ise */.  u8 chil
2f70: 64 50 74 72 53 69 7a 65 3b 20 20 20 20 20 2f 2a  dPtrSize;     /*
2f80: 20 30 20 69 66 20 6c 65 61 66 3d 3d 31 2e 20 20   0 if leaf==1.  
2f90: 34 20 69 66 20 6c 65 61 66 3d 3d 30 20 2a 2f 0a  4 if leaf==0 */.
2fa0: 20 20 75 31 36 20 6d 61 78 4c 6f 63 61 6c 3b 20    u16 maxLocal; 
2fb0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
2fc0: 66 20 42 74 72 65 65 2e 6d 61 78 4c 6f 63 61 6c  f Btree.maxLocal
2fd0: 20 6f 72 20 42 74 72 65 65 2e 6d 61 78 4c 65 61   or Btree.maxLea
2fe0: 66 20 2a 2f 0a 20 20 75 31 36 20 6d 69 6e 4c 6f  f */.  u16 minLo
2ff0: 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  cal;        /* C
3000: 6f 70 79 20 6f 66 20 42 74 72 65 65 2e 6d 69 6e  opy of Btree.min
3010: 4c 6f 63 61 6c 20 6f 72 20 42 74 72 65 65 2e 6d  Local or Btree.m
3020: 69 6e 4c 65 61 66 20 2a 2f 0a 20 20 75 31 36 20  inLeaf */.  u16 
3030: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20  cellOffset;     
3040: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 44 61   /* Index in aDa
3050: 74 61 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ta of first cell
3060: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 31   pointer */.  u1
3070: 36 20 69 64 78 50 61 72 65 6e 74 3b 20 20 20 20  6 idxParent;    
3080: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
3090: 61 72 65 6e 74 20 6f 66 20 74 68 69 73 20 6e 6f  arent of this no
30a0: 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 46 72 65  de */.  u16 nFre
30b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
30c0: 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  Number of free b
30d0: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
30e0: 20 2a 2f 0a 20 20 75 31 36 20 6e 43 65 6c 6c 3b   */.  u16 nCell;
30f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3100: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
3110: 20 74 68 69 73 20 70 61 67 65 2c 20 6c 6f 63 61   this page, loca
3120: 6c 20 61 6e 64 20 6f 76 66 6c 20 2a 2f 0a 20 20  l and ovfl */.  
3130: 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c  struct _OvflCell
3140: 20 7b 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74 68   {   /* Cells th
3150: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  at will not fit 
3160: 6f 6e 20 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  on aData[] */.  
3170: 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20    u8 *pCell;    
3180: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3190: 72 73 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f  rs to the body o
31a0: 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  f the overflow c
31b0: 65 6c 6c 20 2a 2f 0a 20 20 20 20 75 31 36 20 69  ell */.    u16 i
31c0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
31d0: 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20 63  /* Insert this c
31e0: 65 6c 6c 20 62 65 66 6f 72 65 20 69 64 78 2d 74  ell before idx-t
31f0: 68 20 6e 6f 6e 2d 6f 76 65 72 66 6c 6f 77 20 63  h non-overflow c
3200: 65 6c 6c 20 2a 2f 0a 20 20 7d 20 61 4f 76 66 6c  ell */.  } aOvfl
3210: 5b 35 5d 3b 0a 20 20 73 74 72 75 63 74 20 42 74  [5];.  struct Bt
3220: 72 65 65 20 2a 70 42 74 3b 20 20 20 2f 2a 20 50  ree *pBt;   /* P
3230: 6f 69 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 42  ointer back to B
3240: 54 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  Tree structure *
3250: 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20  /.  u8 *aData;  
3260: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
3270: 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ter back to the 
3280: 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67  start of the pag
3290: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
32a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
32b0: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
32c0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65  his page */.  Me
32d0: 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20  mPage *pParent; 
32e0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
32f0: 20 6f 66 20 74 68 69 73 20 70 61 67 65 2e 20 20   of this page.  
3300: 4e 55 4c 4c 20 66 6f 72 20 72 6f 6f 74 20 2a 2f  NULL for root */
3310: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  .};../*.** The i
3320: 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  n-memory image o
3330: 66 20 61 20 64 69 73 6b 20 70 61 67 65 20 68 61  f a disk page ha
3340: 73 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  s the auxiliary 
3350: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 70 70 65  information appe
3360: 6e 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 65  nded.** to the e
3370: 6e 64 2e 20 20 45 58 54 52 41 5f 53 49 5a 45 20  nd.  EXTRA_SIZE 
3380: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
3390: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
33a0: 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 0a 2a  needed to hold.*
33b0: 2a 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66  * that extra inf
33c0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65  ormation..*/.#de
33d0: 66 69 6e 65 20 45 58 54 52 41 5f 53 49 5a 45 20  fine EXTRA_SIZE 
33e0: 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 0a  sizeof(MemPage).
33f0: 0a 2f 2a 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e  ./*.** Everythin
3400: 67 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  g we need to kno
3410: 77 20 61 62 6f 75 74 20 61 6e 20 6f 70 65 6e 20  w about an open 
3420: 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 72 75  database.*/.stru
3430: 63 74 20 42 74 72 65 65 20 7b 0a 20 20 50 61 67  ct Btree {.  Pag
3440: 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
3450: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 63     /* The page c
3460: 61 63 68 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  ache */.  BtCurs
3470: 6f 72 20 2a 70 43 75 72 73 6f 72 3b 20 20 20 20  or *pCursor;    
3480: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
3490: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 2a 2f   open cursors */
34a0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
34b0: 65 31 3b 20 20 20 20 20 20 2f 2a 20 46 69 72 73  e1;      /* Firs
34c0: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
34d0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 69  tabase */.  u8 i
34e0: 6e 54 72 61 6e 73 3b 20 20 20 20 20 20 20 20 20  nTrans;         
34f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74    /* True if a t
3500: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6e  ransaction is in
3510: 20 70 72 6f 67 72 65 73 73 20 2a 2f 0a 20 20 75   progress */.  u
3520: 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  8 inStmt;       
3530: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3540: 77 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74  we are in a stat
3550: 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
3560: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 72 65 61  tion */.  u8 rea
3570: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
3580: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 75  /* True if the u
3590: 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69  nderlying file i
35a0: 73 20 72 65 61 64 6f 6e 6c 79 20 2a 2f 0a 20 20  s readonly */.  
35b0: 75 38 20 6d 61 78 45 6d 62 65 64 46 72 61 63 3b  u8 maxEmbedFrac;
35c0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
35d0: 20 70 61 79 6c 6f 61 64 20 61 73 20 25 20 6f 66   payload as % of
35e0: 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a 65   total page size
35f0: 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 45 6d 62 65   */.  u8 minEmbe
3600: 64 46 72 61 63 3b 20 20 20 20 20 20 2f 2a 20 4d  dFrac;      /* M
3610: 69 6e 69 6d 75 6d 20 70 61 79 6c 6f 61 64 20 61  inimum payload a
3620: 73 20 25 20 6f 66 20 74 6f 74 61 6c 20 70 61 67  s % of total pag
3630: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38 20 6d  e size */.  u8 m
3640: 69 6e 4c 65 61 66 46 72 61 63 3b 20 20 20 20 20  inLeafFrac;     
3650: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 61    /* Minimum lea
3660: 66 20 70 61 79 6c 6f 61 64 20 61 73 20 25 20 6f  f payload as % o
3670: 66 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a  f total page siz
3680: 65 20 2a 2f 0a 20 20 75 38 20 70 61 67 65 53 69  e */.  u8 pageSi
3690: 7a 65 46 69 78 65 64 3b 20 20 20 20 20 2f 2a 20  zeFixed;     /* 
36a0: 54 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  True if the page
36b0: 20 73 69 7a 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   size can no lon
36c0: 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 20 2a  ger be changed *
36d0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
36e0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
36f0: 0a 20 20 75 38 20 61 75 74 6f 56 61 63 75 75 6d  .  u8 autoVacuum
3700: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
3710: 20 69 66 20 64 61 74 61 62 61 73 65 20 73 75 70   if database sup
3720: 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
3730: 6d 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 75 31  m */.#endif.  u1
3740: 36 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  6 pageSize;     
3750: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
3760: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20  ber of bytes on 
3770: 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20  a page */.  u16 
3780: 70 73 41 6c 69 67 6e 65 64 3b 20 20 20 20 20 20  psAligned;      
3790: 20 20 2f 2a 20 70 61 67 65 53 69 7a 65 20 72 6f    /* pageSize ro
37a0: 75 6e 64 65 64 20 75 70 20 74 6f 20 61 20 6d 75  unded up to a mu
37b0: 6c 74 69 70 6c 65 20 6f 66 20 38 20 2a 2f 0a 20  ltiple of 8 */. 
37c0: 20 75 31 36 20 75 73 61 62 6c 65 53 69 7a 65 3b   u16 usableSize;
37d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
37e0: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
37f0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
3800: 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b  .  int maxLocal;
3810: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
3820: 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  mum local payloa
3830: 64 20 69 6e 20 6e 6f 6e 2d 4c 45 41 46 44 41 54  d in non-LEAFDAT
3840: 41 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e  A tables */.  in
3850: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 20 20 20  t minLocal;     
3860: 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c      /* Minimum l
3870: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69 6e 20  ocal payload in 
3880: 6e 6f 6e 2d 4c 45 41 46 44 41 54 41 20 74 61 62  non-LEAFDATA tab
3890: 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  les */.  int max
38a0: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 2f  Leaf;          /
38b0: 2a 20 4d 61 78 69 6d 75 6d 20 6c 6f 63 61 6c 20  * Maximum local 
38c0: 70 61 79 6c 6f 61 64 20 69 6e 20 61 20 4c 45 41  payload in a LEA
38d0: 46 44 41 54 41 20 74 61 62 6c 65 20 2a 2f 0a 20  FDATA table */. 
38e0: 20 69 6e 74 20 6d 69 6e 4c 65 61 66 3b 20 20 20   int minLeaf;   
38f0: 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
3900: 6d 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20  m local payload 
3910: 69 6e 20 61 20 4c 45 41 46 44 41 54 41 20 74 61  in a LEAFDATA ta
3920: 62 6c 65 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e  ble */.  BusyHan
3930: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
3940: 65 72 3b 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63  er;   /* Callbac
3950: 6b 20 66 6f 72 20 77 68 65 6e 20 74 68 65 72 65  k for when there
3960: 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   is lock content
3970: 69 6f 6e 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65  ion */.};.typede
3980: 66 20 42 74 72 65 65 20 42 74 3b 0a 0a 2f 2a 0a  f Btree Bt;../*.
3990: 2a 2a 20 42 74 72 65 65 2e 69 6e 54 72 61 6e 73  ** Btree.inTrans
39a0: 20 6d 61 79 20 74 61 6b 65 20 6f 6e 65 20 6f 66   may take one of
39b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
39c0: 61 6c 75 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  alues..*/.#defin
39d0: 65 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 20 30 0a  e TRANS_NONE  0.
39e0: 23 64 65 66 69 6e 65 20 54 52 41 4e 53 5f 52 45  #define TRANS_RE
39f0: 41 44 20 20 31 0a 23 64 65 66 69 6e 65 20 54 52  AD  1.#define TR
3a00: 41 4e 53 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a  ANS_WRITE 2../*.
3a10: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
3a20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
3a30: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
3a40: 64 20 74 6f 20 68 6f 6c 64 20 69 6e 66 6f 72 6d  d to hold inform
3a50: 61 74 69 6f 6e 0a 2a 2a 20 61 62 6f 75 74 20 61  ation.** about a
3a60: 20 63 65 6c 6c 2e 20 20 54 68 65 20 70 61 72 73   cell.  The pars
3a70: 65 43 65 6c 6c 50 74 72 28 29 20 66 75 6e 63 74  eCellPtr() funct
3a80: 69 6f 6e 20 66 69 6c 6c 73 20 69 6e 20 74 68 69  ion fills in thi
3a90: 73 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62  s structure.** b
3aa0: 61 73 65 64 20 6f 6e 20 69 6e 66 6f 72 6d 61 74  ased on informat
3ab0: 69 6f 6e 20 65 78 74 72 61 63 74 20 66 72 6f 6d  ion extract from
3ac0: 20 74 68 65 20 72 61 77 20 64 69 73 6b 20 70 61   the raw disk pa
3ad0: 67 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ge..*/.typedef s
3ae0: 74 72 75 63 74 20 43 65 6c 6c 49 6e 66 6f 20 43  truct CellInfo C
3af0: 65 6c 6c 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20  ellInfo;.struct 
3b00: 43 65 6c 6c 49 6e 66 6f 20 7b 0a 20 20 75 38 20  CellInfo {.  u8 
3b10: 2a 70 43 65 6c 6c 3b 20 20 20 20 20 2f 2a 20 50  *pCell;     /* P
3b20: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74  ointer to the st
3b30: 61 72 74 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  art of cell cont
3b40: 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  ent */.  i64 nKe
3b50: 79 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b  y;      /* The k
3b60: 65 79 20 66 6f 72 20 49 4e 54 4b 45 59 20 74 61  ey for INTKEY ta
3b70: 62 6c 65 73 2c 20 6f 72 20 6e 75 6d 62 65 72 20  bles, or number 
3b80: 6f 66 20 62 79 74 65 73 20 69 6e 20 6b 65 79 20  of bytes in key 
3b90: 2a 2f 0a 20 20 75 33 32 20 6e 44 61 74 61 3b 20  */.  u32 nData; 
3ba0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3bb0: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 2a   bytes of data *
3bc0: 2f 0a 20 20 75 31 36 20 6e 48 65 61 64 65 72 3b  /.  u16 nHeader;
3bd0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
3be0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
3bf0: 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a  eader in bytes *
3c00: 2f 0a 20 20 75 31 36 20 6e 4c 6f 63 61 6c 3b 20  /.  u16 nLocal; 
3c10: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
3c20: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
3c30: 61 6c 6c 79 20 2a 2f 0a 20 20 75 31 36 20 69 4f  ally */.  u16 iO
3c40: 76 65 72 66 6c 6f 77 3b 20 2f 2a 20 4f 66 66 73  verflow; /* Offs
3c50: 65 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  et to overflow p
3c60: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 5a 65 72  age number.  Zer
3c70: 6f 20 69 66 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o if no overflow
3c80: 20 2a 2f 0a 20 20 75 31 36 20 6e 53 69 7a 65 3b   */.  u16 nSize;
3c90: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
3ca0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
3cb0: 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
3cc0: 72 65 65 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 0a  ree page */.};..
3cd0: 2f 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69  /*.** A cursor i
3ce0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
3cf0: 20 70 61 72 74 69 63 75 6c 61 72 20 65 6e 74 72   particular entr
3d00: 79 20 69 6e 20 74 68 65 20 42 54 72 65 65 2e 0a  y in the BTree..
3d10: 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 69 73 20  ** The entry is 
3d20: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 74  identified by it
3d30: 73 20 4d 65 6d 50 61 67 65 20 61 6e 64 20 74 68  s MemPage and th
3d40: 65 20 69 6e 64 65 78 20 69 6e 0a 2a 2a 20 4d 65  e index in.** Me
3d50: 6d 50 61 67 65 2e 61 43 65 6c 6c 5b 5d 20 6f 66  mPage.aCell[] of
3d60: 20 74 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73   the entry..*/.s
3d70: 74 72 75 63 74 20 42 74 43 75 72 73 6f 72 20 7b  truct BtCursor {
3d80: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 20 20  .  Btree *pBt;  
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3da0: 54 68 65 20 42 74 72 65 65 20 74 6f 20 77 68 69  The Btree to whi
3db0: 63 68 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ch this cursor b
3dc0: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 42 74 43 75  elongs */.  BtCu
3dd0: 72 73 6f 72 20 2a 70 4e 65 78 74 2c 20 2a 70 50  rsor *pNext, *pP
3de0: 72 65 76 3b 20 20 2f 2a 20 46 6f 72 6d 73 20 61  rev;  /* Forms a
3df0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
3e00: 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20  all cursors */. 
3e10: 20 69 6e 74 20 28 2a 78 43 6f 6d 70 61 72 65 29   int (*xCompare)
3e20: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
3e30: 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
3e40: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 4b 65 79 20   void*); /* Key 
3e50: 63 6f 6d 70 20 66 75 6e 63 20 2a 2f 0a 20 20 76  comp func */.  v
3e60: 6f 69 64 20 2a 70 41 72 67 3b 20 20 20 20 20 20  oid *pArg;      
3e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3e80: 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
3e90: 65 28 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  e() */.  Pgno pg
3ea0: 6e 6f 52 6f 6f 74 3b 20 20 20 20 20 20 20 20 20  noRoot;         
3eb0: 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70     /* The root p
3ec0: 61 67 65 20 6f 66 20 74 68 69 73 20 74 72 65 65  age of this tree
3ed0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
3ee0: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
3ef0: 2f 2a 20 50 61 67 65 20 74 68 61 74 20 63 6f 6e  /* Page that con
3f00: 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20  tains the entry 
3f10: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20  */.  int idx;   
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f30: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65  * Index of the e
3f40: 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
3f50: 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 43 65 6c 6c  Cell[] */.  Cell
3f60: 49 6e 66 6f 20 69 6e 66 6f 3b 20 20 20 20 20 20  Info info;      
3f70: 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 73 65        /* A parse
3f80: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 77 65 20   of the cell we 
3f90: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
3fa0: 2a 2f 0a 20 20 75 38 20 77 72 46 6c 61 67 3b 20  */.  u8 wrFlag; 
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3fc0: 2a 20 54 72 75 65 20 69 66 20 77 72 69 74 61 62  * True if writab
3fd0: 6c 65 20 2a 2f 0a 20 20 75 38 20 69 73 56 61 6c  le */.  u8 isVal
3fe0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3ff0: 20 20 2f 2a 20 54 52 55 45 20 69 66 20 70 6f 69    /* TRUE if poi
4000: 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65  nts to a valid e
4010: 6e 74 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ntry */.};../*.*
4020: 2a 20 54 68 65 20 54 52 41 43 45 20 6d 61 63 72  * The TRACE macr
4030: 6f 20 77 69 6c 6c 20 70 72 69 6e 74 20 68 69 67  o will print hig
4040: 68 2d 6c 65 76 65 6c 20 73 74 61 74 75 73 20 69  h-level status i
4050: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
4060: 20 74 68 65 0a 2a 2a 20 62 74 72 65 65 20 6f 70   the.** btree op
4070: 65 72 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65  eration when the
4080: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
4090: 20 73 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74   sqlite3_btree_t
40a0: 72 61 63 65 20 69 73 0a 2a 2a 20 65 6e 61 62 6c  race is.** enabl
40b0: 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ed..*/.#if SQLIT
40c0: 45 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20  E_TEST.# define 
40d0: 54 52 41 43 45 28 58 29 20 20 20 69 66 28 20 73  TRACE(X)   if( s
40e0: 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61  qlite3_btree_tra
40f0: 63 65 20 29 5c 0a 20 20 20 20 20 20 20 20 20 20  ce )\.          
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
4110: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4120: 74 66 20 58 3b 20 66 66 6c 75 73 68 28 73 74 64  tf X; fflush(std
4130: 6f 75 74 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20  out); }.#else.# 
4140: 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29 0a  define TRACE(X).
4150: 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74  #endif.int sqlit
4160: 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65 3d 30  e3_btree_trace=0
4170: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
4180: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
4190: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
41a0: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
41b0: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
41c0: 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a 2c 50  adLocks(Btree*,P
41d0: 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a  gno,BtCursor*);.
41e0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 6f 72 20 77  ./*.** Read or w
41f0: 72 69 74 65 20 61 20 74 77 6f 2d 20 61 6e 64 20  rite a two- and 
4200: 66 6f 75 72 2d 62 79 74 65 20 62 69 67 2d 65 6e  four-byte big-en
4210: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  dian integer val
4220: 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ues..*/.static u
4230: 33 32 20 67 65 74 32 62 79 74 65 28 75 6e 73 69  32 get2byte(unsi
4240: 67 6e 65 64 20 63 68 61 72 20 2a 70 29 7b 0a 20  gned char *p){. 
4250: 20 72 65 74 75 72 6e 20 28 70 5b 30 5d 3c 3c 38   return (p[0]<<8
4260: 29 20 7c 20 70 5b 31 5d 3b 0a 7d 0a 73 74 61 74  ) | p[1];.}.stat
4270: 69 63 20 75 33 32 20 67 65 74 34 62 79 74 65 28  ic u32 get4byte(
4280: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
4290: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 5b 30  ){.  return (p[0
42a0: 5d 3c 3c 32 34 29 20 7c 20 28 70 5b 31 5d 3c 3c  ]<<24) | (p[1]<<
42b0: 31 36 29 20 7c 20 28 70 5b 32 5d 3c 3c 38 29 20  16) | (p[2]<<8) 
42c0: 7c 20 70 5b 33 5d 3b 0a 7d 0a 73 74 61 74 69 63  | p[3];.}.static
42d0: 20 76 6f 69 64 20 70 75 74 32 62 79 74 65 28 75   void put2byte(u
42e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c  nsigned char *p,
42f0: 20 75 33 32 20 76 29 7b 0a 20 20 70 5b 30 5d 20   u32 v){.  p[0] 
4300: 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 31 5d 20 3d  = v>>8;.  p[1] =
4310: 20 76 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   v;.}.static voi
4320: 64 20 70 75 74 34 62 79 74 65 28 75 6e 73 69 67  d put4byte(unsig
4330: 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 33 32  ned char *p, u32
4340: 20 76 29 7b 0a 20 20 70 5b 30 5d 20 3d 20 76 3e   v){.  p[0] = v>
4350: 3e 32 34 3b 0a 20 20 70 5b 31 5d 20 3d 20 76 3e  >24;.  p[1] = v>
4360: 3e 31 36 3b 0a 20 20 70 5b 32 5d 20 3d 20 76 3e  >16;.  p[2] = v>
4370: 3e 38 3b 0a 20 20 70 5b 33 5d 20 3d 20 76 3b 0a  >8;.  p[3] = v;.
4380: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  }../*.** Routine
4390: 73 20 74 6f 20 72 65 61 64 20 61 6e 64 20 77 72  s to read and wr
43a0: 69 74 65 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e  ite variable-len
43b0: 67 74 68 20 69 6e 74 65 67 65 72 73 2e 20 20 54  gth integers.  T
43c0: 68 65 73 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20  hese used to.** 
43d0: 62 65 20 64 65 66 69 6e 65 64 20 6c 6f 63 61 6c  be defined local
43e0: 6c 79 2c 20 62 75 74 20 6e 6f 77 20 77 65 20 75  ly, but now we u
43f0: 73 65 20 74 68 65 20 76 61 72 69 6e 74 20 72 6f  se the varint ro
4400: 75 74 69 6e 65 73 20 69 6e 20 74 68 65 20 75 74  utines in the ut
4410: 69 6c 2e 63 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f  il.c.** file..*/
4420: 0a 23 64 65 66 69 6e 65 20 67 65 74 56 61 72 69  .#define getVari
4430: 6e 74 20 20 20 20 73 71 6c 69 74 65 33 47 65 74  nt    sqlite3Get
4440: 56 61 72 69 6e 74 0a 23 64 65 66 69 6e 65 20 67  Varint.#define g
4450: 65 74 56 61 72 69 6e 74 33 32 20 20 73 71 6c 69  etVarint32  sqli
4460: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 0a 23  te3GetVarint32.#
4470: 64 65 66 69 6e 65 20 70 75 74 56 61 72 69 6e 74  define putVarint
4480: 20 20 20 20 73 71 6c 69 74 65 33 50 75 74 56 61      sqlite3PutVa
4490: 72 69 6e 74 0a 0a 2f 2a 20 54 68 65 20 64 61 74  rint../* The dat
44a0: 61 62 61 73 65 20 70 61 67 65 20 74 68 65 20 50  abase page the P
44b0: 45 4e 44 49 4e 47 5f 42 59 54 45 20 6f 63 63 75  ENDING_BYTE occu
44c0: 70 69 65 73 2e 20 54 68 69 73 20 70 61 67 65 20  pies. This page 
44d0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 0a 2a  is never used..*
44e0: 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 6d 61 63  * TODO: This mac
44f0: 72 6f 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c  ro is very simil
4500: 61 72 79 20 74 6f 20 50 41 47 45 52 5f 4d 4a 5f  ary to PAGER_MJ_
4510: 50 47 4e 4f 28 29 20 69 6e 20 70 61 67 65 72 2e  PGNO() in pager.
4520: 63 2e 20 54 68 65 79 0a 2a 2a 20 73 68 6f 75 6c  c. They.** shoul
4530: 64 20 70 6f 73 73 69 62 6c 79 20 62 65 20 63 6f  d possibly be co
4540: 6e 73 6f 6c 69 64 61 74 65 64 20 28 70 72 65 73  nsolidated (pres
4550: 75 6d 61 62 6c 79 20 69 6e 20 70 61 67 65 72 2e  umably in pager.
4560: 68 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  h)..*/.#define P
4570: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
4580: 28 70 42 74 29 20 28 28 50 45 4e 44 49 4e 47 5f  (pBt) ((PENDING_
4590: 42 59 54 45 2f 28 70 42 74 29 2d 3e 70 61 67 65  BYTE/(pBt)->page
45a0: 53 69 7a 65 29 2b 31 29 0a 0a 23 69 66 6e 64 65  Size)+1)..#ifnde
45b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
45c0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54  TOVACUUM./*.** T
45d0: 68 65 73 65 20 6d 61 63 72 6f 73 20 64 65 66 69  hese macros defi
45e0: 6e 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ne the location 
45f0: 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
4600: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 61 20 0a  ap entry for a .
4610: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
4620: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
4630: 6d 65 6e 74 20 74 6f 20 65 61 63 68 20 69 73 20  ment to each is 
4640: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73  the number of us
4650: 61 62 6c 65 0a 2a 2a 20 62 79 74 65 73 20 6f 6e  able.** bytes on
4660: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 74 68   each page of th
4670: 65 20 64 61 74 61 62 61 73 65 20 28 6f 66 74 65  e database (ofte
4680: 6e 20 31 30 32 34 29 2e 20 54 68 65 20 73 65 63  n 1024). The sec
4690: 6f 6e 64 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ond is the.** pa
46a0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 6f  ge number to loo
46b0: 6b 20 75 70 20 69 6e 20 74 68 65 20 70 6f 69 6e  k up in the poin
46c0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 50  ter map..**.** P
46d0: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20 72 65 74  TRMAP_PAGENO ret
46e0: 75 72 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  urns the databas
46f0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
4700: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
4710: 0a 2a 2a 20 70 61 67 65 20 74 68 61 74 20 73 74  .** page that st
4720: 6f 72 65 73 20 74 68 65 20 72 65 71 75 69 72 65  ores the require
4730: 64 20 70 6f 69 6e 74 65 72 2e 20 50 54 52 4d 41  d pointer. PTRMA
4740: 50 5f 50 54 52 4f 46 46 53 45 54 20 72 65 74 75  P_PTROFFSET retu
4750: 72 6e 73 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65  rns.** the offse
4760: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  t of the request
4770: 65 64 20 6d 61 70 20 65 6e 74 72 79 2e 0a 2a 2a  ed map entry..**
4780: 0a 2a 2a 20 49 66 20 74 68 65 20 70 67 6e 6f 20  .** If the pgno 
4790: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
47a0: 74 6f 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  to PTRMAP_PAGENO
47b0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   is a pointer-ma
47c0: 70 20 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  p page,.** then 
47d0: 70 67 6e 6f 20 69 73 20 72 65 74 75 72 6e 65 64  pgno is returned
47e0: 2e 20 53 6f 20 28 70 67 6e 6f 3d 3d 50 54 52 4d  . So (pgno==PTRM
47f0: 41 50 5f 50 41 47 45 4e 4f 28 70 67 73 7a 2c 20  AP_PAGENO(pgsz, 
4800: 70 67 6e 6f 29 29 20 63 61 6e 20 62 65 0a 2a 2a  pgno)) can be.**
4810: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 69 66   used to test if
4820: 20 70 67 6e 6f 20 69 73 20 61 20 70 6f 69 6e 74   pgno is a point
4830: 65 72 2d 6d 61 70 20 70 61 67 65 2e 20 50 54 52  er-map page. PTR
4840: 4d 41 50 5f 49 53 50 41 47 45 20 69 6d 70 6c 65  MAP_ISPAGE imple
4850: 6d 65 6e 74 73 0a 2a 2a 20 74 68 69 73 20 74 65  ments.** this te
4860: 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  st..*/.#define P
4870: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 67 73  TRMAP_PAGENO(pgs
4880: 7a 2c 20 70 67 6e 6f 29 20 28 28 28 70 67 6e 6f  z, pgno) (((pgno
4890: 2d 32 29 2f 28 70 67 73 7a 2f 35 2b 31 29 29 2a  -2)/(pgsz/5+1))*
48a0: 28 70 67 73 7a 2f 35 2b 31 29 2b 32 29 0a 23 64  (pgsz/5+1)+2).#d
48b0: 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 50 54 52  efine PTRMAP_PTR
48c0: 4f 46 46 53 45 54 28 70 67 73 7a 2c 20 70 67 6e  OFFSET(pgsz, pgn
48d0: 6f 29 20 28 28 28 70 67 6e 6f 2d 32 29 25 28 70  o) (((pgno-2)%(p
48e0: 67 73 7a 2f 35 2b 31 29 2d 31 29 2a 35 29 0a 23  gsz/5+1)-1)*5).#
48f0: 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 49 53  define PTRMAP_IS
4900: 50 41 47 45 28 70 67 73 7a 2c 20 70 67 6e 6f 29  PAGE(pgsz, pgno)
4910: 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28   (PTRMAP_PAGENO(
4920: 70 67 73 7a 2c 70 67 6e 6f 29 3d 3d 70 67 6e 6f  pgsz,pgno)==pgno
4930: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  )../*.** The poi
4940: 6e 74 65 72 20 6d 61 70 20 69 73 20 61 20 6c 6f  nter map is a lo
4950: 6f 6b 75 70 20 74 61 62 6c 65 20 74 68 61 74 20  okup table that 
4960: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70  identifies the p
4970: 61 72 65 6e 74 20 70 61 67 65 20 66 6f 72 0a 2a  arent page for.*
4980: 2a 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67  * each child pag
4990: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
49a0: 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 61 72  e file.  The par
49b0: 65 6e 74 20 70 61 67 65 20 69 73 20 74 68 65 20  ent page is the 
49c0: 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 63 6f 6e  page that.** con
49d0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
49e0: 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 45  to the child.  E
49f0: 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
4a00: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
4a10: 6e 73 0a 2a 2a 20 30 20 6f 72 20 31 20 70 61 72  ns.** 0 or 1 par
4a20: 65 6e 74 20 70 61 67 65 73 2e 20 20 28 49 6e 20  ent pages.  (In 
4a30: 74 68 69 73 20 63 6f 6e 74 65 78 74 20 27 64 61  this context 'da
4a40: 74 61 62 61 73 65 20 70 61 67 65 27 20 72 65 66  tabase page' ref
4a50: 65 72 73 0a 2a 2a 20 74 6f 20 61 6e 79 20 70 61  ers.** to any pa
4a60: 67 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70  ge that is not p
4a70: 61 72 74 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  art of the point
4a80: 65 72 20 6d 61 70 20 69 74 73 65 6c 66 2e 29 20  er map itself.) 
4a90: 20 45 61 63 68 20 70 6f 69 6e 74 65 72 20 6d 61   Each pointer ma
4aa0: 70 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 6e 73 69  p.** entry consi
4ab0: 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
4ac0: 62 79 74 65 20 27 74 79 70 65 27 20 61 6e 64 20  byte 'type' and 
4ad0: 61 20 34 20 62 79 74 65 20 70 61 72 65 6e 74 20  a 4 byte parent 
4ae0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
4af0: 54 68 65 20 50 54 52 4d 41 50 5f 58 58 58 20 69  The PTRMAP_XXX i
4b00: 64 65 6e 74 69 66 69 65 72 73 20 62 65 6c 6f 77  dentifiers below
4b10: 20 61 72 65 20 74 68 65 20 76 61 6c 69 64 20 74   are the valid t
4b20: 79 70 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ypes..**.** The 
4b30: 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 70  purpose of the p
4b40: 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 74 6f  ointer map is to
4b50: 20 66 61 63 69 6c 69 74 79 20 6d 6f 76 69 6e 67   facility moving
4b60: 20 70 61 67 65 73 20 66 72 6f 6d 20 6f 6e 65 0a   pages from one.
4b70: 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  ** position in t
4b80: 68 65 20 66 69 6c 65 20 74 6f 20 61 6e 6f 74 68  he file to anoth
4b90: 65 72 20 61 73 20 70 61 72 74 20 6f 66 20 61 75  er as part of au
4ba0: 74 6f 76 61 63 75 75 6d 2e 20 20 57 68 65 6e 20  tovacuum.  When 
4bb0: 61 20 70 61 67 65 0a 2a 2a 20 69 73 20 6d 6f 76  a page.** is mov
4bc0: 65 64 2c 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ed, the pointer 
4bd0: 69 6e 20 69 74 73 20 70 61 72 65 6e 74 20 6d 75  in its parent mu
4be0: 73 74 20 62 65 20 75 70 64 61 74 65 64 20 74 6f  st be updated to
4bf0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
4c00: 20 6e 65 77 20 6c 6f 63 61 74 69 6f 6e 2e 20 20   new location.  
4c10: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
4c20: 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74  is used to locat
4c30: 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
4c40: 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 0a 2a 2a  e quickly..**.**
4c50: 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
4c60: 3a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70  : The database p
4c70: 61 67 65 20 69 73 20 61 20 72 6f 6f 74 2d 70 61  age is a root-pa
4c80: 67 65 2e 20 54 68 65 20 70 61 67 65 2d 6e 75 6d  ge. The page-num
4c90: 62 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ber is not.**   
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
4cb0: 73 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  sed in this case
4cc0: 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 46  ..**.** PTRMAP_F
4cd0: 52 45 45 50 41 47 45 3a 20 54 68 65 20 64 61 74  REEPAGE: The dat
4ce0: 61 62 61 73 65 20 70 61 67 65 20 69 73 20 61 6e  abase page is an
4cf0: 20 75 6e 75 73 65 64 20 28 66 72 65 65 29 20 70   unused (free) p
4d00: 61 67 65 2e 20 54 68 65 20 70 61 67 65 2d 6e 75  age. The page-nu
4d10: 6d 62 65 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  mber .**        
4d20: 20 20 20 20 20 20 20 20 20 20 69 73 20 6e 6f 74            is not
4d30: 20 75 73 65 64 20 69 6e 20 74 68 69 73 20 63 61   used in this ca
4d40: 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  se..**.** PTRMAP
4d50: 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 54 68 65 20  _OVERFLOW1: The 
4d60: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73  database page is
4d70: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
4d80: 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a  in a list of .**
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
4db0: 73 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  s. The page numb
4dc0: 65 72 20 69 64 65 6e 74 69 66 69 65 73 20 74 68  er identifies th
4dd0: 65 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 20  e page that.**  
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
4e00: 6c 6c 20 77 69 74 68 20 61 20 70 6f 69 6e 74 65  ll with a pointe
4e10: 72 20 74 6f 20 74 68 69 73 20 6f 76 65 72 66 6c  r to this overfl
4e20: 6f 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  ow page..**.** P
4e30: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
4e40: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70 61   The database pa
4e50: 67 65 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  ge is the second
4e60: 20 6f 72 20 6c 61 74 65 72 20 70 61 67 65 20 69   or later page i
4e70: 6e 20 61 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20  n a list of.**  
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
4ea0: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
4eb0: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
4ec0: 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20  previous.**     
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
4ee0: 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
4ef0: 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a  ow page list..**
4f00: 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
4f10: 3a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70  : The database p
4f20: 61 67 65 20 69 73 20 61 20 6e 6f 6e 2d 72 6f 6f  age is a non-roo
4f30: 74 20 62 74 72 65 65 20 70 61 67 65 2e 20 54 68  t btree page. Th
4f40: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a  e page number.**
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4f60: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 61  dentifies the pa
4f70: 72 65 6e 74 20 70 61 67 65 20 69 6e 20 74 68 65  rent page in the
4f80: 20 62 74 72 65 65 2e 0a 2a 2f 0a 23 64 65 66 69   btree..*/.#defi
4f90: 6e 65 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  ne PTRMAP_ROOTPA
4fa0: 47 45 20 31 0a 23 64 65 66 69 6e 65 20 50 54 52  GE 1.#define PTR
4fb0: 4d 41 50 5f 46 52 45 45 50 41 47 45 20 32 0a 23  MAP_FREEPAGE 2.#
4fc0: 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 4f 56  define PTRMAP_OV
4fd0: 45 52 46 4c 4f 57 31 20 33 0a 23 64 65 66 69 6e  ERFLOW1 3.#defin
4fe0: 65 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  e PTRMAP_OVERFLO
4ff0: 57 32 20 34 0a 23 64 65 66 69 6e 65 20 50 54 52  W2 4.#define PTR
5000: 4d 41 50 5f 42 54 52 45 45 20 35 0a 0a 2f 2a 0a  MAP_BTREE 5../*.
5010: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
5020: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
5030: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
5040: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
5050: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
5060: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
5070: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
5080: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
5090: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
50a0: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
50b0: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
50c0: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
50d0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
50e0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
50f0: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
5100: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
5110: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
5120: 50 75 74 28 42 74 72 65 65 20 2a 70 42 74 2c 20  Put(Btree *pBt, 
5130: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
5140: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29  pe, Pgno parent)
5150: 7b 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  {.  u8 *pPtrmap;
5160: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
5170: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
5180: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
5190: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
51a0: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
51b0: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
51c0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
51d0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
51e0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ge */.  int rc;.
51f0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
5200: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
5210: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
5220: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5230: 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 69  CORRUPT;.  }.  i
5240: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
5250: 50 41 47 45 4e 4f 28 70 42 74 2d 3e 75 73 61 62  PAGENO(pBt->usab
5260: 6c 65 53 69 7a 65 2c 20 6b 65 79 29 3b 0a 20 20  leSize, key);.  
5270: 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
5280: 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61 67 65  r_get(pBt->pPage
5290: 72 2c 20 69 50 74 72 6d 61 70 2c 20 28 76 6f 69  r, iPtrmap, (voi
52a0: 64 20 2a 2a 29 26 70 50 74 72 6d 61 70 29 3b 0a  d **)&pPtrmap);.
52b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
52c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
52d0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  n rc;.  }.  offs
52e0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
52f0: 46 46 53 45 54 28 70 42 74 2d 3e 75 73 61 62 6c  FFSET(pBt->usabl
5300: 65 53 69 7a 65 2c 20 6b 65 79 29 3b 0a 0a 20 20  eSize, key);..  
5310: 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d  if( eType!=pPtrm
5320: 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65  ap[offset] || ge
5330: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
5340: 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65  offset+1])!=pare
5350: 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28  nt ){.    TRACE(
5360: 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a  ("PTRMAP_UPDATE:
5370: 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c   %d->(%d,%d)\n",
5380: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
5390: 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ent));.    rc = 
53a0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
53b0: 74 65 28 70 50 74 72 6d 61 70 29 3b 0a 20 20 20  te(pPtrmap);.   
53c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
53d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
53e0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
53f0: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
5400: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
5410: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
5420: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
5430: 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
5440: 28 70 50 74 72 6d 61 70 29 3b 0a 20 20 72 65 74  (pPtrmap);.  ret
5450: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5460: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
5470: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
5480: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
5490: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
54a0: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
54b0: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
54c0: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
54d0: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
54e0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
54f0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
5500: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
5510: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
5520: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
5530: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
5540: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
5550: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
5560: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5570: 70 74 72 6d 61 70 47 65 74 28 42 74 72 65 65 20  ptrmapGet(Btree 
5580: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
5590: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
55a0: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20   *pPgno){.  int 
55b0: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
55c0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
55d0: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
55e0: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
55f0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
5600: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
5610: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
5620: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
5630: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
5640: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
5650: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
5660: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2d  RMAP_PAGENO(pBt-
5670: 3e 75 73 61 62 6c 65 53 69 7a 65 2c 20 6b 65 79  >usableSize, key
5680: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
5690: 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e  3pager_get(pBt->
56a0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
56b0: 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 74 72 6d   (void **)&pPtrm
56c0: 61 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  ap);.  if( rc!=0
56d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
56e0: 63 3b 0a 20 20 7d 0a 0a 20 20 6f 66 66 73 65 74  c;.  }..  offset
56f0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
5700: 53 45 54 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  SET(pBt->usableS
5710: 69 7a 65 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  ize, key);.  if(
5720: 20 70 45 54 79 70 65 20 29 20 2a 70 45 54 79 70   pEType ) *pETyp
5730: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
5740: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
5750: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
5760: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
5770: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
5780: 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
5790: 70 50 74 72 6d 61 70 29 3b 0a 20 20 69 66 28 20  pPtrmap);.  if( 
57a0: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
57b0: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
57c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
57d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
57e0: 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
57f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5800: 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  OVACUUM */../*.*
5810: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
5820: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
5830: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
5840: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
5850: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
5860: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
5870: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
5880: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
5890: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
58a0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
58b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
58c0: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
58d0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
58e0: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
58f0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
5900: 74 69 63 20 75 38 20 2a 66 69 6e 64 43 65 6c 6c  tic u8 *findCell
5910: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
5920: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75   int iCell){.  u
5930: 38 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  8 *data = pPage-
5940: 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74  >aData;.  assert
5950: 28 20 69 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20  ( iCell>=0 );.  
5960: 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3c 67 65  assert( iCell<ge
5970: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
5980: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
5990: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 61  ) );.  return da
59a0: 74 61 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ta + get2byte(&d
59b0: 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
59c0: 66 66 73 65 74 2b 32 2a 69 43 65 6c 6c 5d 29 3b  ffset+2*iCell]);
59d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  .}../*.** This a
59e0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
59f0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
5a00: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
5a10: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
5a20: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
5a30: 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65  flow cells.  See
5a40: 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69   insert.*/.stati
5a50: 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c  c u8 *findOverfl
5a60: 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  owCell(MemPage *
5a70: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
5a80: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
5a90: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
5aa0: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
5ab0: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
5ac0: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
5ad0: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
5ae0: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
5af0: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
5b00: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
5b10: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
5b20: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
5b30: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
5b40: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
5b50: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
5b60: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
5b70: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
5b80: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
5b90: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
5ba0: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
5bb0: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
5bc0: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
5bd0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
5be0: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
5bf0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
5c00: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 70 61 72  s function.  par
5c10: 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61  seCell() takes a
5c20: 20 63 65 6c 6c 20 69 6e 64 65 78 0a 2a 2a 20 61   cell index.** a
5c30: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
5c40: 75 6d 65 6e 74 20 61 6e 64 20 70 61 72 73 65 43  ument and parseC
5c50: 65 6c 6c 50 74 72 28 29 20 74 61 6b 65 73 20 61  ellPtr() takes a
5c60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
5c70: 2a 2a 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63  ** body of the c
5c80: 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e  ell as its secon
5c90: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
5ca0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65  tatic void parse
5cb0: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
5cc0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
5cd0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
5ce0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
5cf0: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5d10: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
5d20: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
5d30: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
5d40: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
5d50: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
5d60: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20  */.){.  int n;  
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
5d90: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
5da0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
5db0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
5dc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5dd0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
5de0: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 70 49 6e  ayload */..  pIn
5df0: 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c  fo->pCell = pCel
5e00: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  l;.  assert( pPa
5e10: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
5e20: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
5e30: 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68  .  n = pPage->ch
5e40: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73  ildPtrSize;.  as
5e50: 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61  sert( n==4-4*pPa
5e60: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66  ge->leaf );.  if
5e70: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
5e80: 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   ){.    n += get
5e90: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
5ea0: 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b 0a  n], &nPayload);.
5eb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61    }else{.    nPa
5ec0: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  yload = 0;.  }. 
5ed0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
5ee0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20  &pCell[n], (u64 
5ef0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
5f00: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65  .  pInfo->nHeade
5f10: 72 20 3d 20 6e 3b 0a 20 20 70 49 6e 66 6f 2d 3e  r = n;.  pInfo->
5f20: 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64  nData = nPayload
5f30: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
5f40: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50  intKey ){.    nP
5f50: 61 79 6c 6f 61 64 20 2b 3d 20 70 49 6e 66 6f 2d  ayload += pInfo-
5f60: 3e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  >nKey;.  }.  if(
5f70: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
5f80: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
5f90: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
5fa0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
5fb0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
5fc0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
5fd0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
5fe0: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
5ff0: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
6000: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
6010: 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
6020: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
6030: 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65  ze of cell conte
6040: 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  nt in bytes */. 
6050: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
6060: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
6070: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
6080: 77 20 3d 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65  w = 0;.    nSize
6090: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b   = nPayload + n;
60a0: 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34  .    if( nSize<4
60b0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
60c0: 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  = 4;        /* M
60d0: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
60e0: 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20   is 4 */.    }. 
60f0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
6100: 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65  = nSize;.  }else
6110: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
6120: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
6130: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
6140: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
6150: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  e, we have.    *
6160: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
6170: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
6180: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
6190: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
61a0: 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  .    ** overflow
61b0: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
61c0: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
61d0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
61e0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a  of unused.    **
61f0: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
6200: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
6210: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
6220: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
6230: 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74  ge.    ** in bet
6240: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
6250: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20  d maxLocal..    
6260: 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e  **.    ** Warnin
6270: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
6280: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
6290: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
62a0: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20  uted in any.    
62b0: 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75  ** way will resu
62c0: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  lt in an incompa
62d0: 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61  tible file forma
62e0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
62f0: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
6300: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
6310: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
6320: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
6330: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
6340: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
6350: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
6360: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
6370: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
6380: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
6390: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
63a0: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
63b0: 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  .    minLocal = 
63c0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
63d0: 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  .    maxLocal = 
63e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
63f0: 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  .    surplus = m
6400: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c  inLocal + (nPayl
6410: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
6420: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
6430: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
6440: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
6450: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
6460: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
6470: 20 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20 20 20   = surplus;.    
6480: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e  }else{.      pIn
6490: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e  fo->nLocal = min
64a0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
64b0: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
64c0: 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  w = pInfo->nLoca
64d0: 6c 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f  l + n;.    pInfo
64e0: 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d  ->nSize = pInfo-
64f0: 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a  >iOverflow + 4;.
6500: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
6510: 64 20 70 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  d parseCell(.  M
6520: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
6530: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
6540: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
6550: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
6560: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
6570: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
6580: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
6590: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
65a0: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
65b0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
65c0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
65d0: 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28  .  parseCellPtr(
65e0: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
65f0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70  pPage, iCell), p
6600: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
6610: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
6620: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
6630: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
6640: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
6650: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
6660: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
6670: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
6680: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
6690: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
66a0: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
66b0: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
66c0: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
66d0: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
66e0: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
66f0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
6700: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
6710: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c  .static int cell
6720: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
6730: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
6740: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
6750: 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  ;.  parseCell(pP
6760: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e 66  age, iCell, &inf
6770: 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66  o);.  return inf
6780: 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69  o.nSize;.}.#endi
6790: 66 0a 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c  f.static int cel
67a0: 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65  lSizePtr(MemPage
67b0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
67c0: 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  ll){.  CellInfo 
67d0: 69 6e 66 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c  info;.  parseCel
67e0: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
67f0: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74  l, &info);.  ret
6800: 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  urn info.nSize;.
6810: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
6820: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
6830: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
6840: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
6850: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
6860: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
6870: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
6880: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
6890: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
68a0: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
68b0: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
68c0: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
68d0: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
68e0: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
68f0: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
6900: 29 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 29  ){.  if( pCell )
6910: 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
6920: 6e 66 6f 3b 0a 20 20 20 20 70 61 72 73 65 43 65  nfo;.    parseCe
6930: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
6940: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
6950: 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  if( (info.nData+
6960: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
6970: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66  :info.nKey))>inf
6980: 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
6990: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
69a0: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
69b0: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
69c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 74 72        return ptr
69d0: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
69e0: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
69f0: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
6a00: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  ->pgno);.    }. 
6a10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
6a20: 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49  TE_OK;.}./*.** I
6a30: 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  f the cell with 
6a40: 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70  index iCell on p
6a50: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
6a60: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
6a70: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
6a80: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
6a90: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
6aa0: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
6ab0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
6ac0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
6ad0: 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  t ptrmapPutOvfl(
6ae0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
6af0: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38  int iCell){.  u8
6b00: 20 2a 70 43 65 6c 6c 3b 0a 20 20 70 43 65 6c 6c   *pCell;.  pCell
6b10: 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
6b20: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
6b30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d  );.  return ptrm
6b40: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
6b50: 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65  ge, pCell);.}.#e
6b60: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  ndif.../*.** Do 
6b70: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
6b80: 6f 6e 20 61 20 70 61 67 65 2e 20 20 54 68 72 6f  on a page.  Thro
6b90: 77 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  w an exception i
6ba0: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 0a 2a 2a  f anything is.**
6bb0: 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a   not right..**.*
6bc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6bd0: 73 20 75 73 65 64 20 66 6f 72 20 69 6e 74 65 72  s used for inter
6be0: 6e 61 6c 20 65 72 72 6f 72 20 63 68 65 63 6b 69  nal error checki
6bf0: 6e 67 20 6f 6e 6c 79 2e 20 20 49 74 20 69 73 20  ng only.  It is 
6c00: 6f 6d 69 74 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omitted.** from 
6c10: 6d 6f 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a  most builds..*/.
6c20: 23 69 66 20 64 65 66 69 6e 65 64 28 42 54 52 45  #if defined(BTRE
6c30: 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65 66  E_DEBUG) && !def
6c40: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
6c50: 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  0.static void _p
6c60: 61 67 65 49 6e 74 65 67 72 69 74 79 28 4d 65 6d  ageIntegrity(Mem
6c70: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
6c80: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
6c90: 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 69 6e    u8 *data;.  in
6ca0: 74 20 69 2c 20 6a 2c 20 69 64 78 2c 20 63 2c 20  t i, j, idx, c, 
6cb0: 70 63 2c 20 68 64 72 2c 20 6e 46 72 65 65 3b 0a  pc, hdr, nFree;.
6cc0: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
6cd0: 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 63  ;.  int nCell, c
6ce0: 65 6c 6c 4c 69 6d 69 74 3b 0a 20 20 75 38 20 2a  ellLimit;.  u8 *
6cf0: 75 73 65 64 3b 0a 0a 20 20 75 73 65 64 20 3d 20  used;..  used = 
6d00: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
6d10: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
6d20: 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 75  eSize );.  if( u
6d30: 73 65 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  sed==0 ) return;
6d40: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
6d50: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
6d60: 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  leSize;.  assert
6d70: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d  ( pPage->aData==
6d80: 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  &((unsigned char
6d90: 2a 29 70 50 61 67 65 29 5b 2d 70 50 61 67 65 2d  *)pPage)[-pPage-
6da0: 3e 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65 64 5d  >pBt->psAligned]
6db0: 20 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67   );.  hdr = pPag
6dc0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
6dd0: 61 73 73 65 72 74 28 20 68 64 72 3d 3d 28 70 50  assert( hdr==(pP
6de0: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
6df0: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
6e00: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
6e10: 3d 3d 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  ==sqlite3pager_p
6e20: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
6e30: 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 63 20 3d  >aData) );.  c =
6e40: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 68 64   pPage->aData[hd
6e50: 72 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  r];.  if( pPage-
6e60: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
6e70: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
6e80: 61 66 20 3d 3d 20 28 28 63 20 26 20 50 54 46 5f  af == ((c & PTF_
6e90: 4c 45 41 46 29 21 3d 30 29 20 29 3b 0a 20 20 20  LEAF)!=0) );.   
6ea0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6eb0: 7a 65 72 6f 44 61 74 61 20 3d 3d 20 28 28 63 20  zeroData == ((c 
6ec0: 26 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21  & PTF_ZERODATA)!
6ed0: 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
6ee0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  t( pPage->leafDa
6ef0: 74 61 20 3d 3d 20 28 28 63 20 26 20 50 54 46 5f  ta == ((c & PTF_
6f00: 4c 45 41 46 44 41 54 41 29 21 3d 30 29 20 29 3b  LEAFDATA)!=0) );
6f10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
6f20: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 3d 20 28 28  ge->intKey == ((
6f30: 63 20 26 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c  c & (PTF_INTKEY|
6f40: 50 54 46 5f 4c 45 41 46 44 41 54 41 29 29 21 3d  PTF_LEAFDATA))!=
6f50: 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
6f60: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
6f70: 20 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20   ==.            
6f80: 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61   !(pPage->zeroDa
6f90: 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c  ta || (!pPage->l
6fa0: 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65  eaf && pPage->le
6fb0: 61 66 44 61 74 61 29 29 20 29 3b 0a 20 20 20 20  afData)) );.    
6fc0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
6fd0: 65 6c 6c 4f 66 66 73 65 74 3d 3d 70 50 61 67 65  ellOffset==pPage
6fe0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 31 32 2d 34  ->hdrOffset+12-4
6ff0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
7000: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
7010: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
7020: 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
7030: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 7d  a[hdr+3]) );.  }
7040: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
7050: 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 73 65 74  >aData;.  memset
7060: 28 75 73 65 64 2c 20 30 2c 20 75 73 61 62 6c 65  (used, 0, usable
7070: 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Size);.  for(i=0
7080: 3b 20 69 3c 68 64 72 2b 31 30 2d 70 50 61 67 65  ; i<hdr+10-pPage
7090: 2d 3e 6c 65 61 66 2a 34 3b 20 69 2b 2b 29 20 75  ->leaf*4; i++) u
70a0: 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 6e 46  sed[i] = 1;.  nF
70b0: 72 65 65 20 3d 20 30 3b 0a 20 20 70 63 20 3d 20  ree = 0;.  pc = 
70c0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
70d0: 64 72 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28  dr+1]);.  while(
70e0: 20 70 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 73   pc ){.    int s
70f0: 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
7100: 20 70 63 3e 30 20 26 26 20 70 63 3c 75 73 61 62   pc>0 && pc<usab
7110: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
7120: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
7130: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
7140: 20 20 61 73 73 65 72 74 28 20 70 63 2b 73 69 7a    assert( pc+siz
7150: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e<=usableSize );
7160: 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69  .    nFree += si
7170: 7a 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 63  ze;.    for(i=pc
7180: 3b 20 69 3c 70 63 2b 73 69 7a 65 3b 20 69 2b 2b  ; i<pc+size; i++
7190: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
71a0: 20 75 73 65 64 5b 69 5d 3d 3d 30 20 29 3b 0a 20   used[i]==0 );. 
71b0: 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20 31       used[i] = 1
71c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 63 20 3d  ;.    }.    pc =
71d0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
71e0: 70 63 5d 29 3b 0a 20 20 7d 0a 20 20 69 64 78 20  pc]);.  }.  idx 
71f0: 3d 20 30 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67  = 0;.  nCell = g
7200: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
7210: 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c 4c 69 6d  r+3]);.  cellLim
7220: 69 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  it = get2byte(&d
7230: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61  ata[hdr+5]);.  a
7240: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
7250: 49 6e 69 74 3d 3d 30 20 0a 20 20 20 20 20 20 20  Init==0 .       
7260: 20 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 46 72 65    || pPage->nFre
7270: 65 3d 3d 6e 46 72 65 65 2b 64 61 74 61 5b 68 64  e==nFree+data[hd
7280: 72 2b 37 5d 2b 63 65 6c 6c 4c 69 6d 69 74 2d 28  r+7]+cellLimit-(
7290: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65  cellOffset+2*nCe
72a0: 6c 6c 29 20 29 3b 0a 20 20 63 65 6c 6c 4f 66 66  ll) );.  cellOff
72b0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
72c0: 6c 4f 66 66 73 65 74 3b 0a 20 20 66 6f 72 28 69  lOffset;.  for(i
72d0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
72e0: 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  ){.    int size;
72f0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
7300: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
7310: 73 65 74 2b 32 2a 69 5d 29 3b 0a 20 20 20 20 61  set+2*i]);.    a
7320: 73 73 65 72 74 28 20 70 63 3e 30 20 26 26 20 70  ssert( pc>0 && p
7330: 63 3c 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  c<usableSize-4 )
7340: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c  ;.    size = cel
7350: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61  lSize(pPage, &da
7360: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 61 73 73  ta[pc]);.    ass
7370: 65 72 74 28 20 70 63 2b 73 69 7a 65 3c 3d 75 73  ert( pc+size<=us
7380: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
7390: 66 6f 72 28 6a 3d 70 63 3b 20 6a 3c 70 63 2b 73  for(j=pc; j<pc+s
73a0: 69 7a 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ize; j++){.     
73b0: 20 61 73 73 65 72 74 28 20 75 73 65 64 5b 6a 5d   assert( used[j]
73c0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 75 73 65  ==0 );.      use
73d0: 64 5b 6a 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  d[j] = 1;.    }.
73e0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 63 65 6c 6c    }.  for(i=cell
73f0: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 20  Offset+2*nCell; 
7400: 69 3c 63 65 6c 6c 69 6d 69 74 3b 20 69 2b 2b 29  i<cellimit; i++)
7410: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 75 73  {.    assert( us
7420: 65 64 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  ed[i]==0 );.    
7430: 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d  used[i] = 1;.  }
7440: 0a 20 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  .  nFree = 0;.  
7450: 66 6f 72 28 69 3d 30 3b 20 69 3c 75 73 61 62 6c  for(i=0; i<usabl
7460: 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  eSize; i++){.   
7470: 20 61 73 73 65 72 74 28 20 75 73 65 64 5b 69 5d   assert( used[i]
7480: 3c 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 75  <=1 );.    if( u
7490: 73 65 64 5b 69 5d 3d 3d 30 20 29 20 6e 46 72 65  sed[i]==0 ) nFre
74a0: 65 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  e++;.  }.  asser
74b0: 74 28 20 6e 46 72 65 65 3d 3d 64 61 74 61 5b 68  t( nFree==data[h
74c0: 64 72 2b 37 5d 20 29 3b 0a 20 20 73 71 6c 69 74  dr+7] );.  sqlit
74d0: 65 46 72 65 65 28 75 73 65 64 29 3b 0a 7d 0a 23  eFree(used);.}.#
74e0: 64 65 66 69 6e 65 20 70 61 67 65 49 6e 74 65 67  define pageInteg
74f0: 72 69 74 79 28 58 29 20 5f 70 61 67 65 49 6e 74  rity(X) _pageInt
7500: 65 67 72 69 74 79 28 58 29 0a 23 65 6c 73 65 0a  egrity(X).#else.
7510: 23 20 64 65 66 69 6e 65 20 70 61 67 65 49 6e 74  # define pageInt
7520: 65 67 72 69 74 79 28 58 29 0a 23 65 6e 64 69 66  egrity(X).#endif
7530: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
7540: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
7550: 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72  n.  All Cells ar
7560: 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
7570: 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  * beginning of t
7580: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
7590: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
75a0: 6c 6c 65 63 74 65 64 20 0a 2a 2a 20 69 6e 74 6f  llected .** into
75b0: 20 6f 6e 65 20 62 69 67 20 46 72 65 65 42 6c 6b   one big FreeBlk
75c0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
75d0: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
75e0: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
75f0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
7600: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7620: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7630: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7650: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
7660: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
7670: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7690: 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
76a0: 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c   byte after cell
76b0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
76c0: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
76e0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
76f0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
7700: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
7710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7720: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
7730: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
7740: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7750: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
7760: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
7770: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
7780: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
7790: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
77a0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
77b0: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  array */.  int b
77c0: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
77d0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
77e0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
77f0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
7800: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
7810: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7820: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
7830: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
7840: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
7850: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
7860: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
7870: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
7880: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
7890: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
78a0: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
78b0: 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65  ert( sqlite3page
78c0: 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70 50  r_iswriteable(pP
78d0: 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20  age->aData) );. 
78e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
78f0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
7900: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
7910: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
7920: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
7930: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
7940: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
7950: 3d 3d 30 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ==0 );.  temp = 
7960: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
7970: 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
7980: 7a 65 20 29 3b 0a 20 20 69 66 28 20 74 65 6d 70  ze );.  if( temp
7990: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
79a0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64 61 74  ITE_NOMEM;.  dat
79b0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
79c0: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
79d0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
79e0: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
79f0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
7a00: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
7a10: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
7a20: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
7a30: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
7a40: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
7a50: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
7a60: 6c 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d 20  leSize;.  brk = 
7a70: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
7a80: 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
7a90: 28 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64 61  (&temp[brk], &da
7aa0: 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  ta[brk], usableS
7ab0: 69 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62 72  ize - brk);.  br
7ac0: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
7ad0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
7ae0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
7af0: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
7b00: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
7b10: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
7b20: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
7b30: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
7b40: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
7b50: 70 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73 65  pAddr);.    asse
7b60: 72 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70 42  rt( pc<pPage->pB
7b70: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
7b80: 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c  .    size = cell
7b90: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
7ba0: 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 62  temp[pc]);.    b
7bb0: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
7bc0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72 6b  memcpy(&data[brk
7bd0: 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69  ], &temp[pc], si
7be0: 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  ze);.    put2byt
7bf0: 65 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a 20  e(pAddr, brk);. 
7c00: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72 6b   }.  assert( brk
7c10: 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  >=cellOffset+2*n
7c20: 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79  Cell );.  put2by
7c30: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
7c40: 20 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64   brk);.  data[hd
7c50: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
7c60: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
7c70: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
7c80: 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66    addr = cellOff
7c90: 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d  set+2*nCell;.  m
7ca0: 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72  emset(&data[addr
7cb0: 5d 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29 3b  ], 0, brk-addr);
7cc0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 65  .  sqliteFree(te
7cd0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  mp);.  return SQ
7ce0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
7cf0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
7d00: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
7d10: 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  on a page..**.**
7d20: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
7d30: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
7d40: 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72  ata[] of the fir
7d50: 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
7d60: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
7d70: 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69 66  . Or return 0 if
7d80: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e   there is not en
7d90: 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70 61  ough free.** spa
7da0: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ce on the page t
7db0: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 61 6c  o satisfy the al
7dc0: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73 74  location request
7dd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
7de0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79  age contains nBy
7df0: 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61 63  tes of free spac
7e00: 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  e but does not c
7e10: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73  ontain.** nBytes
7e20: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 66   of contiguous f
7e30: 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20  ree space, then 
7e40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75 74  this routine aut
7e50: 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61  omatically.** ca
7e60: 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74 50  lls defragementP
7e70: 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69  age() to consoli
7e80: 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73 70  date all free sp
7e90: 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61  ace before .** a
7ea0: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e 65  llocating the ne
7eb0: 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74  w chunk..*/.stat
7ec0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
7ed0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
7ee0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  age, int nByte){
7ef0: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63 2c  .  int addr, pc,
7f00: 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65   hdr;.  int size
7f10: 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20  ;.  int nFrag;. 
7f20: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20   int top;.  int 
7f30: 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c  nCell;.  int cel
7f40: 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67  lOffset;.  unsig
7f50: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
7f60: 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67    .  data = pPag
7f70: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65  e->aData;.  asse
7f80: 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65 72  rt( sqlite3pager
7f90: 5f 69 73 77 72 69 74 65 61 62 6c 65 28 64 61 74  _iswriteable(dat
7fa0: 61 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  a) );.  assert( 
7fb0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
7fc0: 69 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e 42  if( nByte<4 ) nB
7fd0: 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 70  yte = 4;.  if( p
7fe0: 50 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74  Page->nFree<nByt
7ff0: 65 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  e || pPage->nOve
8000: 72 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72 6e  rflow>0 ) return
8010: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72   0;.  pPage->nFr
8020: 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68  ee -= nByte;.  h
8030: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8040: 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20  ffset;..  nFrag 
8050: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
8060: 20 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b   if( nFrag<60 ){
8070: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
8080: 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  he freelist look
8090: 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62  ing for a slot b
80a0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
80b0: 69 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  isfy the.    ** 
80c0: 73 70 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a  space request. *
80d0: 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64 72  /.    addr = hdr
80e0: 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  +1;.    while( (
80f0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
8100: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
8110: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65  .      size = ge
8120: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
8130: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2]);.      if( s
8140: 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20  ize>=nByte ){.  
8150: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e        if( size<n
8160: 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20  Byte+4 ){.      
8170: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
8180: 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63  [addr], &data[pc
8190: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 2);.         
81a0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e   data[hdr+7] = n
81b0: 46 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42  Frag + size - nB
81c0: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  yte;.          r
81d0: 65 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20  eturn pc;.      
81e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
81f0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
8200: 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42  a[pc+2], size-nB
8210: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  yte);.          
8220: 72 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65  return pc + size
8230: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
8240: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8250: 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20    addr = pc;.   
8260: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
8270: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
8280: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
8290: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
82a0: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
82b0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
82c0: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f  ntent area..  */
82d0: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
82e0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
82f0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  .  nCell = get2b
8300: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
8310: 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  );.  cellOffset 
8320: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
8330: 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  set;.  if( nFrag
8340: 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73  >=60 || cellOffs
8350: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74  et + 2*nCell > t
8360: 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20  op - nByte ){.  
8370: 20 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e 74    if( defragment
8380: 50 61 67 65 28 70 50 61 67 65 29 20 29 20 72 65  Page(pPage) ) re
8390: 74 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20  turn 0;.    top 
83a0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
83b0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20  [hdr+5]);.  }.  
83c0: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
83d0: 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73  assert( cellOffs
83e0: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20  et + 2*nCell <= 
83f0: 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74  top );.  put2byt
8400: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
8410: 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74  top);.  return t
8420: 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  op;.}../*.** Ret
8430: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
8440: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
8450: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
8460: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
8470: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
8480: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
8490: 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74  age->aDisk[start
84a0: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
84b0: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
84c0: 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a  s "size" bytes..
84d0: 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68  **.** Most of th
84e0: 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73  e effort here is
84f0: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61   involved in coa
8500: 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a  lesing adjacent.
8510: 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69  ** free blocks i
8520: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67  nto a single big
8530: 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a   free block..*/.
8540: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
8550: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
8560: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
8570: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
8580: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
8590: 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  hdr;.  unsigned 
85a0: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
85b0: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
85c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
85d0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
85e0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
85f0: 77 72 69 74 65 61 62 6c 65 28 64 61 74 61 29 20  writeable(data) 
8600: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
8610: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
8620: 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
8630: 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73  eaf?0:4) );.  as
8640: 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73  sert( (start + s
8650: 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74  ize)<=pPage->pBt
8660: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
8670: 20 20 69 66 28 20 73 69 7a 65 3c 34 20 29 20 73    if( size<4 ) s
8680: 69 7a 65 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20 41  ize = 4;..  /* A
8690: 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63  dd the space bac
86a0: 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  k into the linke
86b0: 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  d list of freebl
86c0: 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20  ocks */.  hdr = 
86d0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
86e0: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
86f0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
8700: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
8710: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
8720: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
8730: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8740: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
8750: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
8760: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8770: 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20  begin>addr );.  
8780: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
8790: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
87a0: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
87b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
87c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 62 65  );.  assert( pbe
87d0: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
87e0: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
87f0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
8800: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
8810: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
8820: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
8830: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
8840: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
8850: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73  Page->nFree += s
8860: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65  ize;..  /* Coale
8870: 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65  sce adjacent fre
8880: 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64  e blocks */.  ad
8890: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
88a0: 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69  ffset + 1;.  whi
88b0: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
88c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
88d0: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e  r]))>0 ){.    in
88e0: 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a  t pnext, psize;.
88f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
8900: 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61  in>addr );.    a
8910: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
8920: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8930: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70  eSize-4 );.    p
8940: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
8950: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a  &data[pbegin]);.
8960: 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32      psize = get2
8970: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
8980: 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  n+2]);.    if( p
8990: 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20  begin + psize + 
89a0: 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e  3 >= pnext && pn
89b0: 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ext>0 ){.      i
89c0: 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20  nt frag = pnext 
89d0: 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29  - (pbegin+psize)
89e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
89f0: 66 72 61 67 3c 3d 64 61 74 61 5b 70 50 61 67 65  frag<=data[pPage
8a00: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 29  ->hdrOffset+7] )
8a10: 3b 0a 20 20 20 20 20 20 64 61 74 61 5b 70 50 61  ;.      data[pPa
8a20: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d  ge->hdrOffset+7]
8a30: 20 2d 3d 20 66 72 61 67 3b 0a 20 20 20 20 20 20   -= frag;.      
8a40: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
8a50: 62 65 67 69 6e 5d 2c 20 67 65 74 32 62 79 74 65  begin], get2byte
8a60: 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b  (&data[pnext]));
8a70: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
8a80: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c  &data[pbegin+2],
8a90: 20 70 6e 65 78 74 2b 67 65 74 32 62 79 74 65 28   pnext+get2byte(
8aa0: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d  &data[pnext+2])-
8ab0: 70 62 65 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c  pbegin);.    }el
8ac0: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  se{.      addr =
8ad0: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20   pbegin;.    }. 
8ae0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
8af0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
8b00: 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  a begins with a 
8b10: 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76  freeblock, remov
8b20: 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64  e it. */.  if( d
8b30: 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61  ata[hdr+1]==data
8b40: 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b  [hdr+5] && data[
8b50: 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+2]==data[hdr
8b60: 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  +6] ){.    int t
8b70: 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d  op;.    pbegin =
8b80: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8b90: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d  hdr+1]);.    mem
8ba0: 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  cpy(&data[hdr+1]
8bb0: 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  , &data[pbegin],
8bc0: 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   2);.    top = g
8bd0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
8be0: 72 2b 35 5d 29 3b 0a 20 20 20 20 70 75 74 32 62  r+5]);.    put2b
8bf0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
8c00: 2c 20 74 6f 70 20 2b 20 67 65 74 32 62 79 74 65  , top + get2byte
8c10: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
8c20: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
8c30: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
8c40: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
8c50: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
8c60: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
8c70: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
8c80: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
8c90: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
8ca0: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
8cb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
8cc0: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
8cd0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
8ce0: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 72 65  lagByte){.  Btre
8cf0: 65 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  e *pBt;     /* A
8d00: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
8d10: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
8d20: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
8d30: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
8d40: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
8d50: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ;.  pPage->intKe
8d60: 79 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20  y = (flagByte & 
8d70: 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
8d80: 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20  LEAFDATA))!=0;. 
8d90: 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61   pPage->zeroData
8da0: 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50   = (flagByte & P
8db0: 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b  TF_ZERODATA)!=0;
8dc0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
8dd0: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
8de0: 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61  _LEAF)!=0;.  pPa
8df0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
8e00: 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61   = 4*(pPage->lea
8e10: 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70  f==0);.  pBt = p
8e20: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
8e30: 20 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f   flagByte & PTF_
8e40: 4c 45 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20  LEAFDATA ){.    
8e50: 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
8e60: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
8e70: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
8e80: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
8e90: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
8ea0: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
8eb0: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d  else{.    pPage-
8ec0: 3e 6c 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20  >leafData = 0;. 
8ed0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
8ee0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
8ef0: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
8f00: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
8f10: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70  inLocal;.  }.  p
8f20: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
8f30: 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74  !(pPage->zeroDat
8f40: 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65  a || (!pPage->le
8f50: 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61  af && pPage->lea
8f60: 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  fData));.}../*.*
8f70: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
8f80: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
8f90: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
8fa0: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  k block..**.** T
8fb0: 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d  he pParent param
8fc0: 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 70  eter must be a p
8fd0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
8fe0: 6d 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69  mPage which.** i
8ff0: 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  s the parent of 
9000: 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 69  the page being i
9010: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
9020: 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54   root of a.** BT
9030: 72 65 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e  ree has no paren
9040: 74 20 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61  t and so for tha
9050: 74 20 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d  t page, pParent=
9060: 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  =NULL..**.** Ret
9070: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
9080: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
9090: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
90a0: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
90b0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
90c0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
90d0: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
90e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
90f0: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
9100: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
9110: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
9120: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
9130: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
9140: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
9150: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
9160: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
9170: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
9180: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
9190: 74 20 69 6e 69 74 50 61 67 65 28 0a 20 20 4d 65  t initPage(.  Me
91a0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
91b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
91c0: 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   to be initializ
91d0: 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ed */.  MemPage 
91e0: 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20 20 2f  *pParent       /
91f0: 2a 20 54 68 65 20 70 61 72 65 6e 74 2e 20 20 4d  * The parent.  M
9200: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
9210: 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  ){.  int pc;    
9220: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
9230: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
9240: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
9250: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aData[] */.  int
9260: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
9270: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
9280: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
9290: 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64  eader */.  u8 *d
92a0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
92b0: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
92c0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 72 65  >aData */.  Btre
92d0: 65 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  e *pBt;        /
92e0: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
92f0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
9300: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
9310: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
9320: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
9330: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  each page */.  i
9340: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
9350: 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d    /* Offset from
9360: 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74   start of page t
9370: 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  o first cell poi
9380: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  nter */.  int nF
9390: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
93a0: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
93b0: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
93c0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  ge */.  int top;
93d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
93e0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
93f0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
9400: 61 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50  a */..  pBt = pP
9410: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  age->pBt;.  asse
9420: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
9430: 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d  assert( pParent=
9440: 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70  =0 || pParent->p
9450: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73 73  Bt==pBt );.  ass
9460: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
9470: 3d 3d 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  ==sqlite3pager_p
9480: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
9490: 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 61 73 73  >aData) );.  ass
94a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
94b0: 61 20 3d 3d 20 26 28 28 75 6e 73 69 67 6e 65 64  a == &((unsigned
94c0: 20 63 68 61 72 2a 29 70 50 61 67 65 29 5b 2d 70   char*)pPage)[-p
94d0: 42 74 2d 3e 70 73 41 6c 69 67 6e 65 64 5d 20 29  Bt->psAligned] )
94e0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
94f0: 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74 20  Parent!=pParent 
9500: 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72 65  && (pPage->pPare
9510: 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  nt!=0 || pPage->
9520: 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f  isInit) ){.    /
9530: 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70 61 67  * The parent pag
9540: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 63  e should never c
9550: 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74 68 65  hange unless the
9560: 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
9570: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
9580: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 2f  QLITE_CORRUPT; /
9590: 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a  * bkpt-CORRUPT *
95a0: 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  /.  }.  if( pPag
95b0: 65 2d 3e 69 73 49 6e 69 74 20 29 20 72 65 74 75  e->isInit ) retu
95c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
95d0: 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
95e0: 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74  nt==0 && pParent
95f0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  !=0 ){.    pPage
9600: 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72  ->pParent = pPar
9610: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
9620: 70 61 67 65 72 5f 72 65 66 28 70 50 61 72 65 6e  pager_ref(pParen
9630: 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d 0a 20  t->aData);.  }. 
9640: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
9650: 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
9660: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
9670: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
9680: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 3b  age, data[hdr]);
9690: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
96a0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
96b0: 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
96c0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
96d0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
96e0: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
96f0: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
9700: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
9710: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 74  pPage->leaf;.  t
9720: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
9730: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 70  ata[hdr+5]);.  p
9740: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
9750: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9760: 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67  +3]);.  if( pPag
9770: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
9780: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
9790: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
97a0: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
97b0: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
97c0: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
97d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
97e0: 43 4f 52 52 55 50 54 3b 20 2f 2a 20 62 6b 70 74  CORRUPT; /* bkpt
97f0: 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 7d 0a  -CORRUPT */.  }.
9800: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
9810: 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74  ll==0 && pParent
9820: 21 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  !=0 && pParent->
9830: 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 2f  pgno!=1 ){.    /
9840: 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d 75 73 74  * All pages must
9850: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
9860: 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65 70 74 20  ne cell, except 
9870: 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73 20 2a  for root pages *
9880: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
9890: 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 2f 2a 20  ITE_CORRUPT; /* 
98a0: 62 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a  bkpt-CORRUPT */.
98b0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
98c0: 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
98d0: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
98e0: 67 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74  ge */.  pc = get
98f0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9900: 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64  1]);.  nFree = d
9910: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70  ata[hdr+7] + top
9920: 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b   - (cellOffset +
9930: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29   2*pPage->nCell)
9940: 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20  ;.  while( pc>0 
9950: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 2c  ){.    int next,
9960: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70   size;.    if( p
9970: 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  c>usableSize-4 )
9980: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  {.      /* Free 
9990: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
99a0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 72   page */.      r
99b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
99c0: 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43  RUPT;  /* bkpt-C
99d0: 4f 52 52 55 50 54 20 2a 2f 0a 20 20 20 20 7d 0a  ORRUPT */.    }.
99e0: 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
99f0: 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
9a00: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
9a10: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
9a20: 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30  ;.    if( next>0
9a30: 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a   && next<=pc+siz
9a40: 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  e+3 ){.      /* 
9a50: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
9a60: 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e 67   be in accending
9a70: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
9a80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9a90: 52 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d  RRUPT;  /* bkpt-
9aa0: 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 20 20 7d  CORRUPT */.    }
9ab0: 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69  .    nFree += si
9ac0: 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65 78  ze;.    pc = nex
9ad0: 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  t;.  }.  pPage->
9ae0: 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20  nFree = nFree;. 
9af0: 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62   if( nFree>=usab
9b00: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  leSize ){.    /*
9b10: 20 46 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e   Free space cann
9b20: 6f 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20  ot exceed total 
9b30: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  page size */.   
9b40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9b50: 4f 52 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74  ORRUPT;  /* bkpt
9b60: 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 7d 0a  -CORRUPT */.  }.
9b70: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
9b80: 20 3d 20 31 3b 0a 20 20 70 61 67 65 49 6e 74 65   = 1;.  pageInte
9b90: 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20 20  grity(pPage);.  
9ba0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
9bc0: 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20  p a raw page so 
9bd0: 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69  that it looks li
9be0: 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61  ke a database pa
9bf0: 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f  ge holding.** no
9c00: 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
9c10: 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67  tic void zeroPag
9c20: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
9c30: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
9c40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
9c50: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
9c60: 74 61 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ta;.  Btree *pBt
9c70: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
9c80: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
9c90: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
9ca0: 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  nt first;..  ass
9cb0: 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65  ert( sqlite3page
9cc0: 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 64 61 74  r_pagenumber(dat
9cd0: 61 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  a)==pPage->pgno 
9ce0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26 64 61  );.  assert( &da
9cf0: 74 61 5b 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65  ta[pBt->psAligne
9d00: 64 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65 64 20  d] == (unsigned 
9d10: 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a 20  char*)pPage );. 
9d20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9d30: 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c  pager_iswriteabl
9d40: 65 28 64 61 74 61 29 20 29 3b 0a 20 20 6d 65 6d  e(data) );.  mem
9d50: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
9d60: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
9d70: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64 61 74  ze - hdr);.  dat
9d80: 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a  a[hdr] = flags;.
9d90: 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20    first = hdr + 
9da0: 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54  8 + 4*((flags&PT
9db0: 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d  F_LEAF)==0);.  m
9dc0: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
9dd0: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
9de0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
9df0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
9e00: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
9e10: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
9e20: 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75  ->nFree = pBt->u
9e30: 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
9e40: 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  t;.  decodeFlags
9e50: 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  (pPage, flags);.
9e60: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
9e70: 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67  et = hdr;.  pPag
9e80: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
9e90: 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e  first;.  pPage->
9ea0: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
9eb0: 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
9ec0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e   = 0;.  pPage->n
9ed0: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
9ee0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
9ef0: 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70   pageIntegrity(p
9f00: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
9f10: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
9f20: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
9f30: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
9f40: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
9f50: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
9f60: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
9f70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
9f80: 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 42 74  tPage(Btree *pBt
9f90: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d  , Pgno pgno, Mem
9fa0: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 29 7b 0a  Page **ppPage){.
9fb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
9fc0: 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
9fd0: 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
9fe0: 67 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ge;.  rc = sqlit
9ff0: 65 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d  e3pager_get(pBt-
a000: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
a010: 76 6f 69 64 2a 2a 29 26 61 44 61 74 61 29 3b 0a  void**)&aData);.
a020: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a030: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20  n rc;.  pPage = 
a040: 28 4d 65 6d 50 61 67 65 2a 29 26 61 44 61 74 61  (MemPage*)&aData
a050: 5b 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65 64 5d  [pBt->psAligned]
a060: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
a070: 20 3d 20 61 44 61 74 61 3b 0a 20 20 70 50 61 67   = aData;.  pPag
a080: 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
a090: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
a0a0: 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  no;.  pPage->hdr
a0b0: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
a0c0: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
a0d0: 30 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70  0;.  *ppPage = p
a0e0: 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
a0f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a100: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
a110: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
a120: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20   initialize it. 
a130: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
a140: 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65   is just a conve
a150: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
a160: 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63  round separate c
a170: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 67 65 74 50 61  alls to.** getPa
a180: 67 65 28 29 20 61 6e 64 20 69 6e 69 74 50 61 67  ge() and initPag
a190: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
a1a0: 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
a1b0: 65 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 2c  e(.  Btree *pBt,
a1c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a1d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
a1e0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
a1f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a200: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
a210: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
a220: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
a230: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
a240: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
a250: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
a260: 72 65 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65  rent     /* Pare
a270: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nt of the page *
a280: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
a290: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a   if( pgno==0 ){.
a2a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a2b0: 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f 2a 20 62  E_CORRUPT;  /* b
a2c0: 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20  kpt-CORRUPT */. 
a2d0: 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67   }.  rc = getPag
a2e0: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
a2f0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
a300: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70  SQLITE_OK && (*p
a310: 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
a320: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 6e  0 ){.    rc = in
a330: 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c 20  itPage(*ppPage, 
a340: 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  pParent);.  }.  
a350: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
a360: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
a370: 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
a380: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
a390: 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
a3a0: 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 67 65 74  r.** call to get
a3b0: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
a3c0: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
a3d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
a3e0: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  {.  if( pPage ){
a3f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
a400: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
a410: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a420: 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pBt );.    asser
a430: 74 28 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61  t( &pPage->aData
a440: 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 73 41  [pPage->pBt->psA
a450: 6c 69 67 6e 65 64 5d 3d 3d 28 75 6e 73 69 67 6e  ligned]==(unsign
a460: 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 20 29  ed char*)pPage )
a470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  ;.    sqlite3pag
a480: 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 2d 3e  er_unref(pPage->
a490: 61 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  aData);.  }.}../
a4a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a4b0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
a4c0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
a4d0: 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 0a  ount for a page.
a4e0: 2a 2a 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ** reaches zero.
a4f0: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 75 6e 72    We need to unr
a500: 65 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70  ef the pParent p
a510: 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68 61 74  ointer when that
a520: 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a  .** happens..*/.
a530: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
a540: 44 65 73 74 72 75 63 74 6f 72 28 76 6f 69 64 20  Destructor(void 
a550: 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65  *pData, int page
a560: 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Size){.  MemPage
a570: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
a580: 67 65 2a 29 26 28 28 63 68 61 72 2a 29 70 44 61  ge*)&((char*)pDa
a590: 74 61 29 5b 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  ta)[FORCE_ALIGNM
a5a0: 45 4e 54 28 70 61 67 65 53 69 7a 65 29 5d 3b 0a  ENT(pageSize)];.
a5b0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
a5c0: 72 65 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50  rent ){.    MemP
a5d0: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70  age *pParent = p
a5e0: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
a5f0: 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
a600: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  t = 0;.    relea
a610: 73 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b  sePage(pParent);
a620: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73  .  }.  pPage->is
a630: 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Init = 0;.}../*.
a640: 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
a650: 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
a660: 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
a670: 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
a680: 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
a690: 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
a6a0: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
a6b0: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
a6c0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
a6d0: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
a6e0: 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
a6f0: 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
a700: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a710: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
a720: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
a730: 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
a740: 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
a750: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
a760: 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
a770: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
a780: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
a790: 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
a7a0: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
a7b0: 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65   pageSize){.  Me
a7c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
a7d0: 4d 65 6d 50 61 67 65 2a 29 26 28 28 63 68 61 72  MemPage*)&((char
a7e0: 2a 29 70 44 61 74 61 29 5b 46 4f 52 43 45 5f 41  *)pData)[FORCE_A
a7f0: 4c 49 47 4e 4d 45 4e 54 28 70 61 67 65 53 69 7a  LIGNMENT(pageSiz
a800: 65 29 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  e)];.  if( pPage
a810: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
a820: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
a830: 30 3b 0a 20 20 20 20 69 6e 69 74 50 61 67 65 28  0;.    initPage(
a840: 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50  pPage, pPage->pP
a850: 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  arent);.  }.}../
a860: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
a870: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
a880: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
a890: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
a8a0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
a8b0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
a8c0: 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74  ULL.** a new dat
a8d0: 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e  abase with a ran
a8e0: 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61  dom name is crea
a8f0: 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f  ted.  This rando
a900: 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74  mly named.** dat
a910: 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
a920: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  be deleted when 
a930: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
a940: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
a950: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
a960: 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  eeOpen(.  const 
a970: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
a980: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
a990: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
a9a0: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
a9b0: 61 73 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ase */.  Btree *
a9c0: 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
a9d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
a9e0: 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
a9f0: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
aa00: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
aa10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
aa20: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 72  ions */.){.  Btr
aa30: 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 72  ee *pBt;.  int r
aa40: 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76  c;.  int nReserv
aa50: 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  e;.  unsigned ch
aa60: 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
aa70: 5d 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  ];..  /*.  ** Th
aa80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
aa90: 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68  rts make sure th
aaa0: 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73  at structures us
aab0: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
aac0: 61 72 65 0a 20 20 2a 2a 20 74 68 65 20 72 69 67  are.  ** the rig
aad0: 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
aae0: 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
aaf0: 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
ab00: 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 2a 2a  that result.  **
ab10: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
ab20: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
ab30: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 2a  rchitecture..  *
ab40: 2f 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  /.  assert( size
ab50: 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20  of(i64)==8 );.  
ab60: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
ab70: 36 34 29 3d 3d 38 20 29 3b 0a 20 20 61 73 73 65  64)==8 );.  asse
ab80: 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
ab90: 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
aba0: 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
abb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
abc0: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
abd0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
abe0: 70 74 72 29 3d 3d 73 69 7a 65 6f 66 28 63 68 61  ptr)==sizeof(cha
abf0: 72 2a 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  r*) );.  assert(
ac00: 20 73 69 7a 65 6f 66 28 75 70 74 72 29 3d 3d 73   sizeof(uptr)==s
ac10: 69 7a 65 6f 66 28 70 74 72 29 20 29 3b 0a 0a 20  izeof(ptr) );.. 
ac20: 20 70 42 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pBt = sqliteMal
ac30: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  loc( sizeof(*pBt
ac40: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 3d 3d  ) );.  if( pBt==
ac50: 30 20 29 7b 0a 20 20 20 20 2a 70 70 42 74 72 65  0 ){.    *ppBtre
ac60: 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  e = 0;.    retur
ac70: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ac80: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
ac90: 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 26 70 42  e3pager_open(&pB
aca0: 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
acb0: 6e 61 6d 65 2c 20 45 58 54 52 41 5f 53 49 5a 45  name, EXTRA_SIZE
acc0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
acd0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ace0: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50  .    if( pBt->pP
acf0: 61 67 65 72 20 29 20 73 71 6c 69 74 65 33 70 61  ager ) sqlite3pa
ad00: 67 65 72 5f 63 6c 6f 73 65 28 70 42 74 2d 3e 70  ger_close(pBt->p
ad10: 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  Pager);.    sqli
ad20: 74 65 46 72 65 65 28 70 42 74 29 3b 0a 20 20 20  teFree(pBt);.   
ad30: 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
ad40: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
ad50: 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  }.  sqlite3pager
ad60: 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28  _set_destructor(
ad70: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
ad80: 65 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  eDestructor);.  
ad90: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
ada0: 5f 72 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70  _reiniter(pBt->p
adb0: 50 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69  Pager, pageReini
adc0: 74 29 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73  t);.  pBt->pCurs
add0: 6f 72 20 3d 20 30 3b 0a 20 20 70 42 74 2d 3e 70  or = 0;.  pBt->p
ade0: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 70 42 74  Page1 = 0;.  pBt
adf0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c  ->readOnly = sql
ae00: 69 74 65 33 70 61 67 65 72 5f 69 73 72 65 61 64  ite3pager_isread
ae10: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
ae20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  );.  sqlite3page
ae30: 72 5f 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65  r_read_fileheade
ae40: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73  r(pBt->pPager, s
ae50: 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
ae60: 2c 20 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  , zDbHeader);.  
ae70: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
ae80: 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61  get2byte(&zDbHea
ae90: 64 65 72 5b 31 36 5d 29 3b 0a 20 20 69 66 28 20  der[16]);.  if( 
aea0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
aeb0: 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
aec0: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
aed0: 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 70  GE_SIZE ){.    p
aee0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53  Bt->pageSize = S
aef0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
af00: 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 70 42 74  GE_SIZE;.    pBt
af10: 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d  ->maxEmbedFrac =
af20: 20 36 34 3b 20 20 20 2f 2a 20 32 35 25 20 2a 2f   64;   /* 25% */
af30: 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62  .    pBt->minEmb
af40: 65 64 46 72 61 63 20 3d 20 33 32 3b 20 20 20 2f  edFrac = 32;   /
af50: 2a 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20 20 70  * 12.5% */.    p
af60: 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20  Bt->minLeafFrac 
af70: 3d 20 33 32 3b 20 20 20 20 2f 2a 20 31 32 2e 35  = 32;    /* 12.5
af80: 25 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  % */.#ifndef SQL
af90: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
afa0: 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  UUM.    /* If th
afb0: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
afc0: 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
afd0: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
afe0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
aff0: 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 73 65      ** do not se
b000: 74 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  t the auto-vacuu
b010: 6d 20 66 6c 61 67 2c 20 65 76 65 6e 20 69 66 20  m flag, even if 
b020: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
b030: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2a 2a  UTOVACUUM.    **
b040: 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
b050: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
b060: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
b070: 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
b080: 66 69 6e 65 64 2c 0a 20 20 20 20 2a 2a 20 74 68  fined,.    ** th
b090: 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
b0a0: 20 6a 75 73 74 20 61 20 72 65 67 75 6c 61 72 20   just a regular 
b0b0: 66 69 6c 65 2d 6e 61 6d 65 2e 20 52 65 73 70 65  file-name. Respe
b0c0: 63 74 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  ct the auto-vacu
b0d0: 75 6d 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  um.    ** defaul
b0e0: 74 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  t in this case..
b0f0: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
b100: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
b110: 59 44 42 0a 20 20 20 20 69 66 28 20 7a 46 69 6c  YDB.    if( zFil
b120: 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
b130: 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
b140: 72 79 3a 22 29 20 29 7b 0a 23 65 6c 73 65 0a 20  ry:") ){.#else. 
b150: 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
b160: 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   ){.#endif.     
b170: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
b180: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
b190: 54 5f 41 55 54 4f 56 41 43 55 55 4d 3b 0a 20 20  T_AUTOVACUUM;.  
b1a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e    }.#endif.    n
b1b0: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 7d  Reserve = 0;.  }
b1c0: 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 65 72  else{.    nReser
b1d0: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
b1e0: 30 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78  0];.    pBt->max
b1f0: 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48  EmbedFrac = zDbH
b200: 65 61 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20 70  eader[21];.    p
b210: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
b220: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 32 5d   = zDbHeader[22]
b230: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  ;.    pBt->minLe
b240: 61 66 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64  afFrac = zDbHead
b250: 65 72 5b 32 33 5d 3b 0a 20 20 20 20 70 42 74 2d  er[23];.    pBt-
b260: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
b270: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
b280: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
b290: 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
b2a0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
b2b0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
b2c0: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 4*4])?1:0);.#
b2d0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 42 74 2d  endif.  }.  pBt-
b2e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
b2f0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
b300: 65 73 65 72 76 65 3b 0a 20 20 70 42 74 2d 3e 70  eserve;.  pBt->p
b310: 73 41 6c 69 67 6e 65 64 20 3d 20 46 4f 52 43 45  sAligned = FORCE
b320: 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42 74 2d 3e  _ALIGNMENT(pBt->
b330: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 73 71 6c  pageSize);.  sql
b340: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61  ite3pager_set_pa
b350: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
b360: 65 72 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  er, pBt->pageSiz
b370: 65 29 3b 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  e);.  *ppBtree =
b380: 20 70 42 74 3b 0a 20 20 72 65 74 75 72 6e 20 53   pBt;.  return S
b390: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b3a0: 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e  ** Close an open
b3b0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e   database and in
b3c0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72  validate all cur
b3d0: 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sors..*/.int sql
b3e0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42  ite3BtreeClose(B
b3f0: 74 72 65 65 20 2a 70 42 74 29 7b 0a 20 20 77 68  tree *pBt){.  wh
b400: 69 6c 65 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ile( pBt->pCurso
b410: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
b420: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
b430: 28 70 42 74 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pBt->pCursor);.
b440: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67    }.  sqlite3pag
b450: 65 72 5f 63 6c 6f 73 65 28 70 42 74 2d 3e 70 50  er_close(pBt->pP
b460: 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 46  ager);.  sqliteF
b470: 72 65 65 28 70 42 74 29 3b 0a 20 20 72 65 74 75  ree(pBt);.  retu
b480: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b490: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
b4a0: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 63  e busy handler c
b4b0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
b4c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b4d0: 42 74 72 65 65 53 65 74 42 75 73 79 48 61 6e 64  BtreeSetBusyHand
b4e0: 6c 65 72 28 42 74 72 65 65 20 2a 70 42 74 2c 20  ler(Btree *pBt, 
b4f0: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 48 61  BusyHandler *pHa
b500: 6e 64 6c 65 72 29 7b 0a 20 20 70 42 74 2d 3e 70  ndler){.  pBt->p
b510: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 48  BusyHandler = pH
b520: 61 6e 64 6c 65 72 3b 0a 20 20 73 71 6c 69 74 65  andler;.  sqlite
b530: 33 70 61 67 65 72 5f 73 65 74 5f 62 75 73 79 68  3pager_set_busyh
b540: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
b550: 65 72 2c 20 70 48 61 6e 64 6c 65 72 29 3b 0a 20  er, pHandler);. 
b560: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b570: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
b580: 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
b590: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
b5a0: 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
b5b0: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
b5c0: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
b5d0: 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
b5e0: 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
b5f0: 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
b600: 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
b610: 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
b620: 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
b630: 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
b640: 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
b650: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
b660: 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
b670: 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
b680: 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
b690: 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
b6a0: 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
b6b0: 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
b6c0: 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
b6d0: 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
b6e0: 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
b6f0: 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
b700: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
b710: 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
b720: 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
b730: 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
b740: 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
b750: 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
b760: 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
b770: 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
b780: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
b790: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
b7a0: 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
b7b0: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
b7c0: 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
b7d0: 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
b7e0: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
b7f0: 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
b800: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
b810: 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
b820: 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
b830: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
b840: 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
b850: 65 65 20 2a 70 42 74 2c 20 69 6e 74 20 6d 78 50  ee *pBt, int mxP
b860: 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 70  age){.  sqlite3p
b870: 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69  ager_set_cachesi
b880: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
b890: 6d 78 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  mxPage);.  retur
b8a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b8b0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
b8c0: 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
b8d0: 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
b8e0: 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
b8f0: 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
b900: 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
b910: 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
b920: 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
b930: 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
b940: 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
b950: 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
b960: 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
b970: 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
b980: 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
b990: 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
b9a0: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
b9b0: 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
b9c0: 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
b9d0: 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
b9e0: 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
b9f0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
ba00: 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
ba10: 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
ba20: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
ba30: 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
ba40: 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
ba50: 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
ba60: 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
ba70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ba80: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
ba90: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
baa0: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42  SetSafetyLevel(B
bab0: 74 72 65 65 20 2a 70 42 74 2c 20 69 6e 74 20 6c  tree *pBt, int l
bac0: 65 76 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  evel){.  sqlite3
bad0: 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79  pager_set_safety
bae0: 5f 6c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  _level(pBt->pPag
baf0: 65 72 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 72 65  er, level);.  re
bb00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
bb10: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
bb20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bb30: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
bb40: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
bb50: 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
bb60: 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  )./*.** Change t
bb70: 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
bb80: 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
bb90: 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
bba0: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
bbb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
bbc0: 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
bbd0: 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
bbe0: 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
bbf0: 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
bc00: 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
bc10: 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
bc20: 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
bc30: 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
bc40: 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
bc50: 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
bc60: 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
bc70: 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
bc80: 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
bc90: 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
bca0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
bcb0: 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
bcc0: 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
bcd0: 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
bce0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
bcf0: 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
bd00: 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
bd10: 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
bd20: 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
bd30: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
bd40: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
bd50: 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
bd60: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
bd70: 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
bd80: 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
bd90: 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
bda0: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
bdb0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
bdc0: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
bdd0: 7a 65 28 42 74 72 65 65 20 2a 70 42 74 2c 20 69  ze(Btree *pBt, i
bde0: 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
bdf0: 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 66   nReserve){.  if
be00: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
be10: 69 78 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  ixed ){.    retu
be20: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
be30: 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  LY;.  }.  if( nR
be40: 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20  eserve<0 ){.    
be50: 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e  nReserve = pBt->
be60: 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
be70: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a  usableSize;.  }.
be80: 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
be90: 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
bea0: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
beb0: 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
bec0: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
bed0: 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
bee0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
bef0: 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
bf00: 20 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65 64 20   pBt->psAligned 
bf10: 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  = FORCE_ALIGNMEN
bf20: 54 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  T(pageSize);.   
bf30: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
bf40: 74 5f 70 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  t_pagesize(pBt->
bf50: 70 50 61 67 65 72 2c 20 70 61 67 65 53 69 7a 65  pPager, pageSize
bf60: 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73  );.  }.  pBt->us
bf70: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
bf80: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
bf90: 72 76 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  rve;.  return SQ
bfa0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
bfb0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
bfc0: 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
bfd0: 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
bfe0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
bff0: 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
c000: 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42  Bt){.  return pB
c010: 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69  t->pageSize;.}.i
c020: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
c030: 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
c040: 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pBt){.  return 
c050: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
c060: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
c070: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
c080: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c090: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
c0a0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
c0b0: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
c0c0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
c0d0: 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
c0e0: 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
c0f0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
c100: 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
c110: 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
c120: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
c130: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
c140: 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
c150: 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
c160: 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
c170: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
c180: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
c190: 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
c1a0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
c1b0: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
c1c0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
c1d0: 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
c1e0: 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
c1f0: 75 75 6d 28 42 74 72 65 65 20 2a 70 42 74 2c 20  uum(Btree *pBt, 
c200: 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
c210: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
c220: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
c230: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
c240: 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
c250: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
c260: 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 72  zeFixed ){.    r
c270: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
c280: 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 70 42 74  DONLY;.  }.  pBt
c290: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
c2a0: 61 75 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b  autoVacuum?1:0);
c2b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c2c0: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  _OK;.#endif.}../
c2d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c2e0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
c2f0: 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
c300: 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
c310: 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
c320: 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
c330: 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
c340: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c350: 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
c360: 42 74 72 65 65 20 2a 70 42 74 29 7b 0a 23 69 66  Btree *pBt){.#if
c370: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c380: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
c390: 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72  urn 0;.#else.  r
c3a0: 65 74 75 72 6e 20 70 42 74 2d 3e 61 75 74 6f 56  eturn pBt->autoV
c3b0: 61 63 75 75 6d 3b 0a 23 65 6e 64 69 66 0a 7d 0a  acuum;.#endif.}.
c3c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65  ../*.** Get a re
c3d0: 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65  ference to pPage
c3e0: 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
c3f0: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69  e file.  This wi
c400: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69  ll.** also acqui
c410: 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e  re a readlock on
c420: 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   that file..**.*
c430: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
c440: 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
c450: 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ss.  If the file
c460: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c   is not a.** wel
c470: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
c480: 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c  e file, then SQL
c490: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
c4a0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49  eturned..** SQLI
c4b0: 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
c4c0: 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62  ned if the datab
c4d0: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20  ase is locked.  
c4e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
c4f0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77  is returned if w
c500: 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
c510: 6f 72 79 2e 20 20 53 51 4c 49 54 45 5f 50 52 4f  ory.  SQLITE_PRO
c520: 54 4f 43 4f 4c 20 69 73 20 72 65 74 75 72 6e 65  TOCOL is returne
c530: 64 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  d.** if there is
c540: 20 61 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f   a locking proto
c550: 63 6f 6c 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a  col violation..*
c560: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
c570: 6b 42 74 72 65 65 28 42 74 72 65 65 20 2a 70 42  kBtree(Btree *pB
c580: 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
c590: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
c5a0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67  .  if( pBt->pPag
c5b0: 65 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e1 ) return SQLI
c5c0: 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 67 65  TE_OK;.  rc = ge
c5d0: 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
c5e0: 50 61 67 65 31 29 3b 0a 20 20 69 66 28 20 72 63  Page1);.  if( rc
c5f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
c600: 74 75 72 6e 20 72 63 3b 0a 20 20 0a 0a 20 20 2f  turn rc;.  ..  /
c610: 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
c620: 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
c630: 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
c640: 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
c650: 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
c660: 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
c670: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  .  rc = SQLITE_N
c680: 4f 54 41 44 42 3b 0a 20 20 69 66 28 20 73 71 6c  OTADB;.  if( sql
c690: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
c6a0: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
c6b0: 3e 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 61  >0 ){.    u8 *pa
c6c0: 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
c6d0: 61 74 61 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ata;.    if( mem
c6e0: 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
c6f0: 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
c700: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
c710: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
c720: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
c730: 61 67 65 31 5b 31 38 5d 3e 31 20 7c 7c 20 70 61  age1[18]>1 || pa
c740: 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
c750: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
c760: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
c770: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
c780: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  ze = get2byte(&p
c790: 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 70  age1[16]);.    p
c7a0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
c7b0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
c7c0: 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
c7d0: 69 66 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  if( pBt->usableS
c7e0: 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20  ize<500 ){.     
c7f0: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
c800: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
c810: 20 20 20 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65     pBt->psAligne
c820: 64 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  d = FORCE_ALIGNM
c830: 45 4e 54 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  ENT(pBt->pageSiz
c840: 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78  e);.    pBt->max
c850: 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67 65  EmbedFrac = page
c860: 31 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d 3e  1[21];.    pBt->
c870: 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 70  minEmbedFrac = p
c880: 61 67 65 31 5b 32 32 5d 3b 0a 20 20 20 20 70 42  age1[22];.    pB
c890: 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d  t->minLeafFrac =
c8a0: 20 70 61 67 65 31 5b 32 33 5d 3b 0a 23 69 66 6e   page1[23];.#ifn
c8b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c8c0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
c8d0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
c8e0: 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
c8f0: 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
c900: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
c910: 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
c920: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
c930: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
c940: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
c950: 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
c960: 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
c970: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
c980: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
c990: 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
c9a0: 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
c9b0: 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
c9c0: 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
c9d0: 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
c9e0: 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
c9f0: 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
ca00: 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
ca10: 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
ca20: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
ca30: 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
ca40: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
ca50: 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
ca60: 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
ca70: 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
ca80: 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
ca90: 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
caa0: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
cab0: 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
cac0: 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
cad0: 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64  e poiner, a head
cae0: 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
caf0: 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
cb00: 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
cb10: 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
cb20: 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
cb30: 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
cb40: 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
cb50: 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
cb60: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70  t->maxLocal = (p
cb70: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
cb80: 32 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64  2)*pBt->maxEmbed
cb90: 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20  Frac/255 - 23;. 
cba0: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
cbb0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
cbc0: 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45 6d  e-12)*pBt->minEm
cbd0: 62 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33  bedFrac/255 - 23
cbe0: 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
cbf0: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
cc00: 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e  ze - 35;.  pBt->
cc10: 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e  minLeaf = (pBt->
cc20: 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70  usableSize-12)*p
cc30: 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 2f  Bt->minLeafFrac/
cc40: 32 35 35 20 2d 20 32 33 3b 0a 20 20 69 66 28 20  255 - 23;.  if( 
cc50: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42  pBt->minLocal>pB
cc60: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20 70  t->maxLocal || p
cc70: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20 29  Bt->maxLocal<0 )
cc80: 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31  {.    goto page1
cc90: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
cca0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
ccb0: 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
ccc0: 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
ccd0: 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
cce0: 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
ccf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cd00: 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
cd10: 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
cd20: 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
cd30: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
cd40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cd50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
cd60: 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f  ne works like lo
cd70: 63 6b 42 74 72 65 65 28 29 20 65 78 63 65 70 74  ckBtree() except
cd80: 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e   that it also in
cd90: 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73  vokes the.** bus
cda0: 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
cdb0: 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74  ere is lock cont
cdc0: 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ention..*/.stati
cdd0: 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57  c int lockBtreeW
cde0: 69 74 68 52 65 74 72 79 28 42 74 72 65 65 20 2a  ithRetry(Btree *
cdf0: 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pBt){.  int rc =
ce00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
ce10: 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 3d 3d  ( pBt->inTrans==
ce20: 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
ce30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
ce40: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42  reeBeginTrans(pB
ce50: 74 2c 20 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  t, 0);.    pBt->
ce60: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
ce70: 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NONE;.  }.  retu
ce80: 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20  rn rc;.}.       
ce90: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
cea0: 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
ceb0: 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
cec0: 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
ced0: 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
cee0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
cef0: 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
cf00: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
cf10: 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
cf20: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
cf30: 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
cf40: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
cf50: 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
cf60: 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
cf70: 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
cf80: 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
cf90: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
cfa0: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  ny outstanding c
cfb0: 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75  ursors, this rou
cfc0: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
cfd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
cfe0: 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
cff0: 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
d000: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
d010: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
d020: 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
d030: 65 49 66 55 6e 75 73 65 64 28 42 74 72 65 65 20  eIfUnused(Btree 
d040: 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74  *pBt){.  if( pBt
d050: 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
d060: 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43  _NONE && pBt->pC
d070: 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d  ursor==0 && pBt-
d080: 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
d090: 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
d0a0: 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20  1->aData==0 ){. 
d0b0: 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
d0c0: 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  age = pBt->pPage
d0d0: 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  1;.      pPage->
d0e0: 61 44 61 74 61 20 3d 20 26 28 28 63 68 61 72 2a  aData = &((char*
d0f0: 29 70 50 61 67 65 29 5b 2d 70 42 74 2d 3e 70 73  )pPage)[-pBt->ps
d100: 41 6c 69 67 6e 65 64 5d 3b 0a 20 20 20 20 20 20  Aligned];.      
d110: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
d120: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70  ;.      pPage->p
d130: 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  gno = 1;.    }. 
d140: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
d150: 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20  Bt->pPage1);.   
d160: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
d170: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
d180: 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 0;.  }.}../*
d190: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
d1a0: 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
d1b0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
d1c0: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a  rst page of the.
d1d0: 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ** file..*/.stat
d1e0: 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
d1f0: 73 65 28 42 74 72 65 65 20 2a 70 42 74 29 7b 0a  se(Btree *pBt){.
d200: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a    MemPage *pP1;.
d210: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
d220: 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b  *data;.  int rc;
d230: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 70 61  .  if( sqlite3pa
d240: 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42  ger_pagecount(pB
d250: 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29 20 72  t->pPager)>0 ) r
d260: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d270: 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
d280: 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
d290: 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
d2a0: 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
d2b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
d2c0: 65 72 5f 77 72 69 74 65 28 64 61 74 61 29 3b 0a  er_write(data);.
d2d0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
d2e0: 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
d2f0: 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
d300: 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
d310: 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
d320: 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
d330: 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
d340: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
d350: 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53  [16], pBt->pageS
d360: 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  ize);.  data[18]
d370: 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
d380: 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d   = 1;.  data[20]
d390: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
d3a0: 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
d3b0: 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  ze;.  data[21] =
d3c0: 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
d3d0: 61 63 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  ac;.  data[22] =
d3e0: 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72   pBt->minEmbedFr
d3f0: 61 63 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  ac;.  data[23] =
d400: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
d410: 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  c;.  memset(&dat
d420: 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
d430: 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
d440: 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
d450: 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
d460: 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61  ATA );.  pBt->pa
d470: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
d480: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d490: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
d4a0: 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
d4b0: 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 70 75 74  acuum ){.    put
d4c0: 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
d4d0: 20 34 2a 34 5d 2c 20 31 29 3b 0a 20 20 7d 0a 23   4*4], 1);.  }.#
d4e0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
d4f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
d500: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  ** Attempt to st
d510: 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
d520: 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74  ction. A write-t
d530: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
d540: 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20   started if the 
d550: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
d560: 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65  is nonzero, othe
d570: 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a  rwise a read-.**
d580: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
d590: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
d5a0: 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f  ument is 2 or mo
d5b0: 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  re and exclusive
d5c0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
d5d0: 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e  is started, mean
d5e0: 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ing that no othe
d5f0: 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c  r process is all
d600: 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73  owed.** to acces
d610: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  s the database. 
d620: 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74   A preexisting t
d630: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e  ransaction may n
d640: 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65  ot be.** upgrade
d650: 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  d to exclusive b
d660: 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  y calling this r
d670: 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20  outine a second 
d680: 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78  time - the.** ex
d690: 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f  clusivity flag o
d6a0: 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20  nly works for a 
d6b0: 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
d6c0: 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  .**.** A write-t
d6d0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
d6e0: 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
d6f0: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
d700: 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
d710: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e  the database.  N
d720: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
d730: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a  wing routines .*
d740: 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65  * will work unle
d750: 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
d760: 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73   is started firs
d770: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  t:.**.**      sq
d780: 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
d790: 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
d7a0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
d7b0: 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20  teIndex().**    
d7c0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
d7d0: 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  earTable().**   
d7e0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
d7f0: 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ropTable().**   
d800: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
d810: 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20  nsert().**      
d820: 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
d830: 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  te().**      sql
d840: 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
d850: 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61  eta().**.** If a
d860: 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70  n initial attemp
d870: 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65  t to acquire the
d880: 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61   lock fails beca
d890: 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74  use of lock cont
d8a0: 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68  ention.** and th
d8b0: 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70  e database was p
d8c0: 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b  reviously unlock
d8d0: 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
d8e0: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
d8f0: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
d900: 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65  one.  But if the
d910: 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  re was previousl
d920: 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64  y a read-lock, d
d930: 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20  o not.** invoke 
d940: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
d950: 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53   - just return S
d960: 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c  QLITE_BUSY.  SQL
d970: 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20  ITE_BUSY is .** 
d980: 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68  returned when th
d990: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
d9a0: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72   read-lock in or
d9b0: 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64  der to avoid a d
d9c0: 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  eadlock..**.** S
d9d0: 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65  uppose there are
d9e0: 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41   two processes A
d9f0: 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61   and B.  A has a
da00: 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42   read lock and B
da10: 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76   has.** a reserv
da20: 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65  ed lock.  B trie
da30: 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
da40: 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73  exclusive but is
da50: 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65   blocked because
da60: 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20  .** of A's read 
da70: 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74  lock.  A tries t
da80: 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73  o promote to res
da90: 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f  erved but is blo
daa0: 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e  cked by B..** On
dab0: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
dac0: 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73  f the two proces
dad0: 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61  ses must give wa
dae0: 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62  y or there can b
daf0: 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73  e.** no progress
db00: 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20  .  By returning 
db10: 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20  SQLITE_BUSY and 
db20: 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  not invoking the
db30: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a   busy callback.*
db40: 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79  * when A already
db50: 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
db60: 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41  , we encourage A
db70: 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20   to give up and 
db80: 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64  let B.** proceed
db90: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
dba0: 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
dbb0: 42 74 72 65 65 20 2a 70 42 74 2c 20 69 6e 74 20  Btree *pBt, int 
dbc0: 77 72 66 6c 61 67 29 7b 0a 20 20 69 6e 74 20 72  wrflag){.  int r
dbd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
dbe0: 20 69 6e 74 20 62 75 73 79 20 3d 20 30 3b 0a 20   int busy = 0;. 
dbf0: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 48   BusyHandler *pH
dc00: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
dc10: 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
dc20: 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
dc30: 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
dc40: 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
dc50: 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
dc60: 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
dc70: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
dc80: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
dc90: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
dca0: 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   */.  if( pBt->i
dcb0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
dcc0: 49 54 45 20 7c 7c 20 28 70 42 74 2d 3e 69 6e 54  ITE || (pBt->inT
dcd0: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
dce0: 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
dcf0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
dd00: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
dd10: 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  Write transactio
dd20: 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69  ns are not possi
dd30: 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e  ble on a read-on
dd40: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
dd50: 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
dd60: 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  ly && wrflag ){.
dd70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
dd80: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
dd90: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20  .  do {.    if( 
dda0: 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
ddb0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63  {.      rc = loc
ddc0: 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20  kBtree(pBt);.   
ddd0: 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
dde0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
ddf0: 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72  rflag ){.      r
de00: 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
de10: 5f 62 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  _begin(pBt->pPag
de20: 65 31 2d 3e 61 44 61 74 61 2c 20 77 72 66 6c 61  e1->aData, wrfla
de30: 67 3e 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  g>1);.      if( 
de40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
de50: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65  .        rc = ne
de60: 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
de70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
de80: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
de90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
dea0: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28  pBt->inTrans = (
deb0: 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
dec0: 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
ded0: 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
dee0: 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d   ) pBt->inStmt =
def0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
df00: 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
df10: 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
df20: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
df30: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
df40: 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 3d 3d  & pBt->inTrans==
df50: 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
df60: 20 20 20 20 28 70 48 20 3d 20 70 42 74 2d 3e 70      (pH = pBt->p
df70: 42 75 73 79 48 61 6e 64 6c 65 72 29 21 3d 30 20  BusyHandler)!=0 
df80: 26 26 20 0a 20 20 20 20 20 20 70 48 2d 3e 78 46  && .      pH->xF
df90: 75 6e 63 20 26 26 20 70 48 2d 3e 78 46 75 6e 63  unc && pH->xFunc
dfa0: 28 70 48 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b  (pH->pArg, busy+
dfb0: 2b 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  +).  );.  return
dfc0: 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
dfd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
dfe0: 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
dff0: 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
e000: 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
e010: 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
e020: 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
e030: 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
e040: 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
e050: 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
e060: 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
e070: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
e080: 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
e090: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
e0a0: 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
e0b0: 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
e0c0: 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
e0d0: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
e100: 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
e110: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
e140: 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
e150: 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
e160: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e180: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
e190: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20  */.  Btree *pBt 
e1a0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
e1b0: 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d  int isInitOrig =
e1c0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
e1d0: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
e1e0: 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 69 6e  age->pgno;..  in
e1f0: 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29  itPage(pPage, 0)
e200: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
e210: 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
e220: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
e230: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
e240: 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
e250: 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63  age, i);..    rc
e260: 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
e270: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
e280: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
e290: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e2a0: 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
e2b0: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
e2c0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
e2d0: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
e2e0: 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
e2f0: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
e300: 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ll);.      rc = 
e310: 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
e320: 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
e330: 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
e340: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
e350: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65  ITE_OK ) goto se
e360: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
e370: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
e380: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
e390: 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
e3a0: 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
e3b0: 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
e3c0: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
e3d0: 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d  et+8]);.    rc =
e3e0: 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
e3f0: 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
e400: 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
e410: 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
e420: 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
e430: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
e440: 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
e450: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
e460: 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
e470: 67 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61  ge, which is gua
e480: 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  renteed to be a 
e490: 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20  btree page, not 
e4a0: 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  an overflow.** p
e4b0: 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  age, is a pointe
e4c0: 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
e4d0: 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
e4e0: 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  nter so that it 
e4f0: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f  points to.** iTo
e500: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
e510: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
e520: 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
e530: 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  to be modified, 
e540: 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a  as .** follows:.
e550: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
e560: 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
e570: 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
e580: 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
e590: 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5b0: 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
e5c0: 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
e5d0: 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
e5e0: 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
e5f0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
e600: 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
e610: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
e620: 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
e630: 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
e640: 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
e650: 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
e660: 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
e670: 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
e680: 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
e690: 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
e6a0: 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
e6c0: 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
e6d0: 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
e6e0: 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
e6f0: 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
e700: 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
e710: 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
e720: 20 65 54 79 70 65 29 7b 0a 20 20 69 66 28 20 65   eType){.  if( e
e730: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
e740: 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
e750: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
e760: 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
e770: 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
e780: 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
e790: 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
e7a0: 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
e7b0: 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
e7c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e7d0: 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
e7e0: 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
e7f0: 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
e800: 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
e810: 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20   int isInitOrig 
e820: 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
e830: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
e840: 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  int nCell;..    
e850: 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  initPage(pPage, 
e860: 30 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  0);.    nCell = 
e870: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
e880: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
e890: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
e8a0: 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
e8b0: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
e8c0: 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
e8d0: 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
e8e0: 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
e8f0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
e900: 20 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74       parseCellPt
e910: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
e920: 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
e930: 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
e940: 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
e950: 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
e960: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
e970: 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
e980: 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
e990: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
e9a0: 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
e9b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
e9c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
e9d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e9e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e9f0: 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
ea00: 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
ea10: 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
ea20: 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
ea30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ea40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ea50: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
ea60: 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
ea70: 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
ea80: 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
ea90: 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
eaa0: 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
eab0: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
eac0: 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
ead0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
eae0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
eaf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
eb00: 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
eb10: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
eb20: 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
eb30: 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d     }..    pPage-
eb40: 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
eb50: 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Orig;.  }.  retu
eb60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
eb70: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
eb80: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
eb90: 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
eba0: 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
ebb0: 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
ebc0: 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
ebd0: 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
ebe0: 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73  ains valid..*/.s
ebf0: 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
ec00: 74 65 50 61 67 65 28 0a 20 20 42 74 72 65 65 20  tePage(.  Btree 
ec10: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
ec20: 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
ec30: 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
ec40: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
ec50: 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
ec60: 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec80: 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
ec90: 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
eca0: 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
ecb0: 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
ecc0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
ecd0: 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
ece0: 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
ecf0: 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
ed00: 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e           /* T
ed10: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
ed20: 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
ed30: 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
ed40: 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
ed50: 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
ed60: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
ed70: 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
ed80: 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
ed90: 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
eda0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
edb0: 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
edc0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
edd0: 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
ede0: 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
edf0: 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
ee00: 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
ee10: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
ee20: 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
ee30: 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
ee40: 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
ee50: 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 27  iDbPage from it'
ee60: 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
ee70: 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
ee80: 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
ee90: 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
eea0: 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
eeb0: 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
eec0: 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
eed0: 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
eee0: 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
eef0: 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
ef00: 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
ef10: 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70  lite3pager_movep
ef20: 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
ef30: 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 46 72 65  age->aData, iFre
ef40: 65 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  ePage);.  if( rc
ef50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ef60: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
ef70: 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
ef80: 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
ef90: 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
efa0: 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
efb0: 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
efc0: 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
efd0: 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
efe0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
eff0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
f000: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
f010: 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
f020: 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
f030: 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
f040: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
f050: 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
f060: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
f070: 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
f080: 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
f090: 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
f0a0: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
f0b0: 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
f0c0: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
f0d0: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
f0e0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
f0f0: 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
f100: 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
f110: 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
f120: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
f130: 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
f140: 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
f150: 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
f160: 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
f170: 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
f180: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f190: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f1a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
f1b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
f1c0: 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
f1d0: 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
f1e0: 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
f1f0: 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
f200: 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
f210: 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
f220: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
f230: 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b  OW2, iFreePage);
f240: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
f250: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f260: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f270: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f280: 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
f290: 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
f2a0: 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
f2b0: 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
f2c0: 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
f2d0: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
f2e0: 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
f2f0: 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
f300: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
f310: 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
f320: 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
f330: 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
f340: 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65  E ){.    rc = ge
f350: 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
f360: 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 29 3b  age, &pPtrPage);
f370: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f380: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f390: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
f3a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f3b0: 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 74  3pager_write(pPt
f3c0: 72 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  rPage->aData);. 
f3d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f3e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
f3f0: 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
f400: 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
f410: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
f420: 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
f430: 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
f440: 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
f450: 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
f460: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
f470: 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
f480: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f490: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
f4a0: 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
f4b0: 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
f4c0: 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rPage);.    }.  
f4d0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
f4e0: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
f4f0: 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
f500: 64 20 62 79 20 61 75 74 6f 56 61 63 75 75 6d 43  d by autoVacuumC
f510: 6f 6d 6d 69 74 28 29 2e 20 2a 2f 0a 73 74 61 74  ommit(). */.stat
f520: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 50  ic int allocateP
f530: 61 67 65 28 42 74 72 65 65 20 2a 2c 20 4d 65 6d  age(Btree *, Mem
f540: 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
f550: 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
f560: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f570: 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
f580: 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
f590: 63 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  commit when a tr
f5a0: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
f5b0: 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20  commited for an 
f5c0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
f5d0: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
f5e0: 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
f5f0: 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 42 74 2c  mmit(Btree *pBt,
f600: 20 50 67 6e 6f 20 2a 6e 54 72 75 6e 63 29 7b 0a   Pgno *nTrunc){.
f610: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
f620: 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
f630: 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
f640: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f650: 70 61 67 65 73 20 72 65 6d 61 69 6e 69 6e 67 20  pages remaining 
f660: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
f670: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 74 72 4d  . */.  int nPtrM
f680: 61 70 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ap;      /* Numb
f690: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61  er of pointer-ma
f6a0: 70 20 70 61 67 65 73 20 64 65 61 6c 6c 6f 63 61  p pages dealloca
f6b0: 74 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72  ted */.  Pgno or
f6c0: 69 67 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65  igSize;  /* Page
f6d0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
f6e0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
f6f0: 20 66 69 6e 53 69 7a 65 3b 20 20 20 2f 2a 20 50   finSize;   /* P
f700: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
f710: 62 61 73 65 20 66 69 6c 65 20 61 66 74 65 72 20  base file after 
f720: 74 72 75 6e 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  truncation */.  
f730: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
f740: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
f750: 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 3b 0a   */.  u8 eType;.
f760: 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74    int pgsz = pBt
f770: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 2f 2a 20  ->pageSize;  /* 
f780: 50 61 67 65 20 73 69 7a 65 20 66 6f 72 20 74 68  Page size for th
f790: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
f7a0: 20 50 67 6e 6f 20 69 44 62 50 61 67 65 3b 20 20   Pgno iDbPage;  
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f7c0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
f7d0: 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 4d 65   to move */.  Me
f7e0: 6d 50 61 67 65 20 2a 70 44 62 4d 65 6d 50 61 67  mPage *pDbMemPag
f7f0: 65 20 3d 20 30 3b 20 20 20 2f 2a 20 22 22 20 2a  e = 0;   /* "" *
f800: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
f810: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
f820: 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
f830: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
f840: 65 72 20 74 6f 20 69 44 62 50 61 67 65 20 2a 2f  er to iDbPage */
f850: 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
f860: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
f870: 20 54 68 65 20 66 72 65 65 2d 6c 69 73 74 20 70   The free-list p
f880: 61 67 65 20 74 6f 20 6d 6f 76 65 20 69 44 62 50  age to move iDbP
f890: 61 67 65 20 74 6f 20 2a 2f 0a 20 20 4d 65 6d 50  age to */.  MemP
f8a0: 61 67 65 20 2a 70 46 72 65 65 4d 65 6d 50 61 67  age *pFreeMemPag
f8b0: 65 20 3d 20 30 3b 20 2f 2a 20 22 22 20 2a 2f 0a  e = 0; /* "" */.
f8c0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
f8d0: 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 2a 73 71    int nRef = *sq
f8e0: 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73  lite3pager_stats
f8f0: 28 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66  (pPager);.#endif
f900: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
f910: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
f920: 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
f930: 47 45 28 70 67 73 7a 2c 20 73 71 6c 69 74 65 33  GE(pgsz, sqlite3
f940: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
f950: 70 50 61 67 65 72 29 29 20 29 7b 0a 20 20 20 20  pPager)) ){.    
f960: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f970: 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  RRUPT;.  }..  /*
f980: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
f990: 6d 61 6e 79 20 66 72 65 65 2d 70 61 67 65 73 20  many free-pages 
f9a0: 61 72 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  are in the datab
f9b0: 61 73 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  ase. If there ar
f9c0: 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 20 70  e no.  ** free p
f9d0: 61 67 65 73 2c 20 74 68 65 6e 20 61 75 74 6f 2d  ages, then auto-
f9e0: 76 61 63 75 75 6d 20 69 73 20 61 20 6e 6f 2d 6f  vacuum is a no-o
f9f0: 70 2e 0a 20 20 2a 2f 0a 20 20 6e 46 72 65 65 4c  p..  */.  nFreeL
fa00: 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
fa10: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
fa20: 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e  ta[36]);.  if( n
fa30: 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
fa40: 20 20 20 2a 6e 54 72 75 6e 63 20 3d 20 30 3b 0a     *nTrunc = 0;.
fa50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fa60: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 6f 72 69  E_OK;.  }..  ori
fa70: 67 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 70  gSize = sqlite3p
fa80: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
fa90: 50 61 67 65 72 29 3b 0a 20 20 6e 50 74 72 4d 61  Pager);.  nPtrMa
faa0: 70 20 3d 20 28 6e 46 72 65 65 4c 69 73 74 2d 6f  p = (nFreeList-o
fab0: 72 69 67 53 69 7a 65 2b 50 54 52 4d 41 50 5f 50  rigSize+PTRMAP_P
fac0: 41 47 45 4e 4f 28 70 67 73 7a 2c 20 6f 72 69 67  AGENO(pgsz, orig
fad0: 53 69 7a 65 29 2b 70 67 73 7a 2f 35 29 2f 28 70  Size)+pgsz/5)/(p
fae0: 67 73 7a 2f 35 29 3b 0a 20 20 66 69 6e 53 69 7a  gsz/5);.  finSiz
faf0: 65 20 3d 20 6f 72 69 67 53 69 7a 65 20 2d 20 6e  e = origSize - n
fb00: 46 72 65 65 4c 69 73 74 20 2d 20 6e 50 74 72 4d  FreeList - nPtrM
fb10: 61 70 3b 0a 20 20 69 66 28 20 6f 72 69 67 53 69  ap;.  if( origSi
fb20: 7a 65 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ze>PENDING_BYTE_
fb30: 50 41 47 45 28 70 42 74 29 20 26 26 20 66 69 6e  PAGE(pBt) && fin
fb40: 53 69 7a 65 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  Size<=PENDING_BY
fb50: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
fb60: 20 20 20 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a 20      finSize--;. 
fb70: 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
fb80: 50 41 47 45 28 70 42 74 2d 3e 75 73 61 62 6c 65  PAGE(pBt->usable
fb90: 53 69 7a 65 2c 20 66 69 6e 53 69 7a 65 29 20 29  Size, finSize) )
fba0: 7b 0a 20 20 20 20 20 20 66 69 6e 53 69 7a 65 2d  {.      finSize-
fbb0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54  -;.    }.  }.  T
fbc0: 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
fbd0: 4d 3a 20 42 65 67 69 6e 20 28 64 62 20 73 69 7a  M: Begin (db siz
fbe0: 65 20 25 64 2d 3e 25 64 29 5c 6e 22 2c 20 6f 72  e %d->%d)\n", or
fbf0: 69 67 53 69 7a 65 2c 20 66 69 6e 53 69 7a 65 29  igSize, finSize)
fc00: 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  );..  /* Variabl
fc10: 65 20 27 66 69 6e 53 69 7a 65 27 20 77 69 6c 6c  e 'finSize' will
fc20: 20 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20   be the size of 
fc30: 74 68 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  the file in page
fc40: 73 20 61 66 74 65 72 0a 20 20 2a 2a 20 74 68 65  s after.  ** the
fc50: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 68 61 73   auto-vacuum has
fc60: 20 63 6f 6d 70 6c 65 74 65 64 20 28 74 68 65 20   completed (the 
fc70: 63 75 72 72 65 6e 74 20 66 69 6c 65 20 73 69 7a  current file siz
fc80: 65 20 6d 69 6e 75 73 20 74 68 65 20 6e 75 6d 62  e minus the numb
fc90: 65 72 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 73  er.  ** of pages
fca0: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
fcb0: 74 29 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  t). Loop through
fcc0: 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
fcd0: 6c 69 65 20 62 65 79 6f 6e 64 0a 20 20 2a 2a 20  lie beyond.  ** 
fce0: 74 68 69 73 20 6d 61 72 6b 2c 20 61 6e 64 20 69  this mark, and i
fcf0: 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61  f they are not a
fd00: 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20 66 72  lready on the fr
fd10: 65 65 20 6c 69 73 74 2c 20 6d 6f 76 65 20 74 68  ee list, move th
fd20: 65 6d 0a 20 20 2a 2a 20 74 6f 20 61 20 66 72 65  em.  ** to a fre
fd30: 65 20 70 61 67 65 20 65 61 72 6c 69 65 72 20 69  e page earlier i
fd40: 6e 20 74 68 65 20 66 69 6c 65 20 28 73 6f 6d 65  n the file (some
fd50: 77 68 65 72 65 20 62 65 66 6f 72 65 20 66 69 6e  where before fin
fd60: 53 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 66 6f  Size)..  */.  fo
fd70: 72 28 20 69 44 62 50 61 67 65 3d 66 69 6e 53 69  r( iDbPage=finSi
fd80: 7a 65 2b 31 3b 20 69 44 62 50 61 67 65 3c 3d 6f  ze+1; iDbPage<=o
fd90: 72 69 67 53 69 7a 65 3b 20 69 44 62 50 61 67 65  rigSize; iDbPage
fda0: 2b 2b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ++ ){.    /* If 
fdb0: 69 44 62 50 61 67 65 20 69 73 20 61 20 70 6f 69  iDbPage is a poi
fdc0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 2c 20 6f  nter map page, o
fdd0: 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79  r the pending-by
fde0: 74 65 20 70 61 67 65 2c 20 73 6b 69 70 20 69 74  te page, skip it
fdf0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 50 54 52  . */.    if( PTR
fe00: 4d 41 50 5f 49 53 50 41 47 45 28 70 67 73 7a 2c  MAP_ISPAGE(pgsz,
fe10: 20 69 44 62 50 61 67 65 29 20 7c 7c 20 69 44 62   iDbPage) || iDb
fe20: 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
fe30: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
fe40: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
fe50: 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
fe60: 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
fe70: 44 62 50 61 67 65 2c 20 26 65 54 79 70 65 2c 20  DbPage, &eType, 
fe80: 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
fe90: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fea0: 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76 61 63  K ) goto autovac
feb0: 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 69 66 28  uum_out;.    if(
fec0: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
fed0: 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
fee0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
fef0: 52 55 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  RUPT;.      goto
ff00: 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b   autovacuum_out;
ff10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
ff20: 66 20 69 44 62 50 61 67 65 20 69 73 20 66 72 65  f iDbPage is fre
ff30: 65 2c 20 64 6f 20 6e 6f 74 20 73 77 61 70 20 69  e, do not swap i
ff40: 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  t.  */.    if( e
ff50: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
ff60: 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 63  EPAGE ){.      c
ff70: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
ff80: 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
ff90: 70 42 74 2c 20 69 44 62 50 61 67 65 2c 20 26 70  pBt, iDbPage, &p
ffa0: 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20 20 20 20  DbMemPage);.    
ffb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ffc0: 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76 61 63  K ) goto autovac
ffd0: 75 75 6d 5f 6f 75 74 3b 0a 0a 20 20 20 20 2f 2a  uum_out;..    /*
ffe0: 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   Find the next p
fff0: 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
10000 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74  list that is not
10010 20 61 6c 72 65 61 64 79 20 61 74 20 74 68 65 20   already at the 
10020 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74  end .    ** of t
10030 68 65 20 66 69 6c 65 2e 20 41 20 70 61 67 65 20  he file. A page 
10040 63 61 6e 20 62 65 20 70 75 6c 6c 65 64 20 6f 66  can be pulled of
10050 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  f the free list 
10060 75 73 69 6e 67 20 74 68 65 20 0a 20 20 20 20 2a  using the .    *
10070 2a 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 29  * allocatePage()
10080 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f   routine..    */
10090 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
100a0 66 28 20 70 46 72 65 65 4d 65 6d 50 61 67 65 20  f( pFreeMemPage 
100b0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
100c0 73 65 50 61 67 65 28 70 46 72 65 65 4d 65 6d 50  sePage(pFreeMemP
100d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46  age);.        pF
100e0 72 65 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b 0a  reeMemPage = 0;.
100f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
10100 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28   = allocatePage(
10110 70 42 74 2c 20 26 70 46 72 65 65 4d 65 6d 50 61  pBt, &pFreeMemPa
10120 67 65 2c 20 26 69 46 72 65 65 50 61 67 65 2c 20  ge, &iFreePage, 
10130 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
10140 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10150 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
10160 65 50 61 67 65 28 70 44 62 4d 65 6d 50 61 67 65  ePage(pDbMemPage
10170 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
10180 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a  autovacuum_out;.
10190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
101a0 73 65 72 74 28 20 69 46 72 65 65 50 61 67 65 3c  sert( iFreePage<
101b0 3d 6f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20  =origSize );.   
101c0 20 7d 77 68 69 6c 65 28 20 69 46 72 65 65 50 61   }while( iFreePa
101d0 67 65 3e 66 69 6e 53 69 7a 65 20 29 3b 0a 20 20  ge>finSize );.  
101e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
101f0 72 65 65 4d 65 6d 50 61 67 65 29 3b 0a 20 20 20  reeMemPage);.   
10200 20 70 46 72 65 65 4d 65 6d 50 61 67 65 20 3d 20   pFreeMemPage = 
10210 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 72 65 6c  0;..    rc = rel
10220 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
10230 44 62 4d 65 6d 50 61 67 65 2c 20 65 54 79 70 65  DbMemPage, eType
10240 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
10250 65 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65  ePage);.    rele
10260 61 73 65 50 61 67 65 28 70 44 62 4d 65 6d 50 61  asePage(pDbMemPa
10270 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
10280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
10290 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74  o autovacuum_out
102a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
102b0 65 6e 74 69 72 65 20 66 72 65 65 2d 6c 69 73 74  entire free-list
102c0 20 68 61 73 20 62 65 65 6e 20 73 77 61 70 70 65   has been swappe
102d0 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  d to the end of 
102e0 74 68 65 20 66 69 6c 65 2e 20 53 6f 0a 20 20 2a  the file. So.  *
102f0 2a 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64  * truncate the d
10300 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
10310 66 69 6e 53 69 7a 65 20 70 61 67 65 73 20 61 6e  finSize pages an
10320 64 20 63 6f 6e 73 69 64 65 72 20 74 68 65 0a 20  d consider the. 
10330 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 65 6d   ** free-list em
10340 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  pty..  */.  rc =
10350 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
10360 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
10370 3e 61 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72  >aData);.  if( r
10380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
10390 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f  oto autovacuum_o
103a0 75 74 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ut;.  put4byte(&
103b0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
103c0 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 70 75  ta[32], 0);.  pu
103d0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
103e0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
103f0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
10400 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
10410 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20  utovacuum_out;. 
10420 20 2a 6e 54 72 75 6e 63 20 3d 20 66 69 6e 53 69   *nTrunc = finSi
10430 7a 65 3b 0a 0a 61 75 74 6f 76 61 63 75 75 6d 5f  ze;..autovacuum_
10440 6f 75 74 3a 0a 20 20 61 73 73 65 72 74 28 20 6e  out:.  assert( n
10450 52 65 66 3d 3d 2a 73 71 6c 69 74 65 33 70 61 67  Ref==*sqlite3pag
10460 65 72 5f 73 74 61 74 73 28 70 50 61 67 65 72 29  er_stats(pPager)
10470 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
10480 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
10490 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
104a0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
104b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
104c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
104d0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
104e0 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
104f0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
10500 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
10510 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
10520 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
10530 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
10540 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
10550 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
10560 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
10570 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
10580 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
10590 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
105a0 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
105b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
105c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54   pBt->inTrans==T
105d0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
105e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
105f0 67 65 72 5f 63 6f 6d 6d 69 74 28 70 42 74 2d 3e  ger_commit(pBt->
10600 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 70  pPager);.  }.  p
10610 42 74 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52  Bt->inTrans = TR
10620 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d  ANS_NONE;.  pBt-
10630 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75  >inStmt = 0;.  u
10640 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
10650 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72  ed(pBt);.  retur
10660 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
10670 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
10680 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
10690 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  of write-cursors
106a0 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61   open on this ha
106b0 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f  ndle. This is fo
106c0 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
106d0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
106e0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
106f0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
10700 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
10710 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
10720 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75  int countWriteCu
10730 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
10740 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
10750 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
10760 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
10770 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
10780 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
10790 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  t){.    if( pCur
107a0 2d 3e 77 72 46 6c 61 67 20 29 20 72 2b 2b 3b 0a  ->wrFlag ) r++;.
107b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
107c0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
107d0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
107e0 2a 2a 20 50 72 69 6e 74 20 64 65 62 75 67 67 69  ** Print debuggi
107f0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
10800 62 6f 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73  bout all cursors
10810 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74   to standard out
10820 70 75 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  put..*/.void sql
10830 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 4c  ite3BtreeCursorL
10840 69 73 74 28 42 74 72 65 65 20 2a 70 42 74 29 7b  ist(Btree *pBt){
10850 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
10860 72 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  r;.  for(pCur=pB
10870 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
10880 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
10890 78 74 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  xt){.    MemPage
108a0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
108b0 70 50 61 67 65 3b 0a 20 20 20 20 63 68 61 72 20  pPage;.    char 
108c0 2a 7a 4d 6f 64 65 20 3d 20 70 43 75 72 2d 3e 77  *zMode = pCur->w
108d0 72 46 6c 61 67 20 3f 20 22 72 77 22 20 3a 20 22  rFlag ? "rw" : "
108e0 72 6f 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ro";.    sqlite3
108f0 44 65 62 75 67 50 72 69 6e 74 66 28 22 43 55 52  DebugPrintf("CUR
10900 53 4f 52 20 25 70 20 72 6f 6f 74 65 64 20 61 74  SOR %p rooted at
10910 20 25 34 64 28 25 73 29 20 63 75 72 72 65 6e 74   %4d(%s) current
10920 6c 79 20 61 74 20 25 64 2e 25 64 25 73 5c 6e 22  ly at %d.%d%s\n"
10930 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2c 20 70  ,.       pCur, p
10940 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 7a  Cur->pgnoRoot, z
10950 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 70 50 61  Mode,.       pPa
10960 67 65 20 3f 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ge ? pPage->pgno
10970 20 3a 20 30 2c 20 70 43 75 72 2d 3e 69 64 78 2c   : 0, pCur->idx,
10980 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 73  .       pCur->is
10990 56 61 6c 69 64 20 3f 20 22 22 20 3a 20 22 20 65  Valid ? "" : " e
109a0 6f 66 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  of".    );.  }.}
109b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
109c0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
109d0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
109e0 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72  ess.  All cursor
109f0 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76  s will be.** inv
10a00 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f  alided by this o
10a10 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
10a20 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
10a30 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77  cursor.** that w
10a40 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
10a50 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
10a60 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
10a70 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
10a80 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
10a90 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
10aa0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
10ab0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10ac0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
10ad0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
10ae0 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
10af0 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
10b00 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
10b10 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
10b20 61 63 6b 28 42 74 72 65 65 20 2a 70 42 74 29 7b  ack(Btree *pBt){
10b30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10b40 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
10b50 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 66 28 20   *pPage1;.  if( 
10b60 70 42 74 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  pBt->inTrans==TR
10b70 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
10b80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
10b90 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  er_rollback(pBt-
10ba0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 2f 2a  >pPager);.    /*
10bb0 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
10bc0 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
10bd0 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
10be0 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
10bf0 20 20 2a 2a 20 63 61 6c 6c 20 67 65 74 50 61 67    ** call getPag
10c00 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
10c10 61 69 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ain to make sure
10c20 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
10c30 73 0a 20 20 20 20 2a 2a 20 73 65 74 20 63 6f 72  s.    ** set cor
10c40 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
10c50 66 28 20 67 65 74 50 61 67 65 28 70 42 74 2c 20  f( getPage(pBt, 
10c60 31 2c 20 26 70 50 61 67 65 31 29 3d 3d 53 51 4c  1, &pPage1)==SQL
10c70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10c80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
10c90 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
10ca0 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74  ssert( countWrit
10cb0 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30  eCursors(pBt)==0
10cc0 20 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69   );.  }.  pBt->i
10cd0 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
10ce0 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74  ONE;.  pBt->inSt
10cf0 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b  mt = 0;.  unlock
10d00 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
10d10 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t);.  return rc;
10d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
10d30 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
10d40 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68 65  ransaction.  The
10d50 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
10d60 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  can.** can be ro
10d70 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70 65  lled back indepe
10d80 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
10d90 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
10da0 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74 61  .** You must sta
10db0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
10dc0 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
10dd0 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
10de0 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72 61  n..** The subtra
10df0 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
10e00 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
10e10 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
10e20 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69  saction.** commi
10e30 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
10e40 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65  ..**.** Only one
10e50 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
10e60 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 61 74  may be active at
10e70 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73 20   a time.  It is 
10e80 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79 0a  an error to try.
10e90 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  ** to start a ne
10ea0 77 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  w subtransaction
10eb0 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62 74   if another subt
10ec0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
10ed0 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a  ready active..**
10ee0 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
10ef0 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
10f00 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
10f10 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
10f20 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
10f30 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
10f40 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
10f50 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
10f60 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
10f70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
10f80 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
10f90 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
10fa0 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
10fb0 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
10fc0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
10fd0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
10fe0 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
10ff0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
11000 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11010 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
11020 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
11030 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 69 6e  ;.  if( (pBt->in
11040 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
11050 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74  TE) || pBt->inSt
11060 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
11070 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
11080 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
11090 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
110a0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 42 74 2d  .  }.  rc = pBt-
110b0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
110c0 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 70  TE_OK : sqlite3p
110d0 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28  ager_stmt_begin(
110e0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
110f0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  pBt->inStmt = 1;
11100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11110 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
11120 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74  he statment subt
11130 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
11140 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
11150 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74  .  If no.** subt
11160 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
11170 74 69 76 65 2c 20 74 68 69 73 20 69 73 20 61 20  tive, this is a 
11180 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
11190 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
111a0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 42 74 29  Stmt(Btree *pBt)
111b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
111c0 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26  ( pBt->inStmt &&
111d0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
111e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
111f0 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
11200 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  mmit(pBt->pPager
11210 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11230 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d    }.  pBt->inStm
11240 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
11250 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
11260 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65  lback the active
11270 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
11280 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e  ansaction.  If n
11290 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  o subtransaction
112a0 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20 74 68  .** is active th
112b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
112c0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  no-op..**.** All
112d0 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
112e0 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20   invalidated by 
112f0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
11300 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20   Any attempt.** 
11310 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 20  to use a cursor 
11320 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
11330 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
11340 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
11350 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  .** will result 
11360 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  in an error..*/.
11370 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11380 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72  RollbackStmt(Btr
11390 65 65 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ee *pBt){.  int 
113a0 72 63 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  rc;.  if( pBt->i
113b0 6e 53 74 6d 74 3d 3d 30 20 7c 7c 20 70 42 74 2d  nStmt==0 || pBt-
113c0 3e 72 65 61 64 4f 6e 6c 79 20 29 20 72 65 74 75  >readOnly ) retu
113d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
113e0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
113f0 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_stmt_rollback(
11400 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
11410 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
11420 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
11430 30 20 29 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74  0 );.  pBt->inSt
11440 6d 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  mt = 0;.  return
11450 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
11460 66 61 75 6c 74 20 6b 65 79 20 63 6f 6d 70 61 72  fault key compar
11470 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ison function to
11480 20 62 65 20 75 73 65 64 20 69 66 20 6e 6f 20 63   be used if no c
11490 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
114a0 6f 6e 0a 2a 2a 20 69 73 20 73 70 65 63 69 66 69  on.** is specifi
114b0 65 64 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  ed on the sqlite
114c0 33 42 74 72 65 65 43 75 72 73 6f 72 28 29 20 63  3BtreeCursor() c
114d0 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  all..*/.static i
114e0 6e 74 20 64 66 6c 74 43 6f 6d 70 61 72 65 28 0a  nt dfltCompare(.
114f0 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11510 55 73 65 72 20 64 61 74 61 20 69 73 20 6e 6f 74  User data is not
11520 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e   used */.  int n
11530 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
11540 31 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6b  1,    /* First k
11550 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ey to compare */
11560 0a 20 20 69 6e 74 20 6e 32 2c 20 63 6f 6e 73 74  .  int n2, const
11570 20 76 6f 69 64 20 2a 70 32 20 20 20 20 20 2f 2a   void *p2     /*
11580 20 53 65 63 6f 6e 64 20 6b 65 79 20 74 6f 20 63   Second key to c
11590 6f 6d 70 61 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  ompare */.){.  i
115a0 6e 74 20 63 3b 0a 20 20 63 20 3d 20 6d 65 6d 63  nt c;.  c = memc
115b0 6d 70 28 70 31 2c 20 70 32 2c 20 6e 31 3c 6e 32  mp(p1, p2, n1<n2
115c0 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a 20 20 69   ? n1 : n2);.  i
115d0 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63  f( c==0 ){.    c
115e0 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a   = n1 - n2;.  }.
115f0 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f    return c;.}../
11600 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
11610 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
11620 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f   BTree whose roo
11630 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65  t is on the page
11640 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54 68 65  .** iTable.  The
11650 20 61 63 74 20 6f 66 20 61 63 71 75 69 72 69 6e   act of acquirin
11660 67 20 61 20 63 75 72 73 6f 72 20 67 65 74 73 20  g a cursor gets 
11670 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a  a read lock on .
11680 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
11690 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  file..**.** If w
116a0 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74  rFlag==0, then t
116b0 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e  he cursor can on
116c0 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  ly be used for r
116d0 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72  eading..** If wr
116e0 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68  Flag==1, then th
116f0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  e cursor can be 
11700 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
11710 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69   or for.** writi
11720 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64  ng if other cond
11730 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69  itions for writi
11740 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e  ng are also met.
11750 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74    These.** are t
11760 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  he conditions th
11770 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69  at must be met i
11780 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74  n order for writ
11790 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c  ing to.** be all
117a0 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20  owed:.**.** 1:  
117b0 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
117c0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
117d0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a   with wrFlag==1.
117e0 2a 2a 0a 2a 2a 20 32 3a 20 20 4e 6f 20 6f 74 68  **.** 2:  No oth
117f0 65 72 20 63 75 72 73 6f 72 73 20 6d 61 79 20 62  er cursors may b
11800 65 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  e open with wrFl
11810 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
11820 65 20 74 61 62 6c 65 0a 2a 2a 0a 2a 2a 20 33 3a  e table.**.** 3:
11830 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
11840 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
11850 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
11860 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
11870 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
11880 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
11890 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f  action..**.** Co
118a0 6e 64 69 74 69 6f 6e 20 32 20 77 61 72 72 61 6e  ndition 2 warran
118b0 74 73 20 66 75 72 74 68 65 72 20 64 69 73 63 75  ts further discu
118c0 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20 63  ssion.  If any c
118d0 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 0a  ursor is opened.
118e0 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 20 77 69  ** on a table wi
118f0 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  th wrFlag==0, th
11900 61 74 20 70 72 65 76 65 6e 74 73 20 61 6c 6c 20  at prevents all 
11910 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 66 72  other cursors fr
11920 6f 6d 0a 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f  om.** writing to
11930 20 74 68 61 74 20 74 61 62 6c 65 2e 20 20 54 68   that table.  Th
11940 69 73 20 69 73 20 61 20 6b 69 6e 64 20 6f 66 20  is is a kind of 
11950 22 72 65 61 64 2d 6c 6f 63 6b 22 2e 20 20 57 68  "read-lock".  Wh
11960 65 6e 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 69  en a cursor.** i
11970 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  s opened with wr
11980 46 6c 61 67 3d 3d 30 20 69 74 20 69 73 20 67 75  Flag==0 it is gu
11990 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
119a0 65 20 74 61 62 6c 65 20 77 69 6c 6c 20 6e 6f 74  e table will not
119b0 0a 2a 2a 20 63 68 61 6e 67 65 20 61 73 20 6c 6f  .** change as lo
119c0 6e 67 20 61 73 20 74 68 65 20 63 75 72 73 6f 72  ng as the cursor
119d0 20 69 73 20 6f 70 65 6e 2e 20 20 54 68 69 73 20   is open.  This 
119e0 61 6c 6c 6f 77 73 20 74 68 65 20 63 75 72 73 6f  allows the curso
119f0 72 20 74 6f 0a 2a 2a 20 64 6f 20 61 20 73 65 71  r to.** do a seq
11a00 75 65 6e 74 69 61 6c 20 73 63 61 6e 20 6f 66 20  uential scan of 
11a10 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 6f 75  the table withou
11a20 74 20 68 61 76 69 6e 67 20 74 6f 20 77 6f 72 72  t having to worr
11a30 79 20 61 62 6f 75 74 0a 2a 2a 20 65 6e 74 72 69  y about.** entri
11a40 65 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  es being inserte
11a50 64 20 6f 72 20 64 65 6c 65 74 65 64 20 64 75 72  d or deleted dur
11a60 69 6e 67 20 74 68 65 20 73 63 61 6e 2e 20 20 43  ing the scan.  C
11a70 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 0a 2a 2a  ursors should.**
11a80 20 62 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20   be opened with 
11a90 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 6c 79 20 69  wrFlag==0 only i
11aa0 66 20 74 68 69 73 20 72 65 61 64 2d 6c 6f 63 6b  f this read-lock
11ab0 20 70 72 6f 70 65 72 74 79 20 69 73 20 6e 65 65   property is nee
11ac0 64 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20  ded..** That is 
11ad0 74 6f 20 73 61 79 2c 20 63 75 72 73 6f 72 73 20  to say, cursors 
11ae0 73 68 6f 75 6c 64 20 62 65 20 6f 70 65 6e 65 64  should be opened
11af0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
11b00 6f 6e 6c 79 20 69 66 20 74 68 65 79 0a 2a 2a 20  only if they.** 
11b10 69 6e 74 65 6e 64 20 74 6f 20 75 73 65 20 74 68  intend to use th
11b20 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  e sqlite3BtreeNe
11b30 78 74 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  xt() system call
11b40 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 63 75 72  .  All other cur
11b50 73 6f 72 73 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  sors.** should b
11b60 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  e opened with wr
11b70 46 6c 61 67 3d 3d 31 20 65 76 65 6e 20 69 66 20  Flag==1 even if 
11b80 74 68 65 79 20 6e 65 76 65 72 20 72 65 61 6c 6c  they never reall
11b90 79 20 69 6e 74 65 6e 64 0a 2a 2a 20 74 6f 20 77  y intend.** to w
11ba0 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 4e 6f 20  rite..** .** No 
11bb0 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
11bc0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
11bd0 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
11be0 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
11bf0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
11c00 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
11c10 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
11c20 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
11c30 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
11c40 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
11c50 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
11c60 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
11c70 20 6c 6f 67 69 63 61 6c 6c 79 20 74 68 65 20 73   logically the s
11c80 61 6d 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ame for every cu
11c90 72 73 6f 72 0a 2a 2a 20 6f 6e 20 61 20 70 61 72  rsor.** on a par
11ca0 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20  ticular table.  
11cb0 43 68 61 6e 67 69 6e 67 20 74 68 65 20 63 6f 6d  Changing the com
11cc0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
11cd0 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
11ce0 69 6e 20 69 6e 63 6f 72 72 65 63 74 20 6f 70 65  in incorrect ope
11cf0 72 61 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65  rations.  If the
11d00 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
11d10 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 61 0a  tion is NULL, a.
11d20 2a 2a 20 64 65 66 61 75 6c 74 20 63 6f 6d 70 61  ** default compa
11d30 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  rison function i
11d40 73 20 75 73 65 64 2e 20 20 54 68 65 20 63 6f 6d  s used.  The com
11d50 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
11d60 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 69 67   is.** always ig
11d70 6e 6f 72 65 64 20 66 6f 72 20 49 4e 54 4b 45 59  nored for INTKEY
11d80 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20   tables..*/.int 
11d90 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
11da0 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  or(.  Btree *pBt
11db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dd0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
11de0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e10 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
11e20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
11e30 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11e60 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
11e70 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69  read-only */.  i
11e80 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a  nt (*xCmp)(void*
11e90 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
11ea0 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
11eb0 29 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72  ), /* Key Compar
11ec0 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76  ison func */.  v
11ed0 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20  oid *pArg,      
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
11f00 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
11f10 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
11f20 73 6f 72 20 2a 2a 70 70 43 75 72 20 20 20 20 20  sor **ppCur     
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f40 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
11f50 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
11f60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
11f70 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
11f80 3b 0a 0a 20 20 2a 70 70 43 75 72 20 3d 20 30 3b  ;..  *ppCur = 0;
11f90 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
11fa0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65  .    if( pBt->re
11fb0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
11fc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
11fd0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  ADONLY;.    }.  
11fe0 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
11ff0 6f 63 6b 73 28 70 42 74 2c 20 69 54 61 62 6c 65  ocks(pBt, iTable
12000 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  , 0) ){.      re
12010 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
12020 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
12030 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  if( pBt->pPage1=
12040 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c  =0 ){.    rc = l
12050 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
12060 79 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  y(pBt);.    if( 
12070 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12080 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
12090 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
120a0 75 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ur = sqliteMallo
120b0 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 43  cRaw( sizeof(*pC
120c0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
120d0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  r==0 ){.    rc =
120e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
120f0 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63     goto create_c
12100 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b  ursor_exception;
12110 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e  .  }.  pCur->pgn
12120 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
12130 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 70 50  able;.  pCur->pP
12140 61 67 65 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72  age = 0;  /* For
12150 20 65 78 69 74 2d 68 61 6e 64 6c 65 72 2c 20 69   exit-handler, i
12160 6e 20 63 61 73 65 20 67 65 74 41 6e 64 49 6e 69  n case getAndIni
12170 74 50 61 67 65 28 29 20 66 61 69 6c 73 2e 20 2a  tPage() fails. *
12180 2f 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  /.  if( iTable==
12190 31 20 26 26 20 73 71 6c 69 74 65 33 70 61 67 65  1 && sqlite3page
121a0 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  r_pagecount(pBt-
121b0 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20  >pPager)==0 ){. 
121c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
121d0 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63  MPTY;.    goto c
121e0 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
121f0 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63  eption;.  }.  rc
12200 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
12210 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
12220 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50  oRoot, &pCur->pP
12230 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
12240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12250 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
12260 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
12270 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 78 43  ;.  }.  pCur->xC
12280 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70 20 3f 20  ompare = xCmp ? 
12290 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f 6d 70 61  xCmp : dfltCompa
122a0 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70 41 72 67  re;.  pCur->pArg
122b0 20 3d 20 70 41 72 67 3b 0a 20 20 70 43 75 72 2d   = pArg;.  pCur-
122c0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
122d0 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46  ur->wrFlag = wrF
122e0 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78  lag;.  pCur->idx
122f0 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
12300 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 30 2c 20 73  pCur->info, 0, s
12310 69 7a 65 6f 66 28 70 43 75 72 2d 3e 69 6e 66 6f  izeof(pCur->info
12320 29 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78  ));.  pCur->pNex
12330 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
12340 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  ;.  if( pCur->pN
12350 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
12360 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
12370 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 43 75 72  pCur;.  }.  pCur
12380 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 70  ->pPrev = 0;.  p
12390 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
123a0 75 72 3b 0a 20 20 70 43 75 72 2d 3e 69 73 56 61  ur;.  pCur->isVa
123b0 6c 69 64 20 3d 20 30 3b 0a 20 20 2a 70 70 43 75  lid = 0;.  *ppCu
123c0 72 20 3d 20 70 43 75 72 3b 0a 20 20 72 65 74 75  r = pCur;.  retu
123d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63  rn SQLITE_OK;..c
123e0 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
123f0 65 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43  eption:.  if( pC
12400 75 72 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  ur ){.    releas
12410 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
12420 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
12430 65 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  ee(pCur);.  }.  
12440 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
12450 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75  sed(pBt);.  retu
12460 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 30 20  rn rc;.}..#if 0 
12470 20 2f 2a 20 4e 6f 74 20 55 73 65 64 20 2a 2f 0a   /* Not Used */.
12480 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
12490 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f   value of the co
124a0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
124b0 6e 20 75 73 65 64 20 62 79 20 61 20 63 75 72 73  n used by a curs
124c0 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  or..*/.void sqli
124d0 74 65 33 42 74 72 65 65 53 65 74 43 6f 6d 70 61  te3BtreeSetCompa
124e0 72 65 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  re(.  BtCursor *
124f0 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 54 68 65  pCur,     /* The
12500 20 63 75 72 73 6f 72 20 74 6f 20 77 68 6f 73 65   cursor to whose
12510 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
12520 74 69 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20  tion is changed 
12530 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 6d 70 29 28  */.  int(*xCmp)(
12540 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
12550 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
12560 76 6f 69 64 2a 29 2c 20 2f 2a 20 4e 65 77 20 63  void*), /* New c
12570 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a  omparison func *
12580 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
12590 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
125a0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6d   argument to xCm
125b0 70 28 29 20 2a 2f 0a 29 7b 0a 20 20 70 43 75 72  p() */.){.  pCur
125c0 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d  ->xCompare = xCm
125d0 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43  p ? xCmp : dfltC
125e0 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e  ompare;.  pCur->
125f0 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 7d 0a 23  pArg = pArg;.}.#
12600 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  endif../*.** Clo
12610 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
12620 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
12630 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12640 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
12650 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
12660 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
12670 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12680 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
12690 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
126a0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
126b0 43 75 72 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  Cur->pBt;.  if( 
126c0 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20  pCur->pPrev ){. 
126d0 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e     pCur->pPrev->
126e0 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
126f0 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
12700 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
12710 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
12720 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  }.  if( pCur->pN
12730 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
12740 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
12750 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 7d  pCur->pPrev;.  }
12760 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
12770 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 75  Cur->pPage);.  u
12780 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
12790 65 64 28 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  ed(pBt);.  sqlit
127a0 65 46 72 65 65 28 70 43 75 72 29 3b 0a 20 20 72  eFree(pCur);.  r
127b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
127c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
127d0 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
127e0 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20  r by filling in 
127f0 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54  the fields of pT
12800 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74  empCur..** The t
12810 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
12820 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
12830 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68  rsor list for th
12840 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  e Btree..*/.stat
12850 69 63 20 76 6f 69 64 20 67 65 74 54 65 6d 70 43  ic void getTempC
12860 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
12870 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a  pCur, BtCursor *
12880 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 6d 65 6d  pTempCur){.  mem
12890 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43  cpy(pTempCur, pC
128a0 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72  ur, sizeof(*pCur
128b0 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e  ));.  pTempCur->
128c0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65  pNext = 0;.  pTe
128d0 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30  mpCur->pPrev = 0
128e0 3b 0a 20 20 69 66 28 20 70 54 65 6d 70 43 75 72  ;.  if( pTempCur
128f0 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73  ->pPage ){.    s
12900 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28  qlite3pager_ref(
12910 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d  pTempCur->pPage-
12920 3e 61 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  >aData);.  }.}..
12930 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74  /*.** Delete a t
12940 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
12950 73 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65  such as was made
12960 20 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65   by the CreateTe
12970 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a  mporaryCursor().
12980 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76  ** function abov
12990 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
129a0 64 20 72 65 6c 65 61 73 65 54 65 6d 70 43 75 72  d releaseTempCur
129b0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
129c0 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  ur){.  if( pCur-
129d0 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71  >pPage ){.    sq
129e0 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
129f0 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44  (pCur->pPage->aD
12a00 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ata);.  }.}../*.
12a10 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
12a20 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 66   BtCursor.info f
12a30 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65  ield of the give
12a40 6e 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  n cursor is vali
12a50 64 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  d..** If it is n
12a60 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
12a70 2c 20 63 61 6c 6c 20 70 61 72 73 65 43 65 6c 6c  , call parseCell
12a80 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
12a90 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
12aa0 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
12ab0 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
12ac0 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
12ad0 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
12ae0 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
12af0 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
12b00 6f 66 20 63 61 6c 6c 73 20 74 6f 20 70 61 72 73  of calls to pars
12b10 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 73 74 61 74  eCell()..*/.stat
12b20 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  ic void getCellI
12b30 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
12b40 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  ur){.  if( pCur-
12b50 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
12b60 7b 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c 28  {.    parseCell(
12b70 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
12b80 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e 69  r->idx, &pCur->i
12b90 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  nfo);.  }else{.#
12ba0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
12bb0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
12bc0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
12bd0 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
12be0 6f 29 29 3b 0a 20 20 20 20 70 61 72 73 65 43 65  o));.    parseCe
12bf0 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  ll(pCur->pPage, 
12c00 70 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f  pCur->idx, &info
12c10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
12c20 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
12c30 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
12c40 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 23 65  (info))==0 );.#e
12c50 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
12c60 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
12c70 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
12c80 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
12c90 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
12ca0 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
12cb0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
12cc0 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
12cd0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
12ce0 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
12cf0 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
12d00 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
12d10 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
12d20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
12d30 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
12d40 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
12d50 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
12d60 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
12d70 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
12d80 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
12d90 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
12da0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
12db0 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
12dc0 69 66 28 20 21 70 43 75 72 2d 3e 69 73 56 61 6c  if( !pCur->isVal
12dd0 69 64 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65  id ){.    *pSize
12de0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
12df0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
12e00 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65  Cur);.    *pSize
12e10 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
12e20 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ey;.  }.  return
12e30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12e40 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
12e50 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
12e60 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
12e70 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
12e80 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
12e90 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  tly points to.  
12ea0 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51  Always return SQ
12eb0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c  LITE_OK..** Fail
12ec0 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
12ed0 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ble.  If the cur
12ee0 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65  sor is not curre
12ef0 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  ntly.** pointing
12f00 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68   to an entry (wh
12f10 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20  ich can happen, 
12f20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  for example, if.
12f30 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
12f40 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a  is empty) then *
12f50 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
12f60 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
12f70 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
12f80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
12f90 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 66  32 *pSize){.  if
12fa0 28 20 21 70 43 75 72 2d 3e 69 73 56 61 6c 69 64  ( !pCur->isValid
12fb0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 20 70   ){.    /* Not p
12fc0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c  ointing at a val
12fd0 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a  id entry - set *
12fe0 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20  pSize to 0. */. 
12ff0 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
13000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65 74 43   }else{.    getC
13010 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
13020 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
13030 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  ->info.nData;.  
13040 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
13050 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
13060 65 61 64 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ead payload info
13070 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
13080 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
13090 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 0a 2a  pCur cursor is.*
130a0 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  * pointing to.  
130b0 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
130c0 65 20 70 61 79 6c 6f 61 64 20 61 74 20 22 6f 66  e payload at "of
130d0 66 73 65 74 22 20 61 6e 64 20 72 65 61 64 0a 2a  fset" and read.*
130e0 2a 20 61 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * a total of "am
130f0 74 22 20 62 79 74 65 73 2e 20 20 50 75 74 20 74  t" bytes.  Put t
13100 68 65 20 72 65 73 75 6c 74 20 69 6e 20 7a 42 75  he result in zBu
13110 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f..**.** This ro
13120 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d  utine does not m
13130 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f  ake a distinctio
13140 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e  n between key an
13150 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75  d data..** It ju
13160 73 74 20 72 65 61 64 73 20 62 79 74 65 73 20 66  st reads bytes f
13170 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20  rom the payload 
13180 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68  area.  Data migh
13190 74 20 61 70 70 65 61 72 0a 2a 2a 20 6f 6e 20 74  t appear.** on t
131a0 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20  he main page or 
131b0 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
131c0 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
131d0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2f 0a  rflow pages..*/.
131e0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
131f0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
13200 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
13210 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
13220 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
13230 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
13240 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
13250 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
13260 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
13270 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74  payload */.  int
13280 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
13290 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
132a0 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
132b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
132c0 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
132d0 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
132e0 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
132f0 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20  t skipKey       
13300 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67     /* offset beg
13310 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74  ins at data if t
13320 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29  his is true */.)
13330 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
13340 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 50  r *aPayload;.  P
13350 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  gno nextPage;.  
13360 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
13370 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65  e *pPage;.  Btre
13380 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 6f 76  e *pBt;.  int ov
13390 66 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20 6e 4b  flSize;.  u32 nK
133a0 65 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ey;..  assert( p
133b0 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
133c0 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  pPage!=0 );.  as
133d0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 73 56 61  sert( pCur->isVa
133e0 6c 69 64 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  lid );.  pBt = p
133f0 43 75 72 2d 3e 70 42 74 3b 0a 20 20 70 50 61 67  Cur->pBt;.  pPag
13400 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
13410 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79  .  pageIntegrity
13420 28 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72  (pPage);.  asser
13430 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
13440 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
13450 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67  ge->nCell );.  g
13460 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
13470 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
13480 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b  Cur->info.pCell;
13490 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70  .  aPayload += p
134a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
134b0 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  r;.  if( pPage->
134c0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b  intKey ){.    nK
134d0 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 0;.  }else{
134e0 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75 72  .    nKey = pCur
134f0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d  ->info.nKey;.  }
13500 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
13510 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 6b  t>=0 );.  if( sk
13520 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66  ipKey ){.    off
13530 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d  set += nKey;.  }
13540 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d  .  if( offset+am
13550 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69  t > nKey+pCur->i
13560 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20  nfo.nData ){.   
13570 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
13580 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
13590 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
135a0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
135b0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
135c0 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
135d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
135e0 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
135f0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
13600 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
13610 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
13620 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
13630 5d 2c 20 61 29 3b 0a 20 20 20 20 69 66 28 20 61  ], a);.    if( a
13640 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 20 20 72  ==amt ){.      r
13650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13660 0a 20 20 20 20 7d 0a 20 20 20 20 6f 66 66 73 65  .    }.    offse
13670 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20  t = 0;.    pBuf 
13680 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d  += a;.    amt -=
13690 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
136a0 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d   offset -= pCur-
136b0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
136c0 7d 0a 20 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  }.  ovflSize = p
136d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
136e0 20 34 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20   4;.  if( amt>0 
136f0 29 7b 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ){.    nextPage 
13700 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
13710 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
13720 6e 4c 6f 63 61 6c 5d 29 3b 0a 20 20 20 20 77 68  nLocal]);.    wh
13730 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 6e 65  ile( amt>0 && ne
13740 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  xtPage ){.      
13750 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
13760 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61 67 65  r_get(pBt->pPage
13770 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 28 76 6f  r, nextPage, (vo
13780 69 64 2a 2a 29 26 61 50 61 79 6c 6f 61 64 29 3b  id**)&aPayload);
13790 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
137a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
137b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
137c0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
137d0 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
137e0 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 66  d);.      if( of
137f0 66 73 65 74 3c 6f 76 66 6c 53 69 7a 65 20 29 7b  fset<ovflSize ){
13800 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
13810 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
13820 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
13830 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
13840 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
13850 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
13860 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
13870 6d 63 70 79 28 70 42 75 66 2c 20 26 61 50 61 79  mcpy(pBuf, &aPay
13880 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
13890 61 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  a);.        offs
138a0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
138b0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
138c0 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
138d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
138e0 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
138f0 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Size;.      }.  
13900 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
13910 5f 75 6e 72 65 66 28 61 50 61 79 6c 6f 61 64 29  _unref(aPayload)
13920 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
13930 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  f( amt>0 ){.    
13940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
13950 52 52 55 50 54 3b 20 2f 2a 20 62 6b 70 74 2d 43  RRUPT; /* bkpt-C
13960 4f 52 52 55 50 54 20 2a 2f 0a 20 20 7d 0a 20 20  ORRUPT */.  }.  
13970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
13990 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
139a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
139b0 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
139c0 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
139d0 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
139e0 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
139f0 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
13a00 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
13a10 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
13a20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
13a30 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
13a40 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
13a50 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
13a60 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
13a70 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
13a80 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
13a90 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
13aa0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
13ab0 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
13ac0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
13ad0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
13ae0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
13af0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
13b00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
13b10 69 73 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73  isValid );.  ass
13b20 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
13b30 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  !=0 );.  if( pCu
13b40 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  r->pPage->intKey
13b50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13b60 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
13b70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
13b80 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  r->pPage->intKey
13b90 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
13ba0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
13bb0 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
13bc0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
13bd0 0a 20 20 72 65 74 75 72 6e 20 67 65 74 50 61 79  .  return getPay
13be0 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
13bf0 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
13c00 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29  d char*)pBuf, 0)
13c10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
13c20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
13c30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13c40 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
13c50 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
13c60 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
13c70 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
13c80 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
13c90 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
13ca0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
13cb0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
13cc0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
13cd0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
13ce0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
13cf0 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
13d00 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
13d10 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
13d20 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
13d30 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
13d40 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
13d50 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
13d60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
13d70 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
13d80 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
13d90 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  {.  assert( pCur
13da0 2d 3e 69 73 56 61 6c 69 64 20 29 3b 0a 20 20 61  ->isValid );.  a
13db0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
13dc0 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
13dd0 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
13de0 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
13df0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
13e00 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 50  );.  return getP
13e10 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
13e20 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
13e30 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  1);.}../*.** Ret
13e40 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
13e50 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
13e60 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
13e70 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
13e80 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
13e90 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
13ea0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
13eb0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
13ec0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
13ed0 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
13ee0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
13ef0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
13f00 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
13f10 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
13f20 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
13f30 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
13f40 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
13f50 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
13f60 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
13f70 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
13f80 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
13f90 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
13fa0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13fb0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
13fc0 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
13fd0 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
13fe0 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
13ff0 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
14000 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
14010 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
14020 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
14030 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
14040 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
14050 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
14060 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
14070 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
14080 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
14090 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
140a0 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
140b0 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
140c0 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
140d0 20 67 65 74 50 61 79 6c 6f 61 64 28 29 20 6d 75   getPayload() mu
140e0 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
140f0 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20  assembly.** the 
14100 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
14110 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
14120 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
14130 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
14140 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
14150 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
14160 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
14170 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
14180 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
14190 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
141a0 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
141b0 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
141c0 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
141d0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
141e0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
141f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14200 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
14210 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
14220 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
14230 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
14240 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
14250 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20  .  int *pAmt,   
14260 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
14270 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
14280 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
14290 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69  ere */.  int ski
142a0 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
142b0 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20   read beginning 
142c0 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
142d0 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  is true */.){.  
142e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
142f0 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61  Payload;.  MemPa
14300 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72  ge *pPage;.  Btr
14310 65 65 20 2a 70 42 74 3b 0a 20 20 75 33 32 20 6e  ee *pBt;.  u32 n
14320 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61  Key;.  int nLoca
14330 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  l;..  assert( pC
14340 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 70  ur!=0 && pCur->p
14350 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
14360 65 72 74 28 20 70 43 75 72 2d 3e 69 73 56 61 6c  ert( pCur->isVal
14370 69 64 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 43  id );.  pBt = pC
14380 75 72 2d 3e 70 42 74 3b 0a 20 20 70 50 61 67 65  ur->pBt;.  pPage
14390 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
143a0 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28    pageIntegrity(
143b0 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74  pPage);.  assert
143c0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
143d0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
143e0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65  e->nCell );.  ge
143f0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
14400 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
14410 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
14420 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
14430 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
14440 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
14450 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
14460 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
14470 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d      nKey = pCur-
14480 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
14490 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
144a0 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  .    aPayload +=
144b0 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61   nKey;.    nLoca
144c0 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
144d0 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20  Local - nKey;.  
144e0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61  }else{.    nLoca
144f0 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
14500 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e  Local;.    if( n
14510 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20  Local>nKey ){.  
14520 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65      nLocal = nKe
14530 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  y;.    }.  }.  *
14540 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20  pAmt = nLocal;. 
14550 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64   return aPayload
14560 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
14570 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
14580 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
14590 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
145a0 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
145b0 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
145c0 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
145d0 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
145e0 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
145f0 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
14600 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
14610 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
14620 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
14630 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
14640 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
14650 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
14660 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
14670 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
14680 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
14690 65 65 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  ee routine..**.*
146a0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
146b0 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
146c0 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
146d0 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
146e0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
146f0 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
14700 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
14710 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
14720 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
14730 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
14740 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
14750 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 63  mt){.  return (c
14760 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
14770 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
14780 6d 74 2c 20 30 29 3b 0a 7d 0a 63 6f 6e 73 74 20  mt, 0);.}.const 
14790 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
147a0 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
147b0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
147c0 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
147d0 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
147e0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
147f0 20 70 41 6d 74 2c 20 31 29 3b 0a 7d 0a 0a 0a 2f   pAmt, 1);.}.../
14800 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
14810 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
14820 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
14830 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
14840 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
14850 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
14860 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
14870 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  move to..*/.stat
14880 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
14890 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
148a0 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
148b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
148c0 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
148d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50    MemPage *pOldP
148e0 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 42  age;.  Btree *pB
148f0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
14900 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
14910 69 73 56 61 6c 69 64 20 29 3b 0a 20 20 72 63 20  isValid );.  rc 
14920 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
14930 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
14940 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72 2d 3e  pNewPage, pCur->
14950 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
14960 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14970 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70 4e  pageIntegrity(pN
14980 65 77 50 61 67 65 29 3b 0a 20 20 70 4e 65 77 50  ewPage);.  pNewP
14990 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  age->idxParent =
149a0 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f   pCur->idx;.  pO
149b0 6c 64 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  ldPage = pCur->p
149c0 50 61 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65  Page;.  pOldPage
149d0 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
149e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
149f0 6c 64 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d  ldPage);.  pCur-
14a00 3e 70 50 61 67 65 20 3d 20 70 4e 65 77 50 61 67  >pPage = pNewPag
14a10 65 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  e;.  pCur->idx =
14a20 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
14a30 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66  .nSize = 0;.  if
14a40 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c  ( pNewPage->nCel
14a50 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72  l<1 ){.    retur
14a60 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14a70 3b 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50  ; /* bkpt-CORRUP
14a80 54 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  T */.  }.  retur
14a90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14aa0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
14ab0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
14ac0 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
14ad0 74 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a  t of its table..
14ae0 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61  **.** The virtua
14af0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74  l root page is t
14b00 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72  he root page for
14b10 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42   most tables.  B
14b20 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  ut.** for the ta
14b30 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61  ble rooted on pa
14b40 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74  ge 1, sometime t
14b50 68 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67  he real root pag
14b60 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78  e.** is empty ex
14b70 63 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67  cept for the rig
14b80 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20  ht-pointer.  In 
14b90 73 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a  such cases the.*
14ba0 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
14bb0 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20  age is the page 
14bc0 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70  that the right-p
14bd0 6f 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a  ointer of page.*
14be0 2a 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  * 1 is pointing 
14bf0 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  to..*/.static in
14c00 74 20 69 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d  t isRootPage(Mem
14c10 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
14c20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
14c30 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
14c40 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  t;.  if( pParent
14c50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
14c60 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70    if( pParent->p
14c70 67 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30  gno>1 ) return 0
14c80 3b 0a 20 20 69 66 28 20 67 65 74 32 62 79 74 65  ;.  if( get2byte
14c90 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
14ca0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
14cb0 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74  set+3])==0 ) ret
14cc0 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
14cd0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
14ce0 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
14cf0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
14d00 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
14d10 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
14d20 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
14d30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
14d40 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
14d50 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
14d60 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
14d70 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
14d80 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
14d90 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
14da0 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
14db0 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
14dc0 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
14dd0 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
14de0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f  /.static void mo
14df0 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
14e00 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
14e10 6e 6f 20 6f 6c 64 50 67 6e 6f 3b 0a 20 20 4d 65  no oldPgno;.  Me
14e20 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a  mPage *pParent;.
14e30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
14e40 3b 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e  ;.  int idxParen
14e50 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  t;..  assert( pC
14e60 75 72 2d 3e 69 73 56 61 6c 69 64 20 29 3b 0a 20  ur->isValid );. 
14e70 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
14e80 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
14e90 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  pPage!=0 );.  as
14ea0 73 65 72 74 28 20 21 69 73 52 6f 6f 74 50 61 67  sert( !isRootPag
14eb0 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70 61  e(pPage) );.  pa
14ec0 67 65 49 6e 74 65 67 72 69 74 79 28 70 50 61 67  geIntegrity(pPag
14ed0 65 29 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20  e);.  pParent = 
14ee0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a  pPage->pParent;.
14ef0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
14f00 74 21 3d 30 20 29 3b 0a 20 20 70 61 67 65 49 6e  t!=0 );.  pageIn
14f10 74 65 67 72 69 74 79 28 70 50 61 72 65 6e 74 29  tegrity(pParent)
14f20 3b 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20  ;.  idxParent = 
14f30 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  pPage->idxParent
14f40 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
14f50 5f 72 65 66 28 70 50 61 72 65 6e 74 2d 3e 61 44  _ref(pParent->aD
14f60 61 74 61 29 3b 0a 20 20 6f 6c 64 50 67 6e 6f 20  ata);.  oldPgno 
14f70 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  = pPage->pgno;. 
14f80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
14f90 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61  ge);.  pCur->pPa
14fa0 67 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  ge = pParent;.  
14fb0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
14fc0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
14fd0 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69 66  pParent->idxShif
14fe0 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e  t==0 );.  pCur->
14ff0 69 64 78 20 3d 20 69 64 78 50 61 72 65 6e 74 3b  idx = idxParent;
15000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
15010 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
15020 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74   root page.*/.st
15030 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
15040 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
15050 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
15060 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pRoot;.  int rc;
15070 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20  .  Btree *pBt = 
15080 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 72 63  pCur->pBt;..  rc
15090 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
150a0 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
150b0 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
150c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
150d0 20 20 20 70 43 75 72 2d 3e 69 73 56 61 6c 69 64     pCur->isValid
150e0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
150f0 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61   rc;.  }.  relea
15100 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61  sePage(pCur->pPa
15110 67 65 29 3b 0a 20 20 70 61 67 65 49 6e 74 65 67  ge);.  pageInteg
15120 72 69 74 79 28 70 52 6f 6f 74 29 3b 0a 20 20 70  rity(pRoot);.  p
15130 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f  Cur->pPage = pRo
15140 6f 74 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20  ot;.  pCur->idx 
15150 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
15160 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
15170 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d  f( pRoot->nCell=
15180 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65  =0 && !pRoot->le
15190 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
151a0 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73 65  ubpage;.    asse
151b0 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
151c0 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67  =1 );.    subpag
151d0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
151e0 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
151f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
15200 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 75 62  .    assert( sub
15210 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43  page>0 );.    pC
15220 75 72 2d 3e 69 73 56 61 6c 69 64 20 3d 20 31 3b  ur->isValid = 1;
15230 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
15240 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
15250 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72  age);.  }.  pCur
15260 2d 3e 69 73 56 61 6c 69 64 20 3d 20 70 43 75 72  ->isValid = pCur
15270 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ->pPage->nCell>0
15280 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15290 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
152a0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
152b0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
152c0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
152d0 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
152e0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
152f0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
15300 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
15310 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
15320 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
15330 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
15340 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
15350 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
15360 74 28 20 70 43 75 72 2d 3e 69 73 56 61 6c 69 64  t( pCur->isValid
15370 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70   );.  while( !(p
15380 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
15390 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  ge)->leaf ){.   
153a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
153b0 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
153c0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
153d0 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
153e0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
153f0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
15400 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
15410 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
15420 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
15430 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
15440 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
15450 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
15460 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
15470 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
15480 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
15490 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
154a0 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
154b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
154c0 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
154d0 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
154e0 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
154f0 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
15500 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
15510 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
15520 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
15530 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
15540 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
15550 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
15560 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
15570 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
15580 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
15590 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
155a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
155b0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
155c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
155d0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
155e0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
155f0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
15600 72 74 28 20 70 43 75 72 2d 3e 69 73 56 61 6c 69  rt( pCur->isVali
15610 64 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28  d );.  while( !(
15620 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
15630 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  age)->leaf ){.  
15640 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
15650 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
15660 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
15670 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
15680 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  idx = pPage->nCe
15690 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
156a0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
156b0 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
156c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
156d0 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20  }.  pCur->idx = 
156e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31  pPage->nCell - 1
156f0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
15700 53 69 7a 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Size = 0;.  retu
15710 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15720 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
15730 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
15740 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
15750 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
15760 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
15770 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
15780 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
15790 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
157a0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
157b0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
157c0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
157d0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
157e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
157f0 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
15800 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
15810 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
15820 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
15830 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
15840 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
15850 20 70 43 75 72 2d 3e 69 73 56 61 6c 69 64 3d 3d   pCur->isValid==
15860 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
15870 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
15880 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70  ell==0 );.    *p
15890 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
158a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
158b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
158c0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  r->pPage->nCell>
158d0 30 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  0 );.  *pRes = 0
158e0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c  ;.  rc = moveToL
158f0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
15900 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15910 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
15920 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
15930 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
15940 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
15950 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
15960 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
15970 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
15980 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
15990 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
159a0 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
159b0 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
159c0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
159d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
159e0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
159f0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
15a00 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d  int rc;.  rc = m
15a10 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
15a20 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
15a30 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 70 43 75  rn rc;.  if( pCu
15a40 72 2d 3e 69 73 56 61 6c 69 64 3d 3d 30 20 29 7b  r->isValid==0 ){
15a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
15a60 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
15a70 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  =0 );.    *pRes 
15a80 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
15a90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
15aa0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
15ab0 73 56 61 6c 69 64 20 29 3b 0a 20 20 2a 70 52 65  sValid );.  *pRe
15ac0 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f  s = 0;.  rc = mo
15ad0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
15ae0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
15af0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
15b00 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
15b10 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
15b20 65 6e 74 72 79 20 6e 65 61 72 20 70 4b 65 79 2f  entry near pKey/
15b30 6e 4b 65 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  nKey..** Return 
15b40 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
15b50 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
15b60 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68   tables, only th
15b70 65 20 6e 4b 65 79 20 70 61 72 61 6d 65 74 65 72  e nKey parameter
15b80 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
15b90 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
15ba0 46 6f 72 20 6f 74 68 65 72 20 74 61 62 6c 65 73  For other tables
15bb0 2c 20 6e 4b 65 79 20 69 73 20 74 68 65 20 6e 75  , nKey is the nu
15bc0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
15bd0 20 64 61 74 61 0a 2a 2a 20 69 6e 20 6e 4b 65 79   data.** in nKey
15be0 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  .  The compariso
15bf0 6e 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69  n function speci
15c00 66 69 65 64 20 77 68 65 6e 20 74 68 65 20 63 75  fied when the cu
15c10 72 73 6f 72 20 77 61 73 0a 2a 2a 20 63 72 65 61  rsor was.** crea
15c20 74 65 64 20 69 73 20 75 73 65 64 20 74 6f 20 63  ted is used to c
15c30 6f 6d 70 61 72 65 20 6b 65 79 73 2e 0a 2a 2a 0a  ompare keys..**.
15c40 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
15c50 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
15c60 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
15c70 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
15c80 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
15c90 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
15ca0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
15cb0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
15cc0 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
15cd0 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
15ce0 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
15cf0 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
15d00 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
15d10 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
15d20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  The result of co
15d30 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
15d40 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
15d50 6f 20 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 63  o which the.** c
15d60 75 72 73 6f 72 20 69 73 20 77 72 69 74 74 65 6e  ursor is written
15d70 20 74 6f 20 2a 70 52 65 73 20 69 66 20 70 52 65   to *pRes if pRe
15d80 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65  s!=NULL.  The me
15d90 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73  aning of.** this
15da0 20 76 61 6c 75 65 20 69 73 20 61 73 20 66 6f 6c   value is as fol
15db0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
15dc0 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
15dd0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
15de0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
15df0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
15e10 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b   smaller than pK
15e20 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
15e30 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
15e60 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
15e70 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
15e80 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
15e90 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
15ea0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
15eb0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
15ec0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
15ed0 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
15ee0 6c 79 20 6d 61 74 63 68 65 73 20 70 4b 65 79 2e  ly matches pKey.
15ef0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
15f00 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
15f10 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
15f20 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
15f30 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
15f40 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
15f50 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2f  er than pKey..*/
15f60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15f70 65 4d 6f 76 65 74 6f 28 42 74 43 75 72 73 6f 72  eMoveto(BtCursor
15f80 20 2a 70 43 75 72 2c 20 63 6f 6e 73 74 20 76 6f   *pCur, const vo
15f90 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
15fa0 65 79 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ey, int *pRes){.
15fb0 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d    int rc;.  rc =
15fc0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
15fd0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
15fe0 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72  turn rc;.  asser
15ff0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  t( pCur->pPage )
16000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
16010 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ->pPage->isInit 
16020 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
16030 73 56 61 6c 69 64 3d 3d 30 20 29 7b 0a 20 20 20  sValid==0 ){.   
16040 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
16050 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
16060 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
16070 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
16080 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 20 66  ITE_OK;.  }.   f
16090 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
160a0 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67  lwr, upr;.    Pg
160b0 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
160c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
160d0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
160e0 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a   int c = -1;  /*
160f0 20 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20   pRes return if 
16100 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d  table is empty m
16110 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20  ust be -1 */.   
16120 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
16130 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
16140 2d 31 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  -1;.    if( !pPa
16150 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 4b  ge->intKey && pK
16160 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ey==0 ){.      r
16170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
16180 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
16190 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70 50  pageIntegrity(pP
161a0 61 67 65 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  age);.    while(
161b0 20 6c 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20   lwr<=upr ){.   
161c0 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
161d0 79 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65  y;.      i64 nCe
161e0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 70 43 75  llKey;.      pCu
161f0 72 2d 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  r->idx = (lwr+up
16200 72 29 2f 32 3b 0a 20 20 20 20 20 20 70 43 75 72  r)/2;.      pCur
16210 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
16220 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
16230 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
16240 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
16250 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
16260 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
16270 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b   if( nCellKey<nK
16280 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
16290 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
162a0 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
162b0 65 79 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  ey>nKey ){.     
162c0 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
162d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
162e0 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
162f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
16300 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
16310 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20  available;.     
16320 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76     pCellKey = (v
16330 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c 6f  oid *)fetchPaylo
16340 61 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c 61  ad(pCur, &availa
16350 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ble, 0);.       
16360 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d   if( available>=
16370 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20  nCellKey ){.    
16380 20 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d 3e        c = pCur->
16390 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e 70  xCompare(pCur->p
163a0 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70  Arg, nCellKey, p
163b0 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  CellKey, nKey, p
163c0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
163d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
163e0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
163f0 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 43 65 6c 6c  MallocRaw( nCell
16400 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
16410 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
16420 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
16430 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
16440 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
16450 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
16460 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20  nCellKey, (void 
16470 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  *)pCellKey);.   
16480 20 20 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d         c = pCur-
16490 3e 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e  >xCompare(pCur->
164a0 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  pArg, nCellKey, 
164b0 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20  pCellKey, nKey, 
164c0 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  pKey);.         
164d0 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 65 6c   sqliteFree(pCel
164e0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
164f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
16500 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
16510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16520 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
16530 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
16540 44 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e  Data && !pPage->
16550 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
16560 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64    lwr = pCur->id
16570 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  x;.          upr
16580 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20   = lwr - 1;.    
16590 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
165a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
165b0 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
165c0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
165d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
165e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
165f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
16600 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
16610 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69     lwr = pCur->i
16620 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
16630 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
16640 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b 0a 20 20   pCur->idx-1;.  
16650 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16660 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
16670 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
16680 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
16690 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
166a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
166b0 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20  chldPg = 0;.    
166c0 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70  }else if( lwr>=p
166d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
166e0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
166f0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
16700 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
16710 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
16720 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
16730 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
16740 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
16750 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  r));.    }.    i
16760 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a  f( chldPg==0 ){.
16770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
16780 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
16790 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50  ur->idx<pCur->pP
167a0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
167b0 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
167c0 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
167d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
167e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
167f0 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20  ->idx = lwr;.   
16800 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
16810 65 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  e = 0;.    rc = 
16820 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
16830 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
16840 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
16850 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
16860 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41    }.  /* NOT REA
16870 43 48 45 44 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  CHED */.}../*.**
16880 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
16890 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
168a0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
168b0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
168c0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
168d0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
168e0 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
168f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
16900 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
16910 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
16920 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
16930 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
16940 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
16950 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
16960 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
16970 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
16980 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
16990 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
169a0 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
169b0 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
169c0 6e 20 70 43 75 72 2d 3e 69 73 56 61 6c 69 64 3d  n pCur->isValid=
169d0 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  =0;.}../*.** Adv
169e0 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
169f0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
16a00 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
16a10 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
16a20 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
16a30 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
16a40 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
16a50 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
16a60 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
16a70 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
16a80 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
16a90 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
16aa0 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
16ab0 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
16ac0 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
16ad0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
16ae0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
16af0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
16b00 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
16b10 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52  e;..  assert( pR
16b20 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  es!=0 );.  if( p
16b30 43 75 72 2d 3e 69 73 56 61 6c 69 64 3d 3d 30 20  Cur->isValid==0 
16b40 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
16b50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
16b60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
16b70 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
16b80 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
16b90 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
16ba0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43  ->nCell );..  pC
16bb0 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 70 43 75  ur->idx++;.  pCu
16bc0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
16bd0 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  0;.  if( pCur->i
16be0 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
16bf0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
16c00 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
16c10 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
16c20 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
16c30 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
16c40 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
16c50 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
16c60 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
16c70 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
16c80 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
16c90 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
16ca0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
16cb0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  rc;.    }.    do
16cc0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 6f  {.      if( isRo
16cd0 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b  otPage(pPage) ){
16ce0 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
16cf0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
16d00 2d 3e 69 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20  ->isValid = 0;. 
16d10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
16d20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
16d30 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
16d40 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
16d50 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
16d60 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Page;.    }while
16d70 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
16d80 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
16d90 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
16da0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  if( pPage->leafD
16db0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ata ){.      rc 
16dc0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
16dd0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
16de0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16df0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16e00 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
16e10 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
16e20 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
16e30 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
16e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16e50 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
16e60 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
16e70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16e80 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
16e90 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
16ea0 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
16eb0 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
16ec0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
16ed0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
16ee0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
16ef0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
16f00 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
16f10 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
16f20 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
16f30 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
16f40 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
16f50 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
16f60 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
16f70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16f80 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
16f90 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
16fa0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
16fb0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
16fc0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
16fd0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 56 61    if( pCur->isVa
16fe0 6c 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  lid==0 ){.    *p
16ff0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
17000 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17010 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
17020 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
17030 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
17040 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
17050 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a  pCur->idx>=0 );.
17060 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
17070 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
17080 20 67 65 74 34 62 79 74 65 28 20 66 69 6e 64 43   get4byte( findC
17090 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
170a0 3e 69 64 78 29 20 29 3b 0a 20 20 20 20 72 63 20  >idx) );.    rc 
170b0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
170c0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
170d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
170e0 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  c;.    rc = move
170f0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
17100 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17110 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78  while( pCur->idx
17120 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
17130 20 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67   isRootPage(pPag
17140 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  e) ){.        pC
17150 75 72 2d 3e 69 73 56 61 6c 69 64 20 3d 20 30 3b  ur->isValid = 0;
17160 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
17170 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
17180 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17190 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
171a0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
171b0 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
171c0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d  ur->pPage;.    }
171d0 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d  .    pCur->idx--
171e0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
171f0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
17200 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  if( pPage->leafD
17210 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  ata && !pPage->l
17220 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
17230 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
17240 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
17250 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
17260 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17270 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
17280 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65   *pRes = 0;.  re
17290 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
172a0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
172b0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
172c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
172d0 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
172e0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
172f0 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
17300 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 70 61  words, sqlite3pa
17310 67 65 72 5f 77 72 69 74 65 28 29 0a 2a 2a 20 68  ger_write().** h
17320 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
17330 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
17340 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
17350 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
17360 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
17370 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
17380 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
17390 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
173a0 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
173b0 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 6f 6e  pager_unref() on
173c0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
173d0 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
173e0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
173f0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
17400 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
17410 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
17420 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
17430 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61  rror.  *ppPage a
17440 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e  nd *pPgno are un
17450 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65  defined in the e
17460 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
17470 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f  ..** Do not invo
17480 6b 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ke sqlite3pager_
17490 75 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61  unref() on *ppPa
174a0 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ge if an error i
174b0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
174c0 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
174d0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
174e0 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65  ot 0, then a (fe
174f0 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20  eble) effort is 
17500 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
17510 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
17520 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
17530 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
17540 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
17550 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
17560 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
17570 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
17580 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
17590 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
175a0 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
175b0 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
175c0 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
175d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
175e0 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72  exact" parameter
175f0 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74   is not 0, and t
17600 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e  he page-number n
17610 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a  earby exists .**
17620 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
17630 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
17640 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65   it is guarentee
17650 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
17660 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c  . This.** is onl
17670 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  y used by auto-v
17680 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20  acuum databases 
17690 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20  when allocating 
176a0 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a  a new table..*/.
176b0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
176c0 61 74 65 50 61 67 65 28 0a 20 20 42 74 72 65 65  atePage(.  Btree
176d0 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
176e0 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
176f0 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
17700 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
17710 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
17720 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
17730 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20  nt rc;.  int n; 
17740 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17750 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
17760 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  eelist */.  int 
17770 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
17780 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
17790 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
177a0 72 65 65 6c 69 73 74 20 2a 2f 0a 0a 20 20 70 50  reelist */..  pP
177b0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
177c0 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  e1;.  n = get4by
177d0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
177e0 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e  a[36]);.  if( n>
177f0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
17800 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
17810 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
17820 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
17830 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 4d   pages. */.    M
17840 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
17850 20 30 3b 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   0;.    Pgno iTr
17860 75 6e 6b 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  unk;.    MemPage
17870 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
17880 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
17890 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
178a0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
178b0 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
178c0 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
178d0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
178e0 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74   'exact' paramet
178f0 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20  er was true and 
17900 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
17910 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
17920 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
17930 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
17940 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
17950 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
17960 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
17970 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
17980 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
17990 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
179a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
179b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
179c0 20 20 20 20 69 66 28 20 65 78 61 63 74 20 29 7b      if( exact ){
179d0 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
179e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
179f0 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
17a00 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
17a10 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
17a20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
17a30 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
17a40 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
17a50 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
17a60 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  rc;.      if( eT
17a70 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
17a80 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
17a90 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
17aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
17ab0 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20  Pgno = nearby;. 
17ac0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
17ad0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
17ae0 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
17af0 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
17b00 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
17b10 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
17b20 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
17b30 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
17b40 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
17b50 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
17b60 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
17b70 72 5f 77 72 69 74 65 28 70 50 61 67 65 31 2d 3e  r_write(pPage1->
17b80 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
17b90 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
17ba0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
17bb0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
17bc0 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
17bd0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
17be0 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
17bf0 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
17c00 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
17c10 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
17c20 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
17c30 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
17c40 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
17c50 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
17c60 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
17c70 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
17c80 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
17c90 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  d..    */.    do
17ca0 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
17cb0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
17cc0 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
17cd0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
17ce0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
17cf0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
17d00 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
17d10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
17d20 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
17d30 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
17d40 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
17d50 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
17d60 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
17d70 75 6e 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unk);.      if( 
17d80 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
17d90 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
17da0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 72  runk);.        r
17db0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17dc0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  }..      /* TODO
17dd0 3a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6d 6f  : This should mo
17de0 76 65 20 74 6f 20 61 66 74 65 72 20 74 68 65 20  ve to after the 
17df0 6c 6f 6f 70 3f 20 2a 2f 0a 20 20 20 20 20 20 72  loop? */.      r
17e00 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
17e10 5f 77 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 61  _write(pTrunk->a
17e20 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  Data);.      if(
17e30 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
17e40 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
17e50 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  k);.        rele
17e60 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
17e70 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nk);.        ret
17e80 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
17e90 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
17ea0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
17eb0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
17ec0 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
17ed0 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
17ee0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
17ef0 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
17f00 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
17f10 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
17f20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
17f30 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
17f40 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
17f50 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
17f60 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
17f70 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
17f80 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
17f90 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
17fa0 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 50 67   );.        *pPg
17fb0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
17fc0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
17fd0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
17fe0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
17ff0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
18000 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
18010 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
18020 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
18030 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
18040 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
18050 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
18060 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
18070 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
18080 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  k>pBt->usableSiz
18090 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
180a0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
180b0 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
180c0 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
180d0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
180e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
180f0 43 4f 52 52 55 50 54 3b 20 2f 2a 20 62 6b 70 74  CORRUPT; /* bkpt
18100 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 23 69 66 6e  -CORRUPT */.#ifn
18110 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18120 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
18130 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
18140 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d  hList && nearby=
18150 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  =iTrunk ){.     
18160 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
18170 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
18180 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
18190 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
181a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
181b0 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
181c0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
181d0 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
181e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
181f0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d   assert( *pPgno=
18200 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20  =iTrunk );.     
18210 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
18220 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61  unk;.        sea
18230 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
18240 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b       if( k==0 ){
18250 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
18260 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
18270 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
18280 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
18290 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
182a0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
182b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
182c0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
182d0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
182e0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
182f0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
18300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18320 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
18330 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
18340 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
18350 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
18360 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
18370 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
18380 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
18390 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
183a0 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
183b0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
183c0 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
183d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
183e0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
183f0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
18400 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
18410 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
18420 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
18430 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50         rc = getP
18440 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75  age(pBt, iNewTru
18450 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 29 3b  nk, &pNewTrunk);
18460 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
18470 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18480 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
18490 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
184a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
184b0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
184c0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
184d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
184e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
184f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
18500 61 67 65 72 5f 77 72 69 74 65 28 70 4e 65 77 54  ager_write(pNewT
18510 72 75 6e 6b 2d 3e 61 44 61 74 61 29 3b 0a 20 20  runk->aData);.  
18520 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
18530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18540 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
18550 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
18560 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
18570 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
18580 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
18590 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
185a0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
185b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
185c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
185d0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
185e0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
185f0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
18600 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
18610 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
18620 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
18630 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
18640 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
18650 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
18660 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
18670 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
18680 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
18690 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
186a0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
186b0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
186c0 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
186d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
186e0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
186f0 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
18700 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
18710 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
18720 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c   }.          rel
18730 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
18740 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nk);.        }. 
18750 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
18760 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
18770 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
18780 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
18790 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
187a0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
187b0 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
187c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
187d0 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
187e0 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
187f0 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65 73        int closes
18800 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
18810 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
18820 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
18830 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
18840 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ata;.        if(
18850 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
18860 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69         int i, di
18870 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  st;.          cl
18880 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
18890 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34       dist = get4
188a0 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
188b0 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
188c0 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29      if( dist<0 )
188d0 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20   dist = -dist;. 
188e0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
188f0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
18900 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
18910 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
18920 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
18930 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  by;.            
18940 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20  if( d2<0 ) d2 = 
18950 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -d2;.           
18960 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
18980 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
18990 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
189a0 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
189b0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
189c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
189d0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
189e0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
189f0 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
18a00 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
18a10 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
18a20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
18a30 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d  hList || iPage==
18a40 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
18a50 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
18a60 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ge;.          if
18a70 28 20 2a 70 50 67 6e 6f 3e 73 71 6c 69 74 65 33  ( *pPgno>sqlite3
18a80 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
18a90 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18ab0 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65  ree page off the
18ac0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
18ad0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
18ae0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18af0 52 52 55 50 54 3b 20 2f 2a 20 62 6b 70 74 2d 43  RRUPT; /* bkpt-C
18b00 4f 52 52 55 50 54 20 2a 2f 0a 20 20 20 20 20 20  ORRUPT */.      
18b10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18b20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
18b30 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
18b40 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
18b50 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
18b60 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
18b70 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
18b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b90 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
18ba0 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
18bb0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
18bc0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
18bd0 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
18be0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
18bf0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
18c00 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
18c10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
18c20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
18c30 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
18c40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
18c50 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 2a  = getPage(pBt, *
18c60 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 29 3b 0a  pPgno, ppPage);.
18c70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
18c80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18c90 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
18ca0 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c  e3pager_dont_rol
18cb0 6c 62 61 63 6b 28 28 2a 70 70 50 61 67 65 29 2d  lback((*ppPage)-
18cc0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >aData);.       
18cd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18ce0 33 70 61 67 65 72 5f 77 72 69 74 65 28 28 2a 70  3pager_write((*p
18cf0 70 50 61 67 65 29 2d 3e 61 44 61 74 61 29 3b 0a  pPage)->aData);.
18d00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
18d10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
18d30 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
18d40 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
18d50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
18d60 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
18d70 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
18d80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
18d90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
18da0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 7d 77  evTrunk);.    }w
18db0 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
18dc0 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   );.    releaseP
18dd0 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d  age(pTrunk);.  }
18de0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
18df0 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
18e00 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
18e10 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   so create a new
18e20 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20   page at the.   
18e30 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66   ** end of the f
18e40 69 6c 65 20 2a 2f 0a 20 20 20 20 2a 70 50 67 6e  ile */.    *pPgn
18e50 6f 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  o = sqlite3pager
18e60 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  _pagecount(pBt->
18e70 70 50 61 67 65 72 29 20 2b 20 31 3b 0a 0a 23 69  pPager) + 1;..#i
18e80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18e90 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
18ea0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
18eb0 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
18ec0 53 50 41 47 45 28 70 42 74 2d 3e 75 73 61 62 6c  SPAGE(pBt->usabl
18ed0 65 53 69 7a 65 2c 20 2a 70 50 67 6e 6f 29 20 29  eSize, *pPgno) )
18ee0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
18ef0 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
18f00 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
18f10 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
18f20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
18f30 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
18f40 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
18f50 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
18f60 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
18f70 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
18f80 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
18f90 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
18fa0 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
18fb0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
18fc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52 41      */.      TRA
18fd0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
18fe0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
18ff0 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
19000 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f  page)\n", *pPgno
19010 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
19020 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
19030 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
19040 20 29 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e   );.      (*pPgn
19050 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  o)++;.    }.#end
19060 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
19070 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
19080 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
19090 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  ;.    rc = getPa
190a0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
190b0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  ppPage);.    if(
190c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
190d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
190e0 33 70 61 67 65 72 5f 77 72 69 74 65 28 28 2a 70  3pager_write((*p
190f0 70 50 61 67 65 29 2d 3e 61 44 61 74 61 29 3b 0a  pPage)->aData);.
19100 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
19120 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
19130 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
19140 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
19150 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
19160 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
19170 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
19180 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
19190 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
191a0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
191b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
191c0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
191d0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
191e0 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
191f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
19200 72 65 66 28 29 20 69 73 20 4e 4f 54 20 63 61 6c  ref() is NOT cal
19210 6c 65 64 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  led for pPage..*
19220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
19230 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
19240 50 61 67 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Page){.  Btree *
19250 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
19260 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
19270 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
19280 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20  1;.  int rc, n, 
19290 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65  k;..  /* Prepare
192a0 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66 72   the page for fr
192b0 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72  eeing */.  asser
192c0 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31  t( pPage->pgno>1
192d0 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   );.  pPage->isI
192e0 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  nit = 0;.  relea
192f0 73 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70 50  sePage(pPage->pP
19300 61 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d  arent);.  pPage-
19310 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20  >pParent = 0;.. 
19320 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
19330 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
19340 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
19350 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
19360 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 31 2d  er_write(pPage1-
19370 3e 61 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72  >aData);.  if( r
19380 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
19390 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
193a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
193b0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
193c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
193d0 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 6e 64 65 66  , n+1);..#ifndef
193e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
193f0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20  OVACUUM.  /* If 
19400 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
19410 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
19420 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
19430 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
19440 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
19450 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
19460 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
19470 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
19480 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
19490 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
194a0 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  t, pPage->pgno, 
194b0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
194c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
194d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
194e0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
194f0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
19500 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
19510 66 72 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 20  free page */.   
19520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
19530 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 2d 3e  er_write(pPage->
19540 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
19550 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
19560 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
19570 2d 3e 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a  ->aData, 0, 8);.
19580 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
19590 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
195a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
195b0 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
195c0 50 41 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e  PAGE: %d first\n
195d0 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  ", pPage->pgno))
195e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
195f0 2a 20 4f 74 68 65 72 20 66 72 65 65 20 70 61 67  * Other free pag
19600 65 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  es already exist
19610 2e 20 20 52 65 74 72 69 76 65 20 74 68 65 20 66  .  Retrive the f
19620 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  irst trunk page.
19630 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72      ** of the fr
19640 65 65 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20  eelist and find 
19650 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61  out how many lea
19660 76 65 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20  ves it has. */. 
19670 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75     MemPage *pTru
19680 6e 6b 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  nk;.    rc = get
19690 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
196a0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
196b0 61 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b 29  a[32]), &pTrunk)
196c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
196d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20  eturn rc;.    k 
196e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
196f0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
19700 20 20 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75     if( k>=pBt->u
19710 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
19720 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
19730 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20  trunk is full.  
19740 54 75 72 6e 20 74 68 65 20 70 61 67 65 20 62 65  Turn the page be
19750 69 6e 67 20 66 72 65 65 64 20 69 6e 74 6f 20 61  ing freed into a
19760 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 74 72   new.      ** tr
19770 75 6e 6b 20 70 61 67 65 20 77 69 74 68 20 6e 6f  unk page with no
19780 20 6c 65 61 76 65 73 2e 20 2a 2f 0a 20 20 20 20   leaves. */.    
19790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
197a0 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 2d  ger_write(pPage-
197b0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69  >aData);.      i
197c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
197d0 63 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  c;.      put4byt
197e0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
197f0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20  pTrunk->pgno);. 
19800 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
19810 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
19820 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
19830 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
19840 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67  a[32], pPage->pg
19850 6e 6f 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  no);.      TRACE
19860 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
19870 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
19880 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
19890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
198a0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75  Page->pgno, pTru
198b0 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
198c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
198d0 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20 66 72  Add the newly fr
198e0 65 65 64 20 70 61 67 65 20 61 73 20 61 20 6c 65  eed page as a le
198f0 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  af on the curren
19900 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  t trunk */.     
19910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
19920 65 72 5f 77 72 69 74 65 28 70 54 72 75 6e 6b 2d  er_write(pTrunk-
19930 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69  >aData);.      i
19940 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
19950 63 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  c;.      put4byt
19960 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
19970 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20  [4], k+1);.     
19980 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
19990 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c  k->aData[8+k*4],
199a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
199b0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
199c0 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 70 42 74  r_dont_write(pBt
199d0 2d 3e 70 50 61 67 65 72 2c 20 70 50 61 67 65 2d  ->pPager, pPage-
199e0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 54 52  >pgno);.      TR
199f0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
19a00 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
19a10 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
19a20 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
19a30 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20  >pgno));.    }. 
19a40 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
19a50 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65  Trunk);.  }.  re
19a60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19a70 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
19a80 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
19a90 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
19aa0 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  ven Cell..*/.sta
19ab0 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
19ac0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
19ad0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
19ae0 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 72 65 65  *pCell){.  Btree
19af0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
19b00 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  Bt;.  CellInfo i
19b10 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  nfo;.  Pgno ovfl
19b20 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
19b30 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28  .  parseCellPtr(
19b40 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
19b50 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
19b60 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b  .iOverflow==0 ){
19b70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19b80 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76  TE_OK;  /* No ov
19b90 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65  erflow pages. Re
19ba0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
19bb0 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  ng anything */. 
19bc0 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20   }.  ovflPgno = 
19bd0 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
19be0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
19bf0 3b 0a 20 20 77 68 69 6c 65 28 20 6f 76 66 6c 50  ;.  while( ovflP
19c00 67 6e 6f 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65  gno!=0 ){.    Me
19c10 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20 20  mPage *pOvfl;.  
19c20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3e 73    if( ovflPgno>s
19c30 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
19c40 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
19c50 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  r) ){.      retu
19c60 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
19c70 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  T;.    }.    rc 
19c80 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 6f  = getPage(pBt, o
19c90 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 29  vflPgno, &pOvfl)
19ca0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
19cb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
19cc0 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
19cd0 65 28 70 4f 76 66 6c 2d 3e 61 44 61 74 61 29 3b  e(pOvfl->aData);
19ce0 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
19cf0 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73  ge(pOvfl);.    s
19d00 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
19d10 66 28 70 4f 76 66 6c 2d 3e 61 44 61 74 61 29 3b  f(pOvfl->aData);
19d20 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
19d30 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
19d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
19d60 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
19d70 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
19d80 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
19d90 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
19da0 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
19db0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
19dc0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
19dd0 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
19de0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
19df0 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
19e00 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
19e10 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
19e20 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
19e30 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
19e40 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
19e50 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
19e60 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
19e70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
19e80 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
19e90 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
19ea0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
19eb0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
19ec0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
19ed0 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
19ee0 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
19ef0 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
19f00 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
19f10 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
19f20 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
19f30 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
19f40 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
19f50 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
19f60 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
19f70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f90 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
19fa0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
19fb0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
19fc0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
19fd0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
19fe0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
19ff0 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
1a000 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
1a010 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
1a020 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
1a030 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
1a040 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
1a050 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  a */.  int *pnSi
1a060 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
1a070 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
1a080 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
1a090 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
1a0a0 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
1a0b0 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
1a0c0 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73  , n, rc;.  int s
1a0d0 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50  paceLeft;.  MemP
1a0e0 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
1a0f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
1a100 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73  lease = 0;.  uns
1a110 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
1a120 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
1a130 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
1a140 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 50   Btree *pBt = pP
1a150 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
1a160 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20   pgnoOvfl = 0;. 
1a170 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20   int nHeader;.  
1a180 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
1a190 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
1a1a0 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
1a1b0 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  eader = 0;.  if(
1a1c0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1a1d0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
1a1e0 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  4;.  }.  if( pPa
1a1f0 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
1a200 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
1a210 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
1a220 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 29 3b  Header], nData);
1a230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44  .  }else{.    nD
1a240 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ata = 0;.  }.  n
1a250 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
1a260 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
1a270 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
1a280 79 29 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50  y);.  parseCellP
1a290 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
1a2a0 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72   &info);.  asser
1a2b0 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d  t( info.nHeader=
1a2c0 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73  =nHeader );.  as
1a2d0 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d  sert( info.nKey=
1a2e0 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  =nKey );.  asser
1a2f0 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e  t( info.nData==n
1a300 44 61 74 61 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  Data );.  .  /* 
1a310 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
1a320 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61  oad */.  nPayloa
1a330 64 20 3d 20 6e 44 61 74 61 3b 0a 20 20 69 66 28  d = nData;.  if(
1a340 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1a350 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
1a360 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
1a370 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
1a380 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1a390 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b    nPayload += nK
1a3a0 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
1a3b0 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
1a3c0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
1a3d0 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
1a3e0 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
1a3f0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
1a400 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
1a410 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
1a420 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
1a430 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
1a440 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
1a450 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
1a460 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
1a470 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a480 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1a490 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
1a4a0 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
1a4b0 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
1a4c0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
1a4d0 79 20 70 61 67 65 20 2a 2f 0a 23 65 6e 64 69 66  y page */.#endif
1a4e0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
1a4f0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 26 70  catePage(pBt, &p
1a500 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
1a510 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23   pgnoOvfl, 0);.#
1a520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a530 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1a540 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
1a550 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
1a560 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
1a570 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
1a580 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
1a590 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
1a5a0 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
1a5b0 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
1a5c0 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
1a5d0 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
1a5e0 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
1a5f0 20 54 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   The entry for t
1a600 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
1a610 77 20 70 61 67 65 20 77 69 6c 6c 20 62 65 0a 20  w page will be. 
1a620 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 6c 61       ** added la
1a630 74 65 72 2c 20 62 79 20 74 68 65 20 69 6e 73 65  ter, by the inse
1a640 72 74 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65  rtCell() routine
1a650 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1a660 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1a670 63 75 75 6d 20 26 26 20 70 67 6e 6f 50 74 72 6d  cuum && pgnoPtrm
1a680 61 70 21 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c  ap!=0 && rc==SQL
1a690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a6a0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
1a6b0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
1a6c0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1a6d0 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20  , pgnoPtrmap);. 
1a6e0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1a6f0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1a700 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1a710 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
1a720 20 20 20 20 20 20 20 2f 2a 20 63 6c 65 61 72 43         /* clearC
1a730 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
1a740 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ); */.        re
1a750 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1a760 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1a770 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
1a780 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
1a790 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
1a7a0 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
1a7b0 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
1a7c0 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
1a7d0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
1a7e0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
1a7f0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
1a800 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
1a810 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
1a820 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
1a830 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
1a840 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
1a850 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
1a860 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
1a870 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69  spaceLeft;.    i
1a880 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
1a890 6e 53 72 63 3b 0a 20 20 20 20 6d 65 6d 63 70 79  nSrc;.    memcpy
1a8a0 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
1a8b0 20 6e 29 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61   n);.    nPayloa
1a8c0 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
1a8d0 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
1a8e0 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
1a8f0 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
1a900 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
1a910 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
1a920 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
1a930 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
1a940 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
1a950 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
1a960 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
1a970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
1a990 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 50 61   the MemPage.pPa
1a9a0 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 6e 20  rent pointer on 
1a9b0 74 68 65 20 70 61 67 65 20 77 68 6f 73 65 20 6e  the page whose n
1a9c0 75 6d 62 65 72 20 69 73 0a 2a 2a 20 67 69 76 65  umber is.** give
1a9d0 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  n in the second 
1a9e0 61 72 67 75 6d 65 6e 74 20 73 6f 20 74 68 61 74  argument so that
1a9f0 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74   MemPage.pParent
1aa00 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 70 6f   holds the.** po
1aa10 69 6e 74 65 72 20 69 6e 20 74 68 65 20 74 68 69  inter in the thi
1aa20 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  rd argument..*/.
1aa30 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 61 72  static int repar
1aa40 65 6e 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  entPage(Btree *p
1aa50 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d  Bt, Pgno pgno, M
1aa60 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 72 65  emPage *pNewPare
1aa70 6e 74 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  nt, int idx){.  
1aa80 4d 65 6d 50 61 67 65 20 2a 70 54 68 69 73 3b 0a  MemPage *pThis;.
1aa90 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1aaa0 2a 61 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70  *aData;..  if( p
1aab0 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  gno==0 ) return 
1aac0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
1aad0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 72  ert( pBt->pPager
1aae0 21 3d 30 20 29 3b 0a 20 20 61 44 61 74 61 20 3d  !=0 );.  aData =
1aaf0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
1ab00 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72  okup(pBt->pPager
1ab10 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 61  , pgno);.  if( a
1ab20 44 61 74 61 20 29 7b 0a 20 20 20 20 70 54 68 69  Data ){.    pThi
1ab30 73 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61  s = (MemPage*)&a
1ab40 44 61 74 61 5b 70 42 74 2d 3e 70 73 41 6c 69 67  Data[pBt->psAlig
1ab50 6e 65 64 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  ned];.    assert
1ab60 28 20 70 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d  ( pThis->aData==
1ab70 61 44 61 74 61 20 29 3b 0a 20 20 20 20 69 66 28  aData );.    if(
1ab80 20 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29   pThis->isInit )
1ab90 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69  {.      if( pThi
1aba0 73 2d 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77  s->pParent!=pNew
1abb0 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
1abc0 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61    if( pThis->pPa
1abd0 72 65 6e 74 20 29 20 73 71 6c 69 74 65 33 70 61  rent ) sqlite3pa
1abe0 67 65 72 5f 75 6e 72 65 66 28 70 54 68 69 73 2d  ger_unref(pThis-
1abf0 3e 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29  >pParent->aData)
1ac00 3b 0a 20 20 20 20 20 20 20 20 70 54 68 69 73 2d  ;.        pThis-
1ac10 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 50  >pParent = pNewP
1ac20 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 69  arent;.        i
1ac30 66 28 20 70 4e 65 77 50 61 72 65 6e 74 20 29 20  f( pNewParent ) 
1ac40 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
1ac50 28 70 4e 65 77 50 61 72 65 6e 74 2d 3e 61 44 61  (pNewParent->aDa
1ac60 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
1ac70 20 20 20 70 54 68 69 73 2d 3e 69 64 78 50 61 72     pThis->idxPar
1ac80 65 6e 74 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d  ent = idx;.    }
1ac90 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
1aca0 72 5f 75 6e 72 65 66 28 61 44 61 74 61 29 3b 0a  r_unref(aData);.
1acb0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1acc0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1acd0 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  UUM.  if( pBt->a
1ace0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1acf0 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
1ad00 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52  t(pBt, pgno, PTR
1ad10 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50  MAP_BTREE, pNewP
1ad20 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
1ad30 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1ad40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ad50 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
1ad60 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74  he pParent point
1ad70 65 72 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72  er of all childr
1ad80 65 6e 20 6f 66 20 70 50 61 67 65 20 74 6f 20 70  en of pPage to p
1ad90 6f 69 6e 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  oint back.** to 
1ada0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  pPage..**.** In 
1adb0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72  other words, for
1adc0 20 65 76 65 72 79 20 63 68 69 6c 64 20 6f 66 20   every child of 
1add0 70 50 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65  pPage, invoke re
1ade0 70 61 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20  parentPage().** 
1adf0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
1ae00 74 20 65 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f  t each child kno
1ae10 77 73 20 74 68 61 74 20 70 50 61 67 65 20 69 73  ws that pPage is
1ae20 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a   its parent..**.
1ae30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ae40 67 65 74 73 20 63 61 6c 6c 65 64 20 61 66 74 65  gets called afte
1ae50 72 20 79 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f  r you memcpy() o
1ae60 6e 65 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20  ne page into.** 
1ae70 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74  another..*/.stat
1ae80 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43  ic int reparentC
1ae90 68 69 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67  hildPages(MemPag
1aea0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
1aeb0 20 69 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74   i;.  Btree *pBt
1aec0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1aed0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1aee0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  _OK;..  if( pPag
1aef0 65 2d 3e 6c 65 61 66 20 29 20 72 65 74 75 72 6e  e->leaf ) return
1af00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66   SQLITE_OK;..  f
1af10 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
1af20 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
1af30 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1af40 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1af50 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1af60 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1af70 72 63 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67  rc = reparentPag
1af80 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
1af90 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20 69  pCell), pPage, i
1afa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1afb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1afc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1afd0 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
1afe0 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  leaf ){.    rc =
1aff0 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70 42   reparentPage(pB
1b000 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t, get4byte(&pPa
1b010 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1b020 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 2c 20  >hdrOffset+8]), 
1b030 0a 20 20 20 20 20 20 20 70 50 61 67 65 2c 20 69  .       pPage, i
1b040 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64  );.    pPage->id
1b050 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 7d 0a  xShift = 0;.  }.
1b060 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b070 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
1b080 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
1b090 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
1b0a0 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
1b0b0 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
1b0c0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
1b0d0 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
1b0e0 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
1b0f0 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
1b100 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
1b110 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
1b120 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
1b130 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1b140 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
1b150 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
1b160 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
1b170 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
1b180 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
1b190 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1b1a0 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
1b1b0 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
1b1c0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
1b1d0 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
1b1e0 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  z){.  int i;    
1b1f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1b200 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
1b210 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
1b220 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
1b230 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
1b240 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
1b250 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
1b260 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
1b270 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
1b280 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1b290 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
1b2a0 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
1b2b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
1b2c0 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
1b2d0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
1b2e0 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
1b2f0 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
1b300 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1b310 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65  te3pager_iswrite
1b320 61 62 6c 65 28 70 50 61 67 65 2d 3e 61 44 61 74  able(pPage->aDat
1b330 61 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  a) );.  data = p
1b340 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70  Page->aData;.  p
1b350 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
1b360 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
1b370 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
1b380 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61  t2byte(ptr);.  a
1b390 73 73 65 72 74 28 20 70 63 3e 31 30 20 26 26 20  ssert( pc>10 && 
1b3a0 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42  pc+sz<=pPage->pB
1b3b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
1b3c0 0a 20 20 66 72 65 65 53 70 61 63 65 28 70 50 61  .  freeSpace(pPa
1b3d0 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66  ge, pc, sz);.  f
1b3e0 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50  or(i=idx+1; i<pP
1b3f0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c  age->nCell; i++,
1b400 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74   ptr+=2){.    pt
1b410 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20  r[0] = ptr[2];. 
1b420 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
1b430 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  3];.  }.  pPage-
1b440 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32  >nCell--;.  put2
1b450 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
1b460 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
1b470 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
1b480 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
1b490 20 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78   2;.  pPage->idx
1b4a0 53 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Shift = 1;.}../*
1b4b0 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
1b4c0 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61   cell on pPage a
1b4d0 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22  t cell index "i"
1b4e0 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20  .  pCell points 
1b4f0 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  to the.** conten
1b500 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  t of the cell..*
1b510 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
1b520 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69   content will fi
1b530 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74  t on the page, t
1b540 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65  hen put it there
1b550 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c  .  If it.** will
1b560 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d   not fit, then m
1b570 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
1b580 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
1b590 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20  nto pTemp if.** 
1b5a0 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c  pTemp is not nul
1b5b0 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f  l.  Regardless o
1b5c0 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74  f pTemp, allocat
1b5d0 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a  e a new entry.**
1b5e0 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c   in pPage->aOvfl
1b5f0 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70  [] and make it p
1b600 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  oint to the cell
1b610 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72   content (either
1b620 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20  .** in pTemp or 
1b630 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65  the original pCe
1b640 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63  ll) and also rec
1b650 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a  ord its index. .
1b660 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** Allocating a 
1b670 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61  new entry in pPa
1b680 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c  ge->aCell[] impl
1b690 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61  ies that .** pPa
1b6a0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ge->nOverflow is
1b6b0 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a   incremented..**
1b6c0 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20  .** If nSkip is 
1b6d0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64  non-zero, then d
1b6e0 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66  o not copy the f
1b6f0 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73  irst nSkip bytes
1b700 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e   of the.** cell.
1b710 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
1b720 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20   overwrite them 
1b730 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
1b740 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a  ion returns. If.
1b750 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  ** nSkip is non-
1b760 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c  zero, then pCell
1b770 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74   may not point t
1b780 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d  o an invalid mem
1b790 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a  ory location .**
1b7a0 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69   (but pCell+nSki
1b7b0 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  p is always vali
1b7c0 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d)..*/.static in
1b7d0 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20  t insertCell(.  
1b7e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1b7f0 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77    /* Page into w
1b800 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79  hich we are copy
1b810 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ing */.  int i, 
1b820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1b830 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74  w cell becomes t
1b840 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20  he i-th cell of 
1b850 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  the page */.  u8
1b860 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
1b870 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
1b880 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20  e new cell */.  
1b890 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20  int sz,         
1b8a0 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f    /* Bytes of co
1b8b0 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a  ntent in pCell *
1b8c0 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20  /.  u8 *pTemp,  
1b8d0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
1b8e0 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20  orage space for 
1b8f0 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64  pCell, if needed
1b900 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20   */.  u8 nSkip  
1b910 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1b920 74 20 77 72 69 74 65 20 74 68 65 20 66 69 72 73  t write the firs
1b930 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
1b940 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a   the cell */.){.
1b950 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
1b960 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
1b970 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
1b980 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
1b990 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
1b9a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1b9b0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
1b9c0 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f   top;          /
1b9d0 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
1b9e0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
1b9f0 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a  cell in data[] *
1ba00 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20  /.  int end;    
1ba10 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
1ba20 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73  yte past the las
1ba30 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
1ba40 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
1ba50 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20  t ins;          
1ba60 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61  /* Index in data
1ba70 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c  [] where new cel
1ba80 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73  l pointer is ins
1ba90 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68  erted */.  int h
1baa0 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dr;          /* 
1bab0 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61  Offset into data
1bac0 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  [] of the page h
1bad0 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  eader */.  int c
1bae0 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20  ellOffset;   /* 
1baf0 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74  Address of first
1bb00 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
1bb10 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
1bb20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
1bb30 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
1bb40 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
1bb50 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
1bb60 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66         /* Used f
1bb70 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d  or moving inform
1bb80 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20  ation around in 
1bb90 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73  data[] */..  ass
1bba0 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
1bbb0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
1bbc0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
1bbd0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
1bbe0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
1bbf0 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73  , pCell) );.  as
1bc00 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67  sert( sqlite3pag
1bc10 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70  er_iswriteable(p
1bc20 50 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a  Page->aData) );.
1bc30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
1bc40 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
1bc50 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
1bc60 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
1bc70 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
1bc80 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b  mp+nSkip, pCell+
1bc90 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
1bca0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
1bcb0 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
1bcc0 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
1bcd0 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
1bce0 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50  ert( j<sizeof(pP
1bcf0 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
1bd00 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
1bd10 30 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  0]) );.    pPage
1bd20 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
1bd30 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
1bd40 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
1bd50 78 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65  x = i;.    pPage
1bd60 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ->nFree = 0;.  }
1bd70 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d  else{.    data =
1bd80 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
1bd90 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
1bda0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74  hdrOffset;.    t
1bdb0 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
1bdc0 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
1bdd0 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
1bde0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
1bdf0 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
1be00 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
1be10 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20  >nCell + 2;.    
1be20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
1be30 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20   + 2*i;.    if( 
1be40 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29  end > top - sz )
1be50 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
1be60 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
1be70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
1be80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1be90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1bea0 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
1beb0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
1bec0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
1bed0 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29  nd + sz <= top )
1bee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20  ;.    }.    idx 
1bef0 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
1bf00 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20  pPage, sz);.    
1bf10 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b  assert( idx>0 );
1bf20 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64  .    assert( end
1bf30 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64 61   <= get2byte(&da
1bf40 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
1bf50 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
1bf60 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
1bf70 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d  ee -= 2;.    mem
1bf80 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
1bf90 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
1bfa0 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
1bfb0 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70    for(j=end-2, p
1bfc0 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69  tr=&data[j]; j>i
1bfd0 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32  ns; j-=2, ptr-=2
1bfe0 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20  ){.      ptr[0] 
1bff0 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20  = ptr[-2];.     
1c000 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31   ptr[1] = ptr[-1
1c010 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  ];.    }.    put
1c020 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
1c030 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
1c040 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
1c050 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
1c060 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78  ;.    pPage->idx
1c070 53 68 69 66 74 20 3d 20 31 3b 0a 20 20 20 20 70  Shift = 1;.    p
1c080 61 67 65 49 6e 74 65 67 72 69 74 79 28 70 50 61  ageIntegrity(pPa
1c090 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge);.#ifndef SQL
1c0a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1c0b0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
1c0c0 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
1c0d0 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
1c0e0 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
1c0f0 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
1c100 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1c110 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
1c120 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
1c130 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
1c140 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
1c150 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
1c160 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65       */.      Ce
1c170 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1c180 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28     parseCellPtr(
1c190 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
1c1a0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
1c1b0 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
1c1c0 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
1c1d0 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c  o.nKey))>info.nL
1c1e0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
1c1f0 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
1c200 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
1c210 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
1c220 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  ;.        int rc
1c230 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61   = ptrmapPut(pPa
1c240 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66  ge->pBt, pgnoOvf
1c250 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
1c260 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
1c270 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1c280 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1c290 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1c2a0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
1c2b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1c2c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1c2d0 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63   Add a list of c
1c2e0 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20  ells to a page. 
1c2f0 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64   The page should
1c300 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   be initially em
1c310 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  pty..** The cell
1c320 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
1c330 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70   to fit on the p
1c340 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
1c350 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65  oid assemblePage
1c360 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
1c370 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge,   /* The pag
1c380 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69  e to be assembli
1c390 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ed */.  int nCel
1c3a0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  l,        /* The
1c3b0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
1c3c0 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20   to add to this 
1c3d0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
1c3e0 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50  pCell,      /* P
1c3f0 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20  ointers to cell 
1c400 62 6f 64 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  bodies */.  int 
1c410 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a  *aSize        /*
1c420 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65   Sizes of the ce
1c430 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
1c440 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
1c450 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1c460 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65  .  int totalSize
1c470 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69  ;    /* Total si
1c480 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
1c490 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
1c4a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1c4b0 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
1c4c0 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b  /.  int cellptr;
1c4d0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1c4e0 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
1c4f0 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
1c500 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
1c510 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
1c520 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
1c530 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
1c540 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65   /* Data for the
1c550 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
1c560 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
1c570 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74 6f 74  flow==0 );.  tot
1c580 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f  alSize = 0;.  fo
1c590 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1c5a0 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53  i++){.    totalS
1c5b0 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ize += aSize[i];
1c5c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74  .  }.  assert( t
1c5d0 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c  otalSize+2*nCell
1c5e0 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  <=pPage->nFree )
1c5f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1c600 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
1c610 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65   cellptr = pPage
1c620 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
1c630 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
1c640 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
1c650 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
1c660 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
1c670 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
1c680 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c    cellbody = all
1c690 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
1c6a0 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20  , totalSize);.  
1c6b0 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79  assert( cellbody
1c6c0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1c6d0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20  pPage->nFree >= 
1c6e0 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 50 61  2*nCell );.  pPa
1c6f0 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e  ge->nFree -= 2*n
1c700 43 65 6c 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Cell;.  for(i=0;
1c710 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1c720 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
1c730 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c  ta[cellptr], cel
1c740 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63  lbody);.    memc
1c750 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
1c760 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61  y], apCell[i], a
1c770 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 63 65  Size[i]);.    ce
1c780 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
1c790 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a  cellbody += aSiz
1c7a0 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  e[i];.  }.  asse
1c7b0 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50  rt( cellbody==pP
1c7c0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
1c7d0 53 69 7a 65 20 29 3b 0a 20 20 70 50 61 67 65 2d  Size );.  pPage-
1c7e0 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a  >nCell = nCell;.
1c7f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
1c800 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72  lowing parameter
1c810 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  s determine how 
1c820 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61  many adjacent pa
1c830 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64  ges get involved
1c840 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69  .** in a balanci
1c850 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
1c860 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
1c870 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
1c880 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f  either side.** o
1c890 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
1c8a0 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
1c8b0 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65  he balancing ope
1c8c0 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74  ration.  NB is t
1c8d0 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62  he.** total numb
1c8e0 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
1c8f0 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e   participate, in
1c900 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67  cluding the targ
1c910 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e  et page and.** N
1c920 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  N neighbors on e
1c930 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a  ither side..**.*
1c940 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61  * The minimum va
1c950 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28  lue of NN is 1 (
1c960 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63  of course).  Inc
1c970 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65  reasing NN above
1c980 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33   1.** (to 2 or 3
1c990 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74  ) gives a modest
1c9a0 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20   improvement in 
1c9b0 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54  SELECT and DELET
1c9c0 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  E performance.**
1c9d0 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72   in exchange for
1c9e0 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64   a larger degrad
1c9f0 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20  ation in INSERT 
1ca00 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f  and UPDATE perfo
1ca10 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76  rmance..** The v
1ca20 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61  alue of NN appea
1ca30 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62  rs to give the b
1ca40 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72  est results over
1ca50 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  all..*/.#define 
1ca60 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20  NN 1            
1ca70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
1ca80 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
1ca90 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
1caa0 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e  */.#define NB (N
1cab0 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54  N*2+1)      /* T
1cac0 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c  otal pages invol
1cad0 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ved in the balan
1cae0 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  ce */../* Forwar
1caf0 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
1cb00 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
1cb10 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69 6e 74 29  e(MemPage*, int)
1cb20 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1cb30 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
1cb40 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  NCE./*.** This v
1cb50 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63  ersion of balanc
1cb60 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20  e() handles the 
1cb70 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63  common special c
1cb80 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e  ase where.** a n
1cb90 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e  ew entry is bein
1cba0 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68  g inserted on th
1cbb0 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d  e extreme right-
1cbc0 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  end of the.** tr
1cbd0 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee, in other wor
1cbe0 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77  ds, when the new
1cbf0 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f   entry will beco
1cc00 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a  me the largest.*
1cc10 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
1cc20 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  ree..**.** Inste
1cc30 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c  ad of trying bal
1cc40 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
1cc50 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
1cc60 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
1cc70 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
1cc80 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
1cc90 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
1cca0 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
1ccb0 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
1ccc0 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
1ccd0 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
1cce0 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
1ccf0 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
1cd00 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
1cd10 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
1cd20 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
1cd30 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
1cd40 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
1cd50 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
1cd60 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
1cd70 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
1cd80 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
1cd90 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
1cda0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
1cdb0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
1cdc0 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
1cdd0 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
1cde0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
1cdf0 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
1ce00 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
1ce10 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
1ce20 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
1ce30 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
1ce40 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
1ce50 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
1ce60 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
1ce70 61 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50  age, MemPage *pP
1ce80 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  arent){.  int rc
1ce90 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
1cea0 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  w;.  Pgno pgnoNe
1ceb0 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  w;.  u8 *pCell;.
1cec0 20 20 69 6e 74 20 73 7a 43 65 6c 6c 3b 0a 20 20    int szCell;.  
1ced0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1cee0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 50   Btree *pBt = pP
1cef0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  age->pBt;.  int 
1cf00 70 61 72 65 6e 74 49 64 78 20 3d 20 70 50 61 72  parentIdx = pPar
1cf10 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a  ent->nCell;   /*
1cf20 20 70 50 61 72 65 6e 74 20 6e 65 77 20 64 69 76   pParent new div
1cf30 69 64 65 72 20 63 65 6c 6c 20 69 6e 64 65 78 20  ider cell index 
1cf40 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 53  */.  int parentS
1cf50 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1cf60 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1cf70 66 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  f new divider ce
1cf80 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72 65 6e  ll */.  u8 paren
1cf90 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20 20 20  tCell[64];      
1cfa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
1cfb0 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 64  ce for the new d
1cfc0 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a  ivider cell */..
1cfd0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
1cfe0 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74  new page. Insert
1cff0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
1d000 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20  ll from pPage.  
1d010 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e  ** into it. Then
1d020 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72   remove the over
1d030 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70  flow cell from p
1d040 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  Page..  */.  rc 
1d050 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70  = allocatePage(p
1d060 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
1d070 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
1d080 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d090 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1d0a0 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20  ;.  }.  pCell = 
1d0b0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
1d0c0 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20  pCell;.  szCell 
1d0d0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
1d0e0 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a  age, pCell);.  z
1d0f0 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50  eroPage(pNew, pP
1d100 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  age->aData[0]);.
1d110 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
1d120 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
1d130 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  &szCell);.  pPag
1d140 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
1d150 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1d160 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  parent of the ne
1d170 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
1d180 67 65 20 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a  ge to pParent. *
1d190 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e  /.  pNew->pParen
1d1a0 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 73  t = pParent;.  s
1d1b0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28  qlite3pager_ref(
1d1c0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b  pParent->aData);
1d1d0 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
1d1e0 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69  currently the ri
1d1f0 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61  ght-child of pPa
1d200 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69  rent. Change thi
1d210 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74  s.  ** so that t
1d220 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69  he right-child i
1d230 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61  s the new page a
1d240 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20 61  llocated above a
1d250 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65 20 69 73  nd.  ** pPage is
1d260 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67   the next-to-rig
1d270 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2f 0a  ht child. .  */.
1d280 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1d290 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 70 61  >nCell>0 );.  pa
1d2a0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
1d2b0 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
1d2c0 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  , pPage->nCell-1
1d2d0 29 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63 20  ), &info);.  rc 
1d2e0 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
1d2f0 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c  rent, parentCell
1d300 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20  , 0, info.nKey, 
1d310 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a  0, 0, &parentSiz
1d320 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
1d330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1d340 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1d350 61 73 73 65 72 74 28 20 70 61 72 65 6e 74 53 69  assert( parentSi
1d360 7a 65 3c 36 34 20 29 3b 0a 20 20 72 63 20 3d 20  ze<64 );.  rc = 
1d370 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
1d380 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20 70  nt, parentIdx, p
1d390 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e  arentCell, paren
1d3a0 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20  tSize, 0, 4);.  
1d3b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d3c0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d3d0 72 63 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  rc;.  }.  put4by
1d3e0 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
1d3f0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61 72 65  ell(pParent,pare
1d400 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d 3e 70  ntIdx), pPage->p
1d410 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62 79 74 65  gno);.  put4byte
1d420 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
1d430 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
1d440 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
1d450 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1d460 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1d470 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  M.  /* If this i
1d480 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
1d490 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
1d4a0 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
1d4b0 70 0a 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72  p.  ** with entr
1d4c0 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
1d4d0 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
1d4e0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
1d4f0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
1d500 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
1d510 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
1d520 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1d530 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
1d540 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
1d550 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50   pgnoNew, PTRMAP
1d560 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
1d570 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  >pgno);.    if( 
1d580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d590 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1d5a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1d5b0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
1d5c0 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  New, 0);.    if(
1d5d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d5e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1d5f0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  c;.    }.  }.#en
1d600 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  dif..  /* Releas
1d610 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
1d620 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  to the new page 
1d630 61 6e 64 20 62 61 6c 61 6e 63 65 20 74 68 65 20  and balance the 
1d640 70 61 72 65 6e 74 20 70 61 67 65 2c 0a 20 20 2a  parent page,.  *
1d650 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 64 69  * in case the di
1d660 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65 72  vider cell inser
1d670 74 65 64 20 63 61 75 73 65 64 20 69 74 20 74 6f  ted caused it to
1d680 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
1d690 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
1d6a0 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 72 65  Page(pNew);.  re
1d6b0 74 75 72 6e 20 62 61 6c 61 6e 63 65 28 70 50 61  turn balance(pPa
1d6c0 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64  rent, 0);.}.#end
1d6d0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1d6e0 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
1d6f0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49 53 41  /../*.** The ISA
1d700 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 20  UTOVACUUM macro 
1d710 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 62  is used within b
1d720 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
1d730 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a   to determine.**
1d740 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1d750 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
1d760 61 63 75 75 6d 20 6f 72 20 6e 6f 74 2e 20 42 65  acuum or not. Be
1d770 63 61 75 73 65 20 69 74 20 69 73 20 75 73 65 64  cause it is used
1d780 0a 2a 2a 20 77 69 74 68 69 6e 20 61 6e 20 65 78  .** within an ex
1d790 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
1d7a0 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
1d7b0 61 6e 6f 74 68 65 72 20 6d 61 63 72 6f 20 0a 2a  another macro .*
1d7c0 2a 20 28 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52  * (sqliteMallocR
1d7d0 61 77 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  aw), it is not p
1d7e0 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 63  ossible to use c
1d7f0 6f 6e 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 69  onditional compi
1d800 6c 61 74 69 6f 6e 2e 0a 2a 2a 20 53 6f 2c 20 74  lation..** So, t
1d810 68 69 73 20 6d 61 63 72 6f 20 69 73 20 64 65 66  his macro is def
1d820 69 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f  ined instead..*/
1d830 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d840 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1d850 23 64 65 66 69 6e 65 20 49 53 41 55 54 4f 56 41  #define ISAUTOVA
1d860 43 55 55 4d 20 28 70 42 74 2d 3e 61 75 74 6f 56  CUUM (pBt->autoV
1d870 61 63 75 75 6d 29 0a 23 65 6c 73 65 0a 23 64 65  acuum).#else.#de
1d880 66 69 6e 65 20 49 53 41 55 54 4f 56 41 43 55 55  fine ISAUTOVACUU
1d890 4d 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  M 0.#endif../*.*
1d8a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1d8b0 65 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c  edistributes Cel
1d8c0 6c 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20  ls on pPage and 
1d8d0 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69  up to NN*2 sibli
1d8e0 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20  ngs.** of pPage 
1d8f0 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
1d900 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
1d910 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20   same amount of 
1d920 66 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55  free space..** U
1d930 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e  sually NN siblin
1d940 67 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  gs on either sid
1d950 65 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73  e of pPage is us
1d960 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
1d970 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d  ing,.** though m
1d980 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67  ore siblings mig
1d990 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65  ht come from one
1d9a0 20 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69   side if pPage i
1d9b0 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f  s the first.** o
1d9c0 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20  r last child of 
1d9d0 69 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20  its parent.  If 
1d9e0 70 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20  pPage has fewer 
1d9f0 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e  than 2*NN siblin
1da00 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67  gs.** (something
1da10 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20   which can only 
1da20 68 61 70 70 65 6e 20 69 66 20 70 50 61 67 65 20  happen if pPage 
1da30 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
1da40 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20   or a .** child 
1da50 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c  of root) then al
1da60 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c  l available sibl
1da70 69 6e 67 73 20 70 61 72 74 69 63 69 70 61 74 65  ings participate
1da80 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
1da90 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  g..**.** The num
1daa0 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ber of siblings 
1dab0 6f 66 20 70 50 61 67 65 20 6d 69 67 68 74 20 62  of pPage might b
1dac0 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64  e increased or d
1dad0 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20  ecreased by one 
1dae0 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20  or.** two in an 
1daf0 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
1db00 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
1db10 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
1db20 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67  ll. The root pag
1db30 65 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20  e.** is special 
1db40 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  and is allowed t
1db50 6f 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  o be nearly empt
1db60 79 2e 20 49 66 20 70 50 61 67 65 20 69 73 20 0a  y. If pPage is .
1db70 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
1db80 2c 20 74 68 65 6e 20 74 68 65 20 64 65 70 74 68  , then the depth
1db90 20 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69 67   of the tree mig
1dba0 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a  ht be increased.
1dbb0 2a 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ** or decreased 
1dbc0 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73  by one, as neces
1dbd0 73 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68  sary, to keep th
1dbe0 65 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d  e root page from
1dbf0 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75   being.** overfu
1dc00 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79  ll or completely
1dc10 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   empty..**.** No
1dc20 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
1dc30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1dc40 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65  led, some of the
1dc50 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a   Cells on pPage.
1dc60 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
1dc70 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
1dc80 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
1dc90 5d 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70  ].  This can hap
1dca0 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
1dcb0 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
1dcc0 20 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62   Part of the job
1dcd0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
1dce0 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73   is to.** make s
1dcf0 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f  ure all Cells fo
1dd00 72 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61  r pPage once aga
1dd10 69 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d  in fit in pPage-
1dd20 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  >aData[]..**.** 
1dd30 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66  In the course of
1dd40 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73   balancing the s
1dd50 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65  iblings of pPage
1dd60 2c 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  , the parent of 
1dd70 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62  pPage.** might b
1dd80 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
1dd90 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66  r underfull.  If
1dda0 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74   that happens, t
1ddb0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1ddc0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65  .** is called re
1ddd0 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65  cursively on the
1dde0 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   parent..**.** I
1ddf0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
1de00 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
1de10 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65  son, it might le
1de20 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ave the database
1de30 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74  .** in a corrupt
1de40 65 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66  ed state.  So if
1de50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
1de60 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ils, the databas
1de70 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  e should.** be r
1de80 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73  olled back..*/.s
1de90 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
1dea0 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67  e_nonroot(MemPag
1deb0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d  e *pPage){.  Mem
1dec0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20  Page *pParent;  
1ded0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dee0 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65   parent of pPage
1def0 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74   */.  Btree *pBt
1df00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1df10 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
1df20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
1df30 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20  t nCell = 0;    
1df40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1df50 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
1df60 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69   apCell[] */.  i
1df70 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30  nt nMaxCells = 0
1df80 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
1df90 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
1dfa0 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c   apCell, szCell,
1dfb0 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74   aFrom. */.  int
1dfc0 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20   nOld;          
1dfd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1dfe0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1dff0 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74  apOld[] */.  int
1e000 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20   nNew;          
1e010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1e020 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1e030 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74  apNew[] */.  int
1e040 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20 20 20   nDiv;          
1e050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1e060 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
1e070 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74  apDiv[] */.  int
1e080 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20   i, j, k;       
1e090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1e0a0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1e0b0 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20  int idx;        
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e0d0 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65 20 69  Index of pPage i
1e0e0 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
1e0f0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69  [] */.  int nxDi
1e100 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1e110 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76       /* Next div
1e120 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61  ider slot in pPa
1e130 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
1e140 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e160 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
1e170 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  de */.  int leaf
1e180 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20  Correction;     
1e190 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61       /* 4 if pPa
1e1a0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
1e1b0 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74   if not */.  int
1e1c0 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20   leafData;      
1e1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e1e0 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  e if pPage is a 
1e1f0 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41  leaf of a LEAFDA
1e200 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  TA tree */.  int
1e210 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20   usableSpace;   
1e220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
1e230 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f  es in pPage beyo
1e240 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  nd the header */
1e250 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73  .  int pageFlags
1e260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e270 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67  /* Value of pPag
1e280 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20  e->aData[0] */. 
1e290 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20   int subtotal;  
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e2b0 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74   Subtotal of byt
1e2c0 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f  es in cells on o
1e2d0 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ne page */.  int
1e2e0 20 69 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20   iSpace = 0;    
1e2f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1e300 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
1e310 66 20 61 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20  f aSpace[] */.  
1e320 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e  MemPage *apOld[N
1e330 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  B];          /* 
1e340 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
1e350 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  two siblings */.
1e360 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e    Pgno pgnoOld[N
1e370 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  B];            /
1e380 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66  * Page numbers f
1e390 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
1e3a0 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d  apOld[] */.  Mem
1e3b0 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d  Page *apCopy[NB]
1e3c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69  ;         /* Pri
1e3d0 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61  vate copies of a
1e3e0 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a  pOld[] pages */.
1e3f0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77    MemPage *apNew
1e400 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f  [NB+2];        /
1e410 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
1e420 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66  o NB siblings af
1e430 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f  ter balancing */
1e440 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b  .  Pgno pgnoNew[
1e450 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
1e460 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20  /* Page numbers 
1e470 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
1e480 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e   apNew[] */.  in
1e490 74 20 69 64 78 44 69 76 5b 4e 42 5d 3b 20 20 20  t idxDiv[NB];   
1e4a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1e4b0 64 69 63 65 73 20 6f 66 20 64 69 76 69 64 65 72  dices of divider
1e4c0 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
1e4d0 74 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  t */.  u8 *apDiv
1e4e0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
1e4f0 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
1e500 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
1e510 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
1e520 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
1e530 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
1e540 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
1e550 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
1e560 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
1e570 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
1e580 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
1e590 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
1e5a0 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
1e5b0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
1e5c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1e5d0 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
1e5e0 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
1e5f0 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  int *szCell;    
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e610 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
1e620 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
1e630 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f  l[] */.  u8 *aCo
1e640 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
1e650 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
1e660 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  or holding data 
1e670 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20  of apCopy[] */. 
1e680 20 75 38 20 2a 61 53 70 61 63 65 3b 20 20 20 20   u8 *aSpace;    
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e6a0 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 63   Space to hold c
1e6b0 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72  opies of divider
1e6c0 73 20 63 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64  s cells */.#ifnd
1e6d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1e6e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 2a  UTOVACUUM.  u8 *
1e6f0 61 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  aFrom = 0;.#endi
1e700 66 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69  f..  /* .  ** Fi
1e710 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nd the parent pa
1e720 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
1e730 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1e740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1e750 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69  lite3pager_iswri
1e760 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 61 44  teable(pPage->aD
1e770 61 74 61 29 20 29 3b 0a 20 20 70 42 74 20 3d 20  ata) );.  pBt = 
1e780 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50  pPage->pBt;.  pP
1e790 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
1e7a0 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65  Parent;.  sqlite
1e7b0 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1e7c0 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20  rent->aData);.  
1e7d0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20  assert( pParent 
1e7e0 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  );.  TRACE(("BAL
1e7f0 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65  ANCE: begin page
1e800 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c   %d child of %d\
1e810 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
1e820 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29   pParent->pgno))
1e830 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1e840 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
1e850 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20  NCE.  /*.  ** A 
1e860 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  special case:  I
1e870 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20 68 61  f a new entry ha
1e880 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e 73 65  s just been inse
1e890 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a  rted into a.  **
1e8a0 20 74 61 62 6c 65 20 28 74 68 61 74 20 69 73 2c   table (that is,
1e8b0 20 61 20 62 74 72 65 65 20 77 69 74 68 20 69 6e   a btree with in
1e8c0 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64 20 61  teger keys and a
1e8d0 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65 20 6c  ll data at the l
1e8e0 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e 20 74  eaves).  ** an t
1e8f0 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20  he new entry is 
1e900 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
1e910 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
1e920 20 28 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a   (it has the.  *
1e930 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74  * largest key) t
1e940 68 65 6e 20 75 73 65 20 74 68 65 20 73 70 65 63  hen use the spec
1e950 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  ial balance_quic
1e960 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a  k() routine for.
1e970 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20    ** balancing. 
1e980 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
1e990 20 69 73 20 6d 75 63 68 20 66 61 73 74 65 72 20   is much faster 
1e9a0 61 6e 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61  and results in a
1e9b0 20 74 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61   tighter.  ** pa
1e9c0 63 6b 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e  cking of data in
1e9d0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1e9e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
1e9f0 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20  ge->leaf &&.    
1ea00 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
1ea10 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
1ea20 6c 65 61 66 44 61 74 61 20 26 26 0a 20 20 20 20  leafData &&.    
1ea30 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
1ea40 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20 20 20 70  ow==1 &&.      p
1ea50 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  Page->aOvfl[0].i
1ea60 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx==pPage->nCell
1ea70 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
1ea80 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d  >pParent->pgno!=
1ea90 31 20 26 26 0a 20 20 20 20 20 20 67 65 74 34 62  1 &&.      get4b
1eaa0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
1eab0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
1eac0 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67  Offset+8])==pPag
1ead0 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20  e->pgno.  ){.   
1eae0 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a   /*.    ** TODO:
1eaf0 20 43 68 65 63 6b 20 74 68 65 20 73 69 62 6c 69   Check the sibli
1eb00 6e 67 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ngs to the left 
1eb10 6f 66 20 70 50 61 67 65 2e 20 49 74 20 6d 61 79  of pPage. It may
1eb20 20 62 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   be that.    ** 
1eb30 74 68 65 79 20 61 72 65 20 6e 6f 74 20 66 75 6c  they are not ful
1eb40 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67  l and no new pag
1eb50 65 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  e is required.. 
1eb60 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e     */.    return
1eb70 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70   balance_quick(p
1eb80 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a  Page, pParent);.
1eb90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1eba0 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  .  ** Find the c
1ebb0 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e  ell in the paren
1ebc0 74 20 70 61 67 65 20 77 68 6f 73 65 20 6c 65 66  t page whose lef
1ebd0 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 62  t child points b
1ebe0 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67  ack.  ** to pPag
1ebf0 65 2e 20 20 54 68 65 20 22 69 64 78 22 20 76 61  e.  The "idx" va
1ec00 72 69 61 62 6c 65 20 69 73 20 74 68 65 20 69 6e  riable is the in
1ec10 64 65 78 20 6f 66 20 74 68 61 74 20 63 65 6c 6c  dex of that cell
1ec20 2e 20 20 49 66 20 70 50 61 67 65 0a 20 20 2a 2a  .  If pPage.  **
1ec30 20 69 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73   is the rightmos
1ec40 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t child of pPare
1ec50 6e 74 20 74 68 65 6e 20 73 65 74 20 69 64 78 20  nt then set idx 
1ec60 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  to pParent->nCel
1ec70 6c 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  l .  */.  if( pP
1ec80 61 72 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 20  arent->idxShift 
1ec90 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1eca0 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 70 50 61  ;.    pgno = pPa
1ecb0 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73  ge->pgno;.    as
1ecc0 73 65 72 74 28 20 70 67 6e 6f 3d 3d 73 71 6c 69  sert( pgno==sqli
1ecd0 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d  te3pager_pagenum
1ece0 62 65 72 28 70 50 61 67 65 2d 3e 61 44 61 74 61  ber(pPage->aData
1ecf0 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 64 78  ) );.    for(idx
1ed00 3d 30 3b 20 69 64 78 3c 70 50 61 72 65 6e 74 2d  =0; idx<pParent-
1ed10 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a  >nCell; idx++){.
1ed20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
1ed30 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
1ed40 65 6e 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f  ent, idx))==pgno
1ed50 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1ed60 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1ed70 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
1ed80 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a  <pParent->nCell.
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
1eda0 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
1edb0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
1edc0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
1edd0 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65  =pgno );.  }else
1ede0 7b 0a 20 20 20 20 69 64 78 20 3d 20 70 50 61 67  {.    idx = pPag
1edf0 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20  e->idxParent;.  
1ee00 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69  }..  /*.  ** Ini
1ee10 74 69 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65  tialize variable
1ee20 73 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  s so that it wil
1ee30 6c 20 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d  l be safe to jum
1ee40 70 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20  p.  ** directly 
1ee50 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
1ee60 75 70 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74  up at any moment
1ee70 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20  ..  */.  nOld = 
1ee80 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nNew = 0;.  sqli
1ee90 74 65 33 70 61 67 65 72 5f 72 65 66 28 70 50 61  te3pager_ref(pPa
1eea0 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 0a 20  rent->aData);.. 
1eeb0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69   /*.  ** Find si
1eec0 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70  bling pages to p
1eed0 50 61 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c  Page and the cel
1eee0 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68  ls in pParent th
1eef0 61 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74  at divide.  ** t
1ef00 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e  he siblings.  An
1ef10 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
1ef20 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c   to find NN sibl
1ef30 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20  ings on either. 
1ef40 20 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67   ** side of pPag
1ef50 65 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67  e.  More sibling
1ef60 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  s are taken from
1ef70 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76   one side, howev
1ef80 65 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67  er, if.  ** pPag
1ef90 65 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65  e there are fewe
1efa0 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e  r than NN siblin
1efb0 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  gs on the other 
1efc0 73 69 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e  side.  If pParen
1efd0 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72  t.  ** has NB or
1efe0 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20   fewer children 
1eff0 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  then all childre
1f000 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65  n of pParent are
1f010 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e   taken..  */.  n
1f020 78 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b  xDiv = idx - NN;
1f030 0a 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e  .  if( nxDiv + N
1f040 42 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  B > pParent->nCe
1f050 6c 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  ll ){.    nxDiv 
1f060 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  = pParent->nCell
1f070 20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20   - NB + 1;.  }. 
1f080 20 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a   if( nxDiv<0 ){.
1f090 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20      nxDiv = 0;. 
1f0a0 20 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20   }.  nDiv = 0;. 
1f0b0 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69   for(i=0, k=nxDi
1f0c0 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b  v; i<NB; i++, k+
1f0d0 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50  +){.    if( k<pP
1f0e0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
1f0f0 20 20 20 20 20 20 69 64 78 44 69 76 5b 69 5d 20        idxDiv[i] 
1f100 3d 20 6b 3b 0a 20 20 20 20 20 20 61 70 44 69 76  = k;.      apDiv
1f110 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
1f120 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20  Parent, k);.    
1f130 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20    nDiv++;.      
1f140 61 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74  assert( !pParent
1f150 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20  ->leaf );.      
1f160 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
1f170 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
1f180 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b  .    }else if( k
1f190 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
1f1a0 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   ){.      pgnoOl
1f1b0 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
1f1c0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
1f1d0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
1f1e0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
1f1f0 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
1f200 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67      }.    rc = g
1f210 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
1f220 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26  t, pgnoOld[i], &
1f230 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65 6e  apOld[i], pParen
1f240 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
1f250 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
1f260 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c 64  eanup;.    apOld
1f270 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  [i]->idxParent =
1f280 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b 69   k;.    apCopy[i
1f290 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  ] = 0;.    asser
1f2a0 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20  t( i==nOld );.  
1f2b0 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d    nOld++;.    nM
1f2c0 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
1f2d0 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
1f2e0 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
1f2f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
1f300 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
1f310 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  for memory struc
1f320 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43  tures.  */.  apC
1f330 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ell = sqliteMall
1f340 6f 63 52 61 77 28 20 0a 20 20 20 20 20 20 20 6e  ocRaw( .       n
1f350 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
1f360 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  u8*)            
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f380 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * apCell */.    
1f390 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a   + nMaxCells*siz
1f3a0 65 6f 66 28 69 6e 74 29 20 20 20 20 20 20 20 20  eof(int)        
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3c0 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a     /* szCell */.
1f3d0 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 4d 65       + sizeof(Me
1f3e0 6d 50 61 67 65 29 2a 4e 42 20 20 20 20 20 20 20  mPage)*NB       
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f400 20 20 20 20 20 20 20 2f 2a 20 61 43 6f 70 79 20         /* aCopy 
1f410 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70  */.     + pBt->p
1f420 73 41 6c 69 67 6e 65 64 2a 28 35 2b 4e 42 29 20  sAligned*(5+NB) 
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70            /* aSp
1f450 61 63 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49  ace */.     + (I
1f460 53 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d  SAUTOVACUUM ? nM
1f470 61 78 43 65 6c 6c 73 20 3a 20 30 29 20 20 20 20  axCells : 0)    
1f480 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 29   /* aFrom */.  )
1f490 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d  ;.  if( apCell==
1f4a0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
1f4b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1f4c0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
1f4d0 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65  anup;.  }.  szCe
1f4e0 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43 65  ll = (int*)&apCe
1f4f0 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
1f500 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a   aCopy[0] = (u8*
1f510 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&szCell[nMaxCel
1f520 6c 73 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ls];.  for(i=1; 
1f530 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<NB; i++){.    
1f540 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70  aCopy[i] = &aCop
1f550 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 73 41 6c  y[i-1][pBt->psAl
1f560 69 67 6e 65 64 2b 73 69 7a 65 6f 66 28 4d 65 6d  igned+sizeof(Mem
1f570 50 61 67 65 29 5d 3b 0a 20 20 7d 0a 20 20 61 53  Page)];.  }.  aS
1f580 70 61 63 65 20 3d 20 26 61 43 6f 70 79 5b 4e 42  pace = &aCopy[NB
1f590 2d 31 5d 5b 70 42 74 2d 3e 70 73 41 6c 69 67 6e  -1][pBt->psAlign
1f5a0 65 64 2b 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  ed+sizeof(MemPag
1f5b0 65 29 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  e)];.#ifndef SQL
1f5c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1f5d0 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  UUM.  if( pBt->a
1f5e0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1f5f0 20 61 46 72 6f 6d 20 3d 20 26 61 53 70 61 63 65   aFrom = &aSpace
1f600 5b 35 2a 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65  [5*pBt->psAligne
1f610 64 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d];.  }.#endif. 
1f620 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65   .  /*.  ** Make
1f630 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63   copies of the c
1f640 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65 20  ontent of pPage 
1f650 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
1f660 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20   into aOld[]..  
1f670 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  ** The rest of t
1f680 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
1f690 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20  l use data from 
1f6a0 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65  the copies rathe
1f6b0 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  r.  ** that the 
1f6c0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73  original pages s
1f6d0 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61  ince the origina
1f6e0 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  l pages will be 
1f6f0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63  in the.  ** proc
1f700 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65  ess of being ove
1f710 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20  rwritten..  */. 
1f720 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
1f730 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
1f740 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b  age *p = apCopy[
1f750 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  i] = (MemPage*)&
1f760 61 43 6f 70 79 5b 69 5d 5b 70 42 74 2d 3e 70 73  aCopy[i][pBt->ps
1f770 41 6c 69 67 6e 65 64 5d 3b 0a 20 20 20 20 70 2d  Aligned];.    p-
1f780 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29  >aData = &((u8*)
1f790 70 29 5b 2d 70 42 74 2d 3e 70 73 41 6c 69 67 6e  p)[-pBt->psAlign
1f7a0 65 64 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ed];.    memcpy(
1f7b0 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b  p->aData, apOld[
1f7c0 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  i]->aData, pBt->
1f7d0 70 73 41 6c 69 67 6e 65 64 20 2b 20 73 69 7a 65  psAligned + size
1f7e0 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
1f7f0 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28    p->aData = &((
1f800 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 73 41  u8*)p)[-pBt->psA
1f810 6c 69 67 6e 65 64 5d 3b 0a 20 20 7d 0a 0a 20 20  ligned];.  }..  
1f820 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
1f830 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
1f840 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
1f850 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
1f860 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
1f870 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
1f880 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
1f890 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
1f8a0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
1f8b0 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
1f8c0 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53  obtained form aS
1f8d0 70 61 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  pace[] and remov
1f8e0 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
1f8f0 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
1f900 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
1f910 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
1f920 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
1f930 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
1f940 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
1f950 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
1f960 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
1f970 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
1f980 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
1f990 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
1f9a0 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e  * into aSpace[].
1f9b0 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
1f9c0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
1f9d0 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
1f9e0 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
1f9f0 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
1fa00 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
1fa10 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
1fa20 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
1fa30 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
1fa40 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
1fa50 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
1fa60 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
1fa70 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
1fa80 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
1fa90 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
1faa0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
1fab0 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
1fac0 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
1fad0 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
1fae0 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
1faf0 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
1fb00 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
1fb10 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65  keys..  */.  nCe
1fb20 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f  ll = 0;.  leafCo
1fb30 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65  rrection = pPage
1fb40 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
1fb50 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65  Data = pPage->le
1fb60 61 66 44 61 74 61 20 26 26 20 70 50 61 67 65 2d  afData && pPage-
1fb70 3e 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30  >leaf;.  for(i=0
1fb80 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
1fb90 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
1fba0 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20  d = apCopy[i];. 
1fbb0 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70     int limit = p
1fbc0 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
1fbd0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
1fbe0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
1fbf0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; j++){.      as
1fc00 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
1fc10 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61  Cells );.      a
1fc20 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
1fc30 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
1fc40 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
1fc50 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
1fc60 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
1fc70 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
1fc80 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1fc90 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1fca0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
1fcb0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1fcc0 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20        int a;.   
1fcd0 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
1fce0 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66  ] = i;.        f
1fcf0 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e  or(a=0; a<pOld->
1fd00 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b  nOverflow; a++){
1fd10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1fd20 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43  Old->aOvfl[a].pC
1fd30 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c  ell==apCell[nCel
1fd40 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l] ){.          
1fd50 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
1fd60 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20   0xFF;.         
1fd70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1fd80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1fd90 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1fda0 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
1fdb0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
1fdc0 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ld-1 ){.      in
1fdd0 74 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50  t sz = cellSizeP
1fde0 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
1fdf0 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[i]);.      if(
1fe00 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
1fe10 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65       /* With the
1fe20 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20   LEAFDATA flag, 
1fe30 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f  pParent cells ho
1fe40 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20  ld only INTKEYs 
1fe50 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
1fe60 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
1fe70 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68  f keys on the ch
1fe80 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e  ild pages.  We n
1fe90 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20  eed to remove.  
1fea0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76        ** the div
1feb0 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
1fec0 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65  pParent, but the
1fed0 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
1fee0 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  are not.        
1fef0 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65  ** added to apCe
1ff00 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65  ll[] because the
1ff10 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73  y are duplicates
1ff20 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e   of child cells.
1ff30 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1ff40 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
1ff50 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
1ff60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ff70 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70         u8 *pTemp
1ff80 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1ff90 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
1ffa0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  s );.        szC
1ffb0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
1ffc0 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
1ffd0 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d   &aSpace[iSpace]
1ffe0 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
1fff0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
20000 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d  assert( iSpace<=
20010 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65 64 2a 35  pBt->psAligned*5
20020 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
20030 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
20040 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  i], sz);.       
20050 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
20060 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65   pTemp+leafCorre
20070 63 74 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53  ction;.#ifndef S
20080 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
20090 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66  ACUUM.        if
200a0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
200b0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  m ){.          a
200c0 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78  From[nCell] = 0x
200d0 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  FF;.        }.#e
200e0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 72 6f  ndif.        dro
200f0 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  pCell(pParent, n
20100 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20  xDiv, sz);.     
20110 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
20120 20 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69   -= leafCorrecti
20130 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  on;.        asse
20140 72 74 28 20 67 65 74 34 62 79 74 65 28 70 54 65  rt( get4byte(pTe
20150 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20  mp)==pgnoOld[i] 
20160 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
20170 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pOld->leaf ){.  
20180 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20190 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
201a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 );.          /
201b0 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e  * The right poin
201c0 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
201d0 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d   page pOld becom
201e0 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20  es the left.    
201f0 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
20200 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
20210 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  cell */.        
20220 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b    memcpy(apCell[
20230 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61  nCell], &pOld->a
20240 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66  Data[pOld->hdrOf
20250 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20  fset+8], 4);.   
20260 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
20280 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
20290 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
202a0 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
202b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
202c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72  .  /*.  ** Figur
202d0 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72  e out the number
202e0 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64   of pages needed
202f0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65   to hold all nCe
20300 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53  ll cells..  ** S
20310 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72  tore this number
20320 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63   in "k".  Also c
20330 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77  ompute szNew[] w
20340 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61  hich is the tota
20350 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61  l.  ** size of a
20360 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  ll cells on the 
20370 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e  i-th page and cn
20380 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  tNew[] which is 
20390 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69  the index.  ** i
203a0 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  n apCell[] of th
203b0 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69  e cell that divi
203c0 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20  des page i from 
203d0 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a  page i+1.  .  **
203e0 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c   cntNew[k] shoul
203f0 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20  d equal nCell.. 
20400 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20   **.  ** Values 
20410 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73  computed by this
20420 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a   block:.  **.  *
20430 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54  *           k: T
20440 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
20450 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  of sibling pages
20460 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69  .  **    szNew[i
20470 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f  ]: Spaced used o
20480 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  n the i-th sibli
20490 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20  ng page..  **   
204a0 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78  cntNew[i]: Index
204b0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64   in apCell[] and
204c0 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68   szCell[] for th
204d0 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a  e first cell to.
204e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
204f0 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74    the right of t
20500 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
20510 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c  page..  ** usabl
20520 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f  eSpace: Number o
20530 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
20540 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61   available on ea
20550 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a  ch sibling..  **
20560 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53   .  */.  usableS
20570 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  pace = pBt->usab
20580 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65  leSize - 12 + le
20590 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
205a0 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69  for(subtotal=k=i
205b0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
205c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
205d0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
205e0 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a    subtotal += sz
205f0 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20  Cell[i] + 2;.   
20600 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20   if( subtotal > 
20610 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20  usableSpace ){. 
20620 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20       szNew[k] = 
20630 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c  subtotal - szCel
20640 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e  l[i];.      cntN
20650 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20  ew[k] = i;.     
20660 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
20670 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75   i--; }.      su
20680 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  btotal = 0;.    
20690 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    k++;.    }.  }
206a0 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75  .  szNew[k] = su
206b0 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77  btotal;.  cntNew
206c0 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b  [k] = nCell;.  k
206d0 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ++;..  /*.  ** T
206e0 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75  he packing compu
206f0 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
20700 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61  ous block is bia
20710 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73  sed toward the s
20720 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20  iblings.  ** on 
20730 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20  the left side.  
20740 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67  The left sibling
20750 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61  s are always nea
20760 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20  rly full, while 
20770 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d  the.  ** right-m
20780 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68  ost sibling migh
20790 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  t be nearly empt
207a0 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  y.  This block o
207b0 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a  f code attempts.
207c0 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74    ** to adjust t
207d0 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69  he packing of si
207e0 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20  blings to get a 
207f0 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a  better balance..
20800 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61    **.  ** This a
20810 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72  djustment is mor
20820 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69  e than an optimi
20830 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63  zation.  The pac
20840 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74  king above might
20850 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20  .  ** be so out 
20860 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f  of balance as to
20870 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f   be illegal.  Fo
20880 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72  r example, the r
20890 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight-most.  ** s
208a0 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
208b0 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
208c0 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  .  This adjustme
208d0 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e  nt is not option
208e0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  al..  */.  for(i
208f0 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  =k-1; i>0; i--){
20900 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74  .    int szRight
20910 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a   = szNew[i];  /*
20920 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
20930 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
20940 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20  .    int szLeft 
20950 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a  = szNew[i-1]; /*
20960 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
20970 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
20980 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20      int r;      
20990 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
209a0 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63   of right-most c
209b0 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c  ell in left sibl
209c0 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64  ing */.    int d
209d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
209e0 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
209f0 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66   cell to the lef
20a00 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69  t of right sibli
20a10 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63  ng */..    r = c
20a20 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
20a30 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
20a40 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73  leafData;.    as
20a50 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c  sert( d<nMaxCell
20a60 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
20a70 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   r<nMaxCells );.
20a80 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67      while( szRig
20a90 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74  ht==0 || szRight
20aa0 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
20ab0 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
20ac0 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69  2) ){.      szRi
20ad0 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d  ght += szCell[d]
20ae0 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65   + 2;.      szLe
20af0 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20  ft -= szCell[r] 
20b00 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  + 2;.      cntNe
20b10 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20  w[i-1]--;.      
20b20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
20b30 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72  - 1;.      d = r
20b40 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
20b50 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77  .    }.    szNew
20b60 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20  [i] = szRight;. 
20b70 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20     szNew[i-1] = 
20b80 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 61 73  szLeft;.  }.  as
20b90 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e  sert( cntNew[0]>
20ba0 30 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  0 );..  /*.  ** 
20bb0 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
20bc0 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
20bd0 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
20be0 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  sible..  */.  as
20bf0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
20c00 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61  o>1 );.  pageFla
20c10 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  gs = pPage->aDat
20c20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  a[0];.  for(i=0;
20c30 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
20c40 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
20c50 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b     if( i<nOld ){
20c60 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70  .      pNew = ap
20c70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69  New[i] = apOld[i
20c80 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
20c90 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d  [i] = pgnoOld[i]
20ca0 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
20cb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
20cc0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
20cd0 69 74 65 28 70 4e 65 77 2d 3e 61 44 61 74 61 29  ite(pNew->aData)
20ce0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
20cf0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
20d00 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65  eanup;.    }else
20d10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  {.      rc = all
20d20 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 26  ocatePage(pBt, &
20d30 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69  pNew, &pgnoNew[i
20d40 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c  ], pgnoNew[i-1],
20d50 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
20d60 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
20d70 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
20d80 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b  apNew[i] = pNew;
20d90 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4e 65 77 2b  .    }.    nNew+
20da0 2b 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  +;.    zeroPage(
20db0 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29  pNew, pageFlags)
20dc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  ;.  }..  /* Free
20dd0 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74   any old pages t
20de0 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75  hat were not reu
20df0 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73  sed as new pages
20e00 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
20e10 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63  i<nOld ){.    rc
20e20 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c   = freePage(apOl
20e30 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
20e40 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
20e50 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65  _cleanup;.    re
20e60 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
20e70 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69  i]);.    apOld[i
20e80 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a  ] = 0;.    i++;.
20e90 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50    }..  /*.  ** P
20ea0 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ut the new pages
20eb0 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
20ec0 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73  der.  This helps
20ed0 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e   to.  ** keep en
20ee0 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73  tries in the dis
20ef0 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  k file in order 
20f00 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20  so that a scan. 
20f10 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
20f20 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61   is a linear sca
20f30 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69  n through the fi
20f40 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69  le.  That.  ** i
20f50 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65  n turn helps the
20f60 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
20f70 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67  m to deliver pag
20f80 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  es.  ** from the
20f90 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64   disk more rapid
20fa0 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  ly..  **.  ** An
20fb0 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f   O(n^2) insertio
20fc0 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d  n sort algorithm
20fd0 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69   is used, but si
20fe0 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65  nce.  ** n is ne
20ff0 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42  ver more than NB
21000 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61   (a small consta
21010 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64  nt), that should
21020 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70  .  ** not be a p
21030 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  roblem..  **.  *
21040 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68  * When NB==3, th
21050 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74  is one optimizat
21060 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61  ion makes the da
21070 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75  tabase.  ** abou
21080 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72  t 25% faster for
21090 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e   large insertion
210a0 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e  s and deletions.
210b0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
210c0 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20   i<k-1; i++){.  
210d0 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e    int minV = pgn
210e0 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  oNew[i];.    int
210f0 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66   minI = i;.    f
21100 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a  or(j=i+1; j<k; j
21110 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
21120 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67  gnoNew[j]<(unsig
21130 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
21140 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
21150 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e        minV = pgn
21160 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  oNew[j];.      }
21170 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
21180 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69  inI>i ){.      i
21190 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50  nt t;.      MemP
211a0 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74  age *pT;.      t
211b0 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20   = pgnoNew[i];. 
211c0 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b       pT = apNew[
211d0 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  i];.      pgnoNe
211e0 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d  w[i] = pgnoNew[m
211f0 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  inI];.      apNe
21200 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e  w[i] = apNew[min
21210 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  I];.      pgnoNe
21220 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20  w[minI] = t;.   
21230 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d     apNew[minI] =
21240 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   pT;.    }.  }. 
21250 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
21260 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20  : old: %d %d %d 
21270 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28   new: %d(%d) %d(
21280 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
21290 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20  ) %d(%d)\n",.   
212a0 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20   pgnoOld[0], .  
212b0 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f    nOld>=2 ? pgno
212c0 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  Old[1] : 0,.    
212d0 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c  nOld>=3 ? pgnoOl
212e0 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67  d[2] : 0,.    pg
212f0 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b  noNew[0], szNew[
21300 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20  0],.    nNew>=2 
21310 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30  ? pgnoNew[1] : 0
21320 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
21330 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
21340 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=3 ? pgnoNew[
21350 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20  2] : 0, nNew>=3 
21360 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a  ? szNew[2] : 0,.
21370 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67      nNew>=4 ? pg
21380 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e  noNew[3] : 0, nN
21390 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d  ew>=4 ? szNew[3]
213a0 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
213b0 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a  5 ? pgnoNew[4] :
213c0 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a   0, nNew>=5 ? sz
213d0 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20  New[4] : 0));.. 
213e0 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20   /*.  ** Evenly 
213f0 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64  distribute the d
21400 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  ata in apCell[] 
21410 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70  across the new p
21420 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72  ages..  ** Inser
21430 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  t divider cells 
21440 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20  into pParent as 
21450 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
21460 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    j = 0;.  for(i
21470 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
21480 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c  {.    /* Assembl
21490 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  e the new siblin
214a0 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d  g page. */.    M
214b0 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
214c0 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73  pNew[i];.    ass
214d0 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
214e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
214f0 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  pNew->pgno==pgno
21500 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61 73  New[i] );.    as
21510 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
21520 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
21530 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
21540 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
21550 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
21560 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21570 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
21580 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  =0 );..#ifndef S
21590 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
215a0 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20  ACUUM.    /* If 
215b0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
215c0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
215d0 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
215e0 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a  ter map entries.
215f0 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e      ** that poin
21600 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67  t to the sibling
21610 73 20 74 68 61 74 20 77 65 72 65 20 72 65 61 72  s that were rear
21620 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61  ranged. These ca
21630 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a  n be: left.    *
21640 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65  * children of ce
21650 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63  lls, the right-c
21660 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65  hild of the page
21670 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  , or overflow pa
21680 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ges.    ** point
21690 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a  ed to by cells..
216a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
216b0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
216c0 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b  {.      for(k=j;
216d0 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b   k<cntNew[i]; k+
216e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
216f0 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( k<nMaxCells 
21700 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
21710 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c  From[k]==0xFF ||
21720 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d   apCopy[aFrom[k]
21730 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70  ]->pgno!=pNew->p
21740 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gno ){.         
21750 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
21760 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a  vfl(pNew, k-j);.
21770 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
21780 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21790 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
217a0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
217b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
217c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
217d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
217e0 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a   j = cntNew[i];.
217f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
21800 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65  ibling page asse
21810 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20  mbled above was 
21820 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  not the right-mo
21830 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20  st sibling,.    
21840 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69  ** insert a divi
21850 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68  der cell into th
21860 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
21870 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c     */.    if( i<
21880 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c  nNew-1 && j<nCel
21890 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  l ){.      u8 *p
218a0 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a  Cell;.      u8 *
218b0 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74  pTemp;.      int
218c0 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65   sz;..      asse
218d0 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
218e0 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
218f0 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   apCell[j];.    
21900 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d    sz = szCell[j]
21910 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
21920 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  n;.      if( !pN
21930 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ew->leaf ){.    
21940 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
21950 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c  ->aData[8], pCel
21960 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 70  l, 4);.        p
21970 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Temp = 0;.      
21980 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61  }else if( leafDa
21990 74 61 20 29 7b 0a 09 2f 2a 20 49 66 20 74 68 65  ta ){../* If the
219a0 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d   tree is a leaf-
219b0 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74  data tree, and t
219c0 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
219d0 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20  leaves, .       
219e0 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
219f0 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c  s no divider cel
21a00 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49  l in apCell[]. I
21a10 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69  nstead, the divi
21a20 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  der .        ** 
21a30 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
21a40 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
21a50 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d   for the right-m
21a60 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20  ost cell of .   
21a70 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c       ** the sibl
21a80 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c  ing-page assembl
21a90 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20  ed above only.. 
21aa0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21ab0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
21ac0 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20  .        j--;.  
21ad0 20 20 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50        parseCellP
21ae0 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
21af0 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  j], &info);.    
21b00 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 61 53 70      pCell = &aSp
21b10 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20  ace[iSpace];.   
21b20 20 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28       fillInCell(
21b30 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20  pParent, pCell, 
21b40 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c  0, info.nKey, 0,
21b50 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20   0, &sz);.      
21b60 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a    iSpace += sz;.
21b70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21b80 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 73 41  iSpace<=pBt->psA
21b90 6c 69 67 6e 65 64 2a 35 20 29 3b 0a 20 20 20 20  ligned*5 );.    
21ba0 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20      pTemp = 0;. 
21bb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21bc0 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a      pCell -= 4;.
21bd0 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
21be0 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b  &aSpace[iSpace];
21bf0 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20  .        iSpace 
21c00 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
21c10 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70  ssert( iSpace<=p
21c20 42 74 2d 3e 70 73 41 6c 69 67 6e 65 64 2a 35 20  Bt->psAligned*5 
21c30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21c40 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
21c50 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
21c60 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d   pCell, sz, pTem
21c70 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28  p, 4);.      if(
21c80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21c90 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
21ca0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70 75 74  eanup;.      put
21cb0 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
21cc0 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e  owCell(pParent,n
21cd0 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e  xDiv), pNew->pgn
21ce0 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  o);.#ifndef SQLI
21cf0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
21d00 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
21d10 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
21d20 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
21d30 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64  and not a leaf-d
21d40 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20 20  ata tree,.      
21d50 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20 74  ** then update t
21d60 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 77  he pointer map w
21d70 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ith an entry for
21d80 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
21d90 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ge.      ** that
21da0 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20 69   the cell just i
21db0 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20 74  nserted points t
21dc0 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  o (if any)..    
21dd0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
21de0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
21df0 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  & !leafData ){. 
21e00 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
21e10 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65 6e  apPutOvfl(pParen
21e20 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20 20  t, nxDiv);.     
21e30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21e40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21e50 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
21e60 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
21e70 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
21e80 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
21e90 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d    nxDiv++;.    }
21ea0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a  .  }.  assert( j
21eb0 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ==nCell );.  if(
21ec0 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54   (pageFlags & PT
21ed0 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20  F_LEAF)==0 ){.  
21ee0 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b    memcpy(&apNew[
21ef0 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nNew-1]->aData[8
21f00 5d 2c 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d  ], &apCopy[nOld-
21f10 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29  1]->aData[8], 4)
21f20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69  ;.  }.  if( nxDi
21f30 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  v==pParent->nCel
21f40 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  l+pParent->nOver
21f50 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52  flow ){.    /* R
21f60 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
21f70 67 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  g is the right-m
21f80 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ost child of pPa
21f90 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34  rent */.    put4
21fa0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
21fb0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
21fc0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
21fd0 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20  New[nNew-1]);.  
21fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69  }else{.    /* Ri
21ff0 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
22000 20 69 73 20 74 68 65 20 6c 65 66 74 20 63 68 69   is the left chi
22010 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ld of the first 
22020 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74  entry in pParent
22030 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
22040 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69   right-most divi
22050 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  der entry */.   
22060 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
22070 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
22080 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f  nt, nxDiv), pgno
22090 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20  New[nNew-1]);.  
220a0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70  }..  /*.  ** Rep
220b0 61 72 65 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f  arent children o
220c0 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  f all cells..  *
220d0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
220e0 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  New; i++){.    r
220f0 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
22100 64 50 61 67 65 73 28 61 70 4e 65 77 5b 69 5d 29  dPages(apNew[i])
22110 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
22120 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
22130 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
22140 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72    }.  rc = repar
22150 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70 50  entChildPages(pP
22160 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  arent);.  if( rc
22170 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
22180 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
22190 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42  up;..  /*.  ** B
221a0 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
221b0 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68  t page.  Note th
221c0 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
221d0 61 67 65 20 28 70 50 61 67 65 29 20 6d 69 67 68  age (pPage) migh
221e0 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  t.  ** have been
221f0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
22200 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67  eelist so it mig
22210 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  ht no longer be 
22220 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
22230 2a 20 42 75 74 20 74 68 65 20 70 61 72 65 6e 74  * But the parent
22240 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79   page will alway
22250 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  s be initialized
22260 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
22270 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74   pParent->isInit
22280 20 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72 74 28   );.  /* assert(
22290 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
222a0 3b 20 2f 2f 20 4e 6f 21 20 70 50 61 67 65 20 6d  ; // No! pPage m
222b0 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 61  ight have been a
222c0 64 64 65 64 20 74 6f 20 66 72 65 65 6c 69 73 74  dded to freelist
222d0 20 2a 2f 0a 20 20 2f 2a 20 70 61 67 65 49 6e 74   */.  /* pageInt
222e0 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 20 20  egrity(pPage);  
222f0 20 20 2f 2f 20 4e 6f 21 20 70 50 61 67 65 20 6d    // No! pPage m
22300 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 61  ight have been a
22310 64 64 65 64 20 74 6f 20 66 72 65 65 6c 69 73 74  dded to freelist
22320 20 2a 2f 20 0a 20 20 72 63 20 3d 20 62 61 6c 61   */ .  rc = bala
22330 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b  nce(pParent, 0);
22340 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c  .  .  /*.  ** Cl
22350 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74  eanup before ret
22360 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c  urning..  */.bal
22370 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  ance_cleanup:.  
22380 73 71 6c 69 74 65 46 72 65 65 28 61 70 43 65 6c  sqliteFree(apCel
22390 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l);.  for(i=0; i
223a0 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
223b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
223c0 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f  ld[i]);.  }.  fo
223d0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
223e0 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
223f0 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  Page(apNew[i]);.
22400 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
22410 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52  e(pParent);.  TR
22420 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66  ACE(("BALANCE: f
22430 69 6e 69 73 68 65 64 20 77 69 74 68 20 25 64 3a  inished with %d:
22440 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63   old=%d new=%d c
22450 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  ells=%d\n",.    
22460 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e        pPage->pgn
22470 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e  o, nOld, nNew, n
22480 43 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  Cell));.  return
22490 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
224a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
224b0 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  lled for the roo
224c0 74 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65  t page of a btre
224d0 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a  e when the root.
224e0 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ** page contains
224f0 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73   no cells.  This
22500 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69   is an opportuni
22510 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74  ty to make the t
22520 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72  ree.** shallower
22530 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a   by one level..*
22540 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
22550 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d  ance_shallower(M
22560 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
22570 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
22580 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
22590 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64  * The only child
225a0 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a   page of pPage *
225b0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
225c0 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
225d0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
225e0 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20  for pChild */.  
225f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22600 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
22610 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
22620 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
22630 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 20  /.  Btree *pBt; 
22640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22650 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72   /* The main BTr
22660 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
22670 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50    int mxCellPerP
22680 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
22690 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
226a0 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61   of cells per pa
226b0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
226c0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
226d0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
226e0 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69  s from pages bei
226f0 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
22700 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   int *szCell;   
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22720 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
22730 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61  ll cells */..  a
22740 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50  ssert( pPage->pP
22750 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  arent==0 );.  as
22760 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
22770 6c 6c 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d  ll==0 );.  pBt =
22780 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d   pPage->pBt;.  m
22790 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d  xCellPerPage = M
227a0 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61  X_CELL(pBt);.  a
227b0 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61  pCell = sqliteMa
227c0 6c 6c 6f 63 52 61 77 28 20 6d 78 43 65 6c 6c 50  llocRaw( mxCellP
227d0 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75  erPage*(sizeof(u
227e0 38 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  8*)+sizeof(int))
227f0 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
22800 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
22810 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43  ITE_NOMEM;.  szC
22820 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43  ell = (int*)&apC
22830 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67  ell[mxCellPerPag
22840 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  e];.  if( pPage-
22850 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  >leaf ){.    /* 
22860 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  The table is com
22870 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f  pletely empty */
22880 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
22890 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c  ANCE: empty tabl
228a0 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  e %d\n", pPage->
228b0 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
228c0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
228d0 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62   page is empty b
228e0 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64  ut has one child
228f0 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
22900 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
22910 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65  on from that one
22920 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20   child into the 
22930 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20  root page if it 
22940 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74  .    ** will fit
22950 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
22960 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
22970 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20   tree by one..  
22980 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
22990 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
229a0 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
229b0 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
229c0 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ble than.    ** 
229d0 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
229e0 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
229f0 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
22a00 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
22a10 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
22a20 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20   database fle), 
22a30 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  so it might not 
22a40 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  be able to hold 
22a50 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20  all of the .    
22a60 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
22a70 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
22a80 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
22a90 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
22aa0 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74   .    ** case, t
22ab0 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  hen do not do th
22ac0 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61  e transfer.  Lea
22ad0 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20  ve page 1 empty 
22ae0 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
22af0 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
22b00 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64  ter to the child
22b10 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c   page.  The chil
22b20 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20  d page becomes. 
22b30 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61     ** the virtua
22b40 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  l root of the tr
22b50 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ee..    */.    p
22b60 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
22b70 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
22b80 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
22b90 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
22ba0 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20  rt( pgnoChild>0 
22bb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22bc0 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65  gnoChild<=sqlite
22bd0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
22be0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
22bf0 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
22c00 20 67 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e   getPage(pPage->
22c10 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20  pBt, pgnoChild, 
22c20 26 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 69 66  &pChild);.    if
22c30 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
22c40 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
22c50 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
22c60 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
22c70 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28 70   rc = initPage(p
22c80 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20  Child, pPage);. 
22c90 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
22ca0 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
22cb0 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73  alance;.      as
22cc0 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f  sert( pChild->nO
22cd0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
22ce0 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e      if( pChild->
22cf0 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20  nFree>=100 ){.  
22d00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
22d10 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ld information w
22d20 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72  ill fit on the r
22d30 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20  oot page, so do 
22d40 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
22d50 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  opy */.        i
22d60 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65  nt i;.        ze
22d70 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  roPage(pPage, pC
22d80 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  hild->aData[0]);
22d90 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
22da0 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ; i<pChild->nCel
22db0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
22dc0 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66     apCell[i] = f
22dd0 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69  indCell(pChild,i
22de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43  );.          szC
22df0 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  ell[i] = cellSiz
22e00 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43  ePtr(pChild, apC
22e10 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ell[i]);.       
22e20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d   }.        assem
22e30 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20 70  blePage(pPage, p
22e40 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70  Child->nCell, ap
22e50 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20  Cell, szCell);. 
22e60 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74         /* Copy t
22e70 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
22e80 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f   of the child to
22e90 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   the parent. */.
22ea0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
22eb0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
22ec0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
22ed0 38 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  8], .           
22ee0 20 67 65 74 34 62 79 74 65 28 26 70 43 68 69 6c   get4byte(&pChil
22ef0 64 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d  d->aData[pChild-
22f00 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
22f10 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 61 67  .        freePag
22f20 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
22f30 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
22f40 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61  CE: child %d tra
22f50 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c  nsfer to page 1\
22f60 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  n", pChild->pgno
22f70 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
22f80 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
22f90 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69  child has more i
22fa0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
22fb0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
22fc0 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  root..        **
22fd0 20 54 68 65 20 74 72 65 65 20 69 73 20 61 6c 72   The tree is alr
22fe0 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20  eady balanced.  
22ff0 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20  Do nothing. */. 
23000 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42         TRACE(("B
23010 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64  ALANCE: child %d
23020 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
23030 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69   page 1\n", pChi
23040 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ld->pgno));.    
23050 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
23060 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67       memcpy(pPag
23070 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64  e->aData, pChild
23080 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e  ->aData, pPage->
23090 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
230a0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  ;.      pPage->i
230b0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  sInit = 0;.     
230c0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
230d0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
230e0 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  initPage(pPage, 
230f0 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
23100 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23110 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67  );.      freePag
23120 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
23130 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
23140 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64  : transfer child
23150 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64   %d into root %d
23160 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23170 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c     pChild->pgno,
23180 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
23190 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72      }.    rc = r
231a0 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65  eparentChildPage
231b0 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20 61 73  s(pPage);.    as
231c0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
231d0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66  erflow==0 );.#if
231e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
231f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
23200 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
23210 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  uum ){.      int
23220 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
23230 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
23240 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  l; i++){ .      
23250 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
23260 4f 76 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Ovfl(pPage, i);.
23270 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
23280 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23290 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
232a0 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
232b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
232c0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
232d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
232e0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
232f0 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
23300 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
23310 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65  e(pChild);.  }.e
23320 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
23330 63 65 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  ce:.  sqliteFree
23340 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75  (apCell);.  retu
23350 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
23360 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   The root page i
23370 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a  s overfull.**.**
23380 20 57 68 65 6e 20 74 68 69 73 20 68 61 70 70 65   When this happe
23390 6e 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77  ns, Create a new
233a0 20 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20   child page and 
233b0 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  copy the.** cont
233c0 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
233d0 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e   into the child.
233e0 20 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20    Then make the 
233f0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20  root.** page an 
23400 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20  empty page with 
23410 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74  rightChild point
23420 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ing to the new.*
23430 2a 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c  * child.   Final
23440 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ly, call balance
23450 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74  _internal() on t
23460 68 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20  he new child.** 
23470 74 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20 73  to cause it to s
23480 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  plit..*/.static 
23490 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
234a0 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
234b0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
234c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
234d0 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73  urn value from s
234e0 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
234f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
23500 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  d;    /* Pointer
23510 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
23520 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  page */.  Pgno p
23530 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a  gnoChild;     /*
23540 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
23550 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
23560 67 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  ge */.  Btree *p
23570 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt;         /* T
23580 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e  he BTree */.  in
23590 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
235a0 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c    /* Total usabl
235b0 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
235c0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
235d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
235e0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65  tent of the pare
235f0 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  nt page */.  u8 
23600 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20 20 20  *cdata;         
23610 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
23620 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  he child page */
23630 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
23640 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
23650 20 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20   to page header 
23660 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69  in parent */.  i
23670 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20  nt brk;         
23680 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
23690 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74  content of first
236a0 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20   cell in parent 
236b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
236c0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
236d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
236e0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
236f0 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
23700 2d 3e 70 42 74 3b 0a 20 20 72 63 20 3d 20 61 6c  ->pBt;.  rc = al
23710 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
23720 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68  &pChild, &pgnoCh
23730 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ild, pPage->pgno
23740 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
23750 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73   return rc;.  as
23760 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67  sert( sqlite3pag
23770 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70  er_iswriteable(p
23780 43 68 69 6c 64 2d 3e 61 44 61 74 61 29 20 29 3b  Child->aData) );
23790 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
237a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
237b0 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
237c0 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
237d0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
237e0 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79  ;.  brk = get2by
237f0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
23800 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68 69  ;.  cdata = pChi
23810 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d  ld->aData;.  mem
23820 63 70 79 28 63 64 61 74 61 2c 20 26 64 61 74 61  cpy(cdata, &data
23830 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65  [hdr], pPage->ce
23840 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65  llOffset+2*pPage
23850 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20  ->nCell-hdr);.  
23860 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b 62 72  memcpy(&cdata[br
23870 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20  k], &data[brk], 
23880 75 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b  usableSize-brk);
23890 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c  .  assert( pChil
238a0 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  d->isInit==0 );.
238b0 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28    rc = initPage(
238c0 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a  pChild, pPage);.
238d0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
238e0 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
238f0 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69  t;.  memcpy(pChi
23900 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ld->aOvfl, pPage
23910 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e  ->aOvfl, pPage->
23920 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66  nOverflow*sizeof
23930 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d  (pPage->aOvfl[0]
23940 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f  ));.  pChild->nO
23950 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d  verflow = pPage-
23960 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 66  >nOverflow;.  if
23970 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66  ( pChild->nOverf
23980 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68 69 6c  low ){.    pChil
23990 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  d->nFree = 0;.  
239a0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69  }.  assert( pChi
239b0 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65  ld->nCell==pPage
239c0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a 65 72  ->nCell );.  zer
239d0 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
239e0 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20  ild->aData[0] & 
239f0 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75  ~PTF_LEAF);.  pu
23a00 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
23a10 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
23a20 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68  ffset+8], pgnoCh
23a30 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ild);.  TRACE(("
23a40 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f  BALANCE: copy ro
23a50 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22  ot %d into %d\n"
23a60 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
23a70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23  Child->pgno));.#
23a80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23a90 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
23aa0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
23ab0 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  uum ){.    int i
23ac0 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
23ad0 70 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64  pPut(pBt, pChild
23ae0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
23af0 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e  TREE, pPage->pgn
23b00 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
23b10 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65   goto balancedee
23b20 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66 6f 72  per_out;.    for
23b30 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e  (i=0; i<pChild->
23b40 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
23b50 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
23b60 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20 69 29  tOvfl(pChild, i)
23b70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
23b80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23b90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23bb0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20  }.#endif.  rc = 
23bc0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
23bd0 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63  pChild);..balanc
23be0 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72  edeeper_out:.  r
23bf0 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
23c00 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
23c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65  .}../*.** Decide
23c20 20 69 66 20 74 68 65 20 70 61 67 65 20 70 50 61   if the page pPa
23c30 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ge needs to be b
23c40 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62 61 6c  alanced.  If bal
23c50 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71  ancing is.** req
23c60 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68 65 20  uired, call the 
23c70 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61  appropriate bala
23c80 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a  ncing routine..*
23c90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
23ca0 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  ance(MemPage *pP
23cb0 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72 74 29  age, int insert)
23cc0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
23cd0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
23ce0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
23cf0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
23d00 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b  ->nOverflow>0 ){
23d10 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
23d20 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65  nce_deeper(pPage
23d30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
23d40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
23d50 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  & pPage->nCell==
23d60 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
23d70 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
23d80 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  r(pPage);.    }.
23d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
23da0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
23db0 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  w>0 || .        
23dc0 28 21 69 6e 73 65 72 74 20 26 26 20 70 50 61 67  (!insert && pPag
23dd0 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e  e->nFree>pPage->
23de0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
23df0 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63  2/3) ){.      rc
23e00 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
23e10 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ot(pPage);.    }
23e20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
23e30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
23e40 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61  routine checks a
23e50 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ll cursors that 
23e60 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70  point to table p
23e70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61  gnoRoot..** If a
23e80 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73  ny of those curs
23e90 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 70  ors other than p
23ea0 45 78 63 6c 75 64 65 20 77 65 72 65 20 6f 70 65  Exclude were ope
23eb0 6e 65 64 20 77 69 74 68 20 0a 2a 2a 20 77 72 46  ned with .** wrF
23ec0 6c 61 67 3d 3d 30 20 74 68 65 6e 20 74 68 69 73  lag==0 then this
23ed0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
23ee0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 20   SQLITE_LOCKED. 
23ef0 20 49 66 20 61 6c 6c 0a 2a 2a 20 63 75 72 73 6f   If all.** curso
23f00 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  rs that point to
23f10 20 70 67 6e 6f 52 6f 6f 74 20 77 65 72 65 20 6f   pgnoRoot were o
23f20 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
23f30 67 3d 3d 31 0a 2a 2a 20 74 68 65 6e 20 74 68 69  g==1.** then thi
23f40 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
23f50 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
23f60 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  ** In addition t
23f70 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 72  o checking for r
23f80 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68 65 72 65  ead-locks (where
23f90 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a 2a 2a   a read-lock .**
23fa0 20 6d 65 61 6e 73 20 61 20 63 75 72 73 6f 72 20   means a cursor 
23fb0 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
23fc0 61 67 3d 3d 30 29 20 74 68 69 73 20 72 6f 75 74  ag==0) this rout
23fd0 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65 73 0a 2a  ine also moves.*
23fe0 2a 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 74  * all cursors ot
23ff0 68 65 72 20 74 68 61 6e 20 70 45 78 63 6c 75 64  her than pExclud
24000 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  e so that they a
24010 72 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  re pointing to t
24020 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 43 65 6c  he .** first Cel
24030 6c 20 6f 6e 20 72 6f 6f 74 20 70 61 67 65 2e 20  l on root page. 
24040 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
24050 72 79 20 62 65 63 61 75 73 65 20 61 6e 20 69 6e  ry because an in
24060 73 65 72 74 20 0a 2a 2a 20 6f 72 20 64 65 6c 65  sert .** or dele
24070 74 65 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  te might change 
24080 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  the number of ce
24090 6c 6c 73 20 6f 6e 20 61 20 70 61 67 65 20 6f 72  lls on a page or
240a0 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20 70 61 67   delete.** a pag
240b0 65 20 65 6e 74 69 72 65 6c 79 20 61 6e 64 20 77  e entirely and w
240c0 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
240d0 20 6c 65 61 76 65 20 61 6e 79 20 63 75 72 73 6f   leave any curso
240e0 72 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  rs .** pointing 
240f0 74 6f 20 6e 6f 6e 2d 65 78 69 73 74 61 6e 74 20  to non-existant 
24100 70 61 67 65 73 20 6f 72 20 63 65 6c 6c 73 2e 0a  pages or cells..
24110 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
24120 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74 72  eckReadLocks(Btr
24130 65 65 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ee *pBt, Pgno pg
24140 6e 6f 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72  noRoot, BtCursor
24150 20 2a 70 45 78 63 6c 75 64 65 29 7b 0a 20 20 42   *pExclude){.  B
24160 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f  tCursor *p;.  fo
24170 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
24180 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
24190 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
241a0 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20  oRoot!=pgnoRoot 
241b0 7c 7c 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29  || p==pExclude )
241c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
241d0 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20  f( p->wrFlag==0 
241e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
241f0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 69 66 28 20  LOCKED;.    if( 
24200 70 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d  p->pPage->pgno!=
24210 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  p->pgnoRoot ){. 
24220 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28       moveToRoot(
24230 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
24240 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
24260 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
24270 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20  nto the BTree.  
24280 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e  The key is given
24290 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a   by (pKey,nKey).
242a0 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20  ** and the data 
242b0 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61  is given by (pDa
242c0 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20  ta,nData).  The 
242d0 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f  cursor is used o
242e0 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65  nly to.** define
242f0 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20   what table the 
24300 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65  record should be
24310 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20   inserted into. 
24320 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
24330 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
24340 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  at a random loca
24350 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tion..**.** For 
24360 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c  an INTKEY table,
24370 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76   only the nKey v
24380 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20  alue of the key 
24390 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69  is used.  pKey i
243a0 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46  s.** ignored.  F
243b0 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61  or a ZERODATA ta
243c0 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61  ble, the pData a
243d0 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74  nd nData are bot
243e0 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e  h ignored..*/.in
243f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
24400 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72  sert(.  BtCursor
24410 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
24420 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
24430 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74   data into the t
24440 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72  able of this cur
24450 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  sor */.  const v
24460 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
24470 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
24480 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65  ey of the new re
24490 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
244a0 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
244b0 20 6e 44 61 74 61 20 20 20 2f 2a 20 54 68 65 20   nData   /* The 
244c0 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20  data of the new 
244d0 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69  record */.){.  i
244e0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63  nt rc;.  int loc
244f0 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20  ;.  int szNew;. 
24500 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
24510 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20  .  Btree *pBt = 
24520 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 75 6e 73  pCur->pBt;.  uns
24530 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43  igned char *oldC
24540 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ell;.  unsigned 
24550 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20  char *newCell = 
24560 30 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  0;..  if( pBt->i
24570 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
24580 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75  ITE ){.    /* Mu
24590 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
245a0 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f  action before do
245b0 69 6e 67 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f  ing an insert */
245c0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d  .    return pBt-
245d0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
245e0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
245f0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
24600 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
24610 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66  readOnly );.  if
24620 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
24630 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
24640 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
24650 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20  Cursor not open 
24660 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20  for writing */. 
24670 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65   }.  if( checkRe
24680 61 64 4c 6f 63 6b 73 28 70 42 74 2c 20 70 43 75  adLocks(pBt, pCu
24690 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
246a0 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
246b0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20   SQLITE_LOCKED; 
246c0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
246d0 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
246e0 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
246f0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
24700 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75  3BtreeMoveto(pCu
24710 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 26  r, pKey, nKey, &
24720 6c 6f 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29  loc);.  if( rc )
24730 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
24740 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
24750 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
24760 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b  ge->intKey || nK
24770 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey>=0 );.  asser
24780 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c  t( pPage->leaf |
24790 7c 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  | !pPage->leafDa
247a0 74 61 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ta );.  TRACE(("
247b0 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64  INSERT: table=%d
247c0 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61   nkey=%lld ndata
247d0 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e  =%d page=%d %s\n
247e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ",.          pCu
247f0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65  r->pgnoRoot, nKe
24800 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d  y, nData, pPage-
24810 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
24820 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77   loc==0 ? "overw
24830 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74  rite" : "new ent
24840 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28  ry"));.  assert(
24850 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
24860 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
24870 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
24880 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 69 66 28  e->aData);.  if(
24890 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
248a0 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 73 71 6c  .  newCell = sql
248b0 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58  iteMallocRaw( MX
248c0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
248d0 29 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c  );.  if( newCell
248e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
248f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20  ITE_NOMEM;.  rc 
24900 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
24910 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65  ge, newCell, pKe
24920 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20  y, nKey, pData, 
24930 6e 44 61 74 61 2c 20 26 73 7a 4e 65 77 29 3b 0a  nData, &szNew);.
24940 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
24950 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73  end_insert;.  as
24960 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c  sert( szNew==cel
24970 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
24980 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73  newCell) );.  as
24990 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f  sert( szNew<=MX_
249a0 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
249b0 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26  ;.  if( loc==0 &
249c0 26 20 70 43 75 72 2d 3e 69 73 56 61 6c 69 64 20  & pCur->isValid 
249d0 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 4f 6c 64  ){.    int szOld
249e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
249f0 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
24a00 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
24a10 43 65 6c 6c 20 29 3b 0a 20 20 20 20 6f 6c 64 43  Cell );.    oldC
24a20 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
24a30 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
24a40 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
24a50 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
24a60 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20  memcpy(newCell, 
24a70 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  oldCell, 4);.   
24a80 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63   }.    szOld = c
24a90 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
24aa0 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
24ab0 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
24ac0 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
24ad0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
24ae0 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
24af0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65    dropCell(pPage
24b00 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73 7a 4f  , pCur->idx, szO
24b10 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ld);.  }else if(
24b20 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d   loc<0 && pPage-
24b30 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
24b40 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
24b50 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75 72 2d  eaf );.    pCur-
24b60 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43 75 72  >idx++;.    pCur
24b70 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
24b80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
24b90 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
24ba0 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  af );.  }.  rc =
24bb0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
24bc0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 6e 65  e, pCur->idx, ne
24bd0 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c  wCell, szNew, 0,
24be0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
24bf0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
24c00 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72 63  end_insert;.  rc
24c10 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
24c20 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c 69 74  , 1);.  /* sqlit
24c30 65 33 42 74 72 65 65 50 61 67 65 44 75 6d 70 28  e3BtreePageDump(
24c40 70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75 72 2d  pCur->pBt, pCur-
24c50 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 20 2a  >pgnoRoot, 1); *
24c60 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28 73 74  /.  /* fflush(st
24c70 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66 28 20  dout); */.  if( 
24c80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24c90 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  .    moveToRoot(
24ca0 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69  pCur);.  }.end_i
24cb0 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69 74 65 46  nsert:.  sqliteF
24cc0 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b 0a 20 20  ree(newCell);.  
24cd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24ce0 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65  .** Delete the e
24cf0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75  ntry that the cu
24d00 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
24d10 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72   to.  The cursor
24d20 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
24d30 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
24d40 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   location..*/.in
24d50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65  t sqlite3BtreeDe
24d60 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70  lete(BtCursor *p
24d70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
24d80 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
24d90 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Page;.  unsigned
24da0 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
24db0 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
24dc0 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20  gnoChild = 0;.  
24dd0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 43 75  Btree *pBt = pCu
24de0 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
24df0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
24e00 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
24e10 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
24e20 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75  ITE ){.    /* Mu
24e30 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
24e40 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f  action before do
24e50 69 6e 67 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a  ing a delete */.
24e60 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
24e70 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
24e80 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
24e90 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
24ea0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
24eb0 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28  eadOnly );.  if(
24ec0 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d 20 70 50   pCur->idx >= pP
24ed0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
24ee0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24ef0 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63  ERROR;  /* The c
24f00 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
24f10 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e  nting to anythin
24f20 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 21  g */.  }.  if( !
24f30 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a  pCur->wrFlag ){.
24f40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24f50 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 44 69 64  E_PERM;   /* Did
24f60 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69 73 20 63   not open this c
24f70 75 72 73 6f 72 20 66 6f 72 20 77 72 69 74 69 6e  ursor for writin
24f80 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63  g */.  }.  if( c
24f90 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 42  heckReadLocks(pB
24fa0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
24fb0 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20  t, pCur) ){.    
24fc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
24fd0 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
24fe0 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
24ff0 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
25000 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 63 20 3d 20  k */.  }.  rc = 
25010 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
25020 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
25030 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
25040 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4c 6f  urn rc;..  /* Lo
25050 63 61 74 65 20 74 68 65 20 63 65 6c 6c 20 77 69  cate the cell wi
25060 74 68 69 6e 20 69 74 27 73 20 70 61 67 65 20 61  thin it's page a
25070 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20 70  nd leave pCell p
25080 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a 20  ointing to the. 
25090 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63 6c   ** data. The cl
250a0 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20 66  earCell() call f
250b0 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c 6f  rees any overflo
250c0 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
250d0 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
250e0 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c 20   cell. The cell 
250f0 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c 20  itself is still 
25100 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20 70  intact..  */.  p
25110 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
25120 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
25130 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
25140 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
25150 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74  oChild = get4byt
25160 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  e(pCell);.  }.  
25170 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
25180 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
25190 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
251a0 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
251b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f  e->leaf ){.    /
251c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74  *.    ** The ent
251d0 72 79 20 77 65 20 61 72 65 20 61 62 6f 75 74 20  ry we are about 
251e0 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74  to delete is not
251f0 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65   a leaf so if we
25200 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64   do not.    ** d
25210 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77  o something we w
25220 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65  ill leave a hole
25230 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   on an internal 
25240 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  page..    ** We 
25250 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65  have to fill the
25260 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20   hole by moving 
25270 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61  in a cell from a
25280 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20   leaf.  The.    
25290 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74  ** next Cell aft
252a0 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65  er the one to be
252b0 20 64 65 6c 65 74 65 64 20 69 73 20 67 75 61 72   deleted is guar
252c0 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
252d0 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  and.    ** to be
252e0 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61   a leaf so we ca
252f0 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f  n use it..    */
25300 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65  .    BtCursor le
25310 61 66 43 75 72 3b 0a 20 20 20 20 75 6e 73 69 67  afCur;.    unsig
25320 6e 65 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b  ned char *pNext;
25330 0a 20 20 20 20 69 6e 74 20 73 7a 4e 65 78 74 3b  .    int szNext;
25340 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64  .    int notUsed
25350 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
25360 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20  har *tempCell = 
25370 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  0;.    assert( !
25380 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
25390 29 3b 0a 20 20 20 20 67 65 74 54 65 6d 70 43 75  );.    getTempCu
253a0 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66  rsor(pCur, &leaf
253b0 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Cur);.    rc = s
253c0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
253d0 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73  &leafCur, &notUs
253e0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ed);.    if( rc!
253f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25400 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25410 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
25420 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25430 43 4f 52 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70  CORRUPT;  /* bkp
25440 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 20  t-CORRUPT */.   
25450 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
25460 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25470 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
25480 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
25490 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d  e(leafCur.pPage-
254a0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
254b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
254c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 52  E_OK ){.      TR
254d0 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61  ACE(("DELETE: ta
254e0 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69 6e  ble=%d delete in
254f0 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72  ternal from %d r
25500 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61 66  eplace from leaf
25510 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
25520 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
25530 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65   pPage->pgno, le
25540 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 67 6e  afCur.pPage->pgn
25550 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70 43  o));.      dropC
25560 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
25570 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74  >idx, cellSizePt
25580 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
25590 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  ;.      pNext = 
255a0 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75 72  findCell(leafCur
255b0 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e  .pPage, leafCur.
255c0 69 64 78 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  idx);.      szNe
255d0 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  xt = cellSizePtr
255e0 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
255f0 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73  pNext);.      as
25600 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49  sert( MX_CELL_SI
25610 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b  ZE(pBt)>=szNext+
25620 34 20 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43  4 );.      tempC
25630 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ell = sqliteMall
25640 6f 63 52 61 77 28 20 4d 58 5f 43 45 4c 4c 5f 53  ocRaw( MX_CELL_S
25650 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  IZE(pBt) );.    
25660 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d    if( tempCell==
25670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
25680 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
25690 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
256a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
256b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
256c0 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
256d0 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 70  ge, pCur->idx, p
256e0 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34  Next-4, szNext+4
256f0 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a  , tempCell, 0);.
25700 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
25710 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25720 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69       put4byte(fi
25730 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
25740 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
25750 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
25760 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
25770 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  (pPage, 0);.    
25780 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
25790 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
257a0 20 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75   dropCell(leafCu
257b0 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72  r.pPage, leafCur
257c0 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20  .idx, szNext);. 
257d0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
257e0 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  e(leafCur.pPage,
257f0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
25800 71 6c 69 74 65 46 72 65 65 28 74 65 6d 70 43 65  qliteFree(tempCe
25810 6c 6c 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  ll);.    release
25820 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66  TempCursor(&leaf
25830 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
25840 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54     TRACE(("DELET
25850 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65  E: table=%d dele
25860 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c  te from leaf %d\
25870 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d  n",.       pCur-
25880 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65  >pgnoRoot, pPage
25890 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72  ->pgno));.    dr
258a0 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  opCell(pPage, pC
258b0 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a  ur->idx, cellSiz
258c0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
258d0 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 61  l));.    rc = ba
258e0 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b  lance(pPage, 0);
258f0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
25900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25910 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
25920 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
25930 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
25940 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20 74  te a new BTree t
25950 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74  able.  Write int
25960 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70  o *piTable the p
25970 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
25980 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  r the root page 
25990 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
259a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65  ..**.** The type
259b0 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74 65   of type is dete
259c0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c  rmined by the fl
259d0 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20  ags parameter.  
259e0 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  Only the.** foll
259f0 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20  owing values of 
25a00 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65 6e  flags are curren
25a10 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68  tly in use.  Oth
25a20 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a  er values for.**
25a30 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74   flags might not
25a40 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   work:.**.**    
25a50 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54   BTREE_INTKEY|BT
25a60 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20  REE_LEAFDATA    
25a70 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61   Used for SQL ta
25a80 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64 20  bles with rowid 
25a90 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45  keys.**     BTRE
25aa0 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20  E_ZERODATA      
25ab0 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 64              Used
25ac0 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73   for SQL indices
25ad0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
25ae0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
25af0 42 74 72 65 65 20 2a 70 42 74 2c 20 69 6e 74 20  Btree *pBt, int 
25b00 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
25b10 61 67 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ags){.  MemPage 
25b20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70  *pRoot;.  Pgno p
25b30 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72  gnoRoot;.  int r
25b40 63 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  c;.  if( pBt->in
25b50 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
25b60 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73  TE ){.    /* Mus
25b70 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
25b80 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20  ction first */. 
25b90 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
25ba0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
25bb0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
25bc0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
25bd0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
25be0 61 64 4f 6e 6c 79 20 29 3b 0a 0a 20 20 2f 2a 20  adOnly );..  /* 
25bf0 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
25c00 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
25c10 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  if any cursors a
25c20 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20  re open on the. 
25c30 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
25c40 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
25c50 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
25c60 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61  e the backend ma
25c70 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d  y.  ** need to m
25c80 6f 76 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ove a database p
25c90 61 67 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d  age to make room
25ca0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 72 6f 6f   for the new roo
25cb0 74 2d 70 61 67 65 2e 0a 20 20 2a 2a 20 49 66 20  t-page..  ** If 
25cc0 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77  an open cursor w
25cd0 61 73 20 75 73 69 6e 67 20 74 68 65 20 70 61 67  as using the pag
25ce0 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c  e a problem woul
25cf0 64 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20  d occur..  */.  
25d00 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  if( pBt->pCursor
25d10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
25d20 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
25d30 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
25d40 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25d50 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
25d60 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74  Page(pBt, &pRoot
25d70 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20  , &pgnoRoot, 1, 
25d80 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
25d90 65 74 75 72 6e 20 72 63 3b 0a 23 65 6c 73 65 0a  eturn rc;.#else.
25da0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
25db0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
25dc0 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20  o pgnoMove;     
25dd0 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20   /* Move a page 
25de0 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f  here to make roo
25df0 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  m for the root-p
25e00 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  age */.    MemPa
25e10 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f  ge *pPageMove; /
25e20 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f  * The page to mo
25e30 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f  ve to. */..    /
25e40 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65  * Read the value
25e50 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d   of meta[3] from
25e60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
25e70 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65   determine where
25e80 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74   the.    ** root
25e90 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
25ea0 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f   table should go
25eb0 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65  . meta[3] is the
25ec0 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
25ed0 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  ge.    ** create
25ee0 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65  d so far, so the
25ef0 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69   new root-page i
25f00 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20  s (meta[3]+1).. 
25f10 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
25f20 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
25f30 74 61 28 70 42 74 2c 20 34 2c 20 26 70 67 6e 6f  ta(pBt, 4, &pgno
25f40 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
25f50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
25f60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 67  eturn rc;.    pg
25f70 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f  noRoot++;..    /
25f80 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  * The new root-p
25f90 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  age may not be a
25fa0 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f  llocated on a po
25fb0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
25fc0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45  or the.    ** PE
25fd0 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e  NDING_BYTE page.
25fe0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25ff0 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50  pgnoRoot==PTRMAP
26000 5f 50 41 47 45 4e 4f 28 70 42 74 2d 3e 75 73 61  _PAGENO(pBt->usa
26010 62 6c 65 53 69 7a 65 2c 20 70 67 6e 6f 52 6f 6f  bleSize, pgnoRoo
26020 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67  t) ||.        pg
26030 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f  noRoot==PENDING_
26040 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
26050 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74  {.      pgnoRoot
26060 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ++;.    }.    as
26070 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d  sert( pgnoRoot>=
26080 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c  3 );..    /* All
26090 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20 54 68  ocate a page. Th
260a0 65 20 70 61 67 65 20 74 68 61 74 20 63 75 72 72  e page that curr
260b0 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61 74  ently resides at
260c0 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20   pgnoRoot will. 
260d0 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74     ** be moved t
260e0 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
260f0 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65  page (unless the
26100 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
26110 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74  happens.    ** t
26120 6f 20 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f  o reside at pgno
26130 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  Root)..    */.  
26140 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50    rc = allocateP
26150 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d  age(pBt, &pPageM
26160 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20  ove, &pgnoMove, 
26170 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20  pgnoRoot, 1);.  
26180 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26190 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
261a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
261b0 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21     if( pgnoMove!
261c0 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20  =pgnoRoot ){.   
261d0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
261e0 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
261f0 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ;..      release
26200 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b  Page(pPageMove);
26210 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50  .      rc = getP
26220 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  age(pBt, pgnoRoo
26230 74 2c 20 26 70 52 6f 6f 74 29 3b 0a 20 20 20 20  t, &pRoot);.    
26240 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26250 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
26260 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26270 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  }.      rc = ptr
26280 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f  mapGet(pBt, pgno
26290 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69  Root, &eType, &i
262a0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
262b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
262c0 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  K || eType==PTRM
262d0 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65  AP_ROOTPAGE || e
262e0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
262f0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
26300 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
26310 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
26320 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
26330 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
26340 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
26350 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73  PAGE );.      as
26360 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
26370 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a  MAP_FREEPAGE );.
26380 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26390 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 52  e3pager_write(pR
263a0 6f 6f 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  oot->aData);.   
263b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
263c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
263d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
263e0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
263f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
26400 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
26410 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f  tePage(pBt, pRoo
26420 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  t, eType, iPtrPa
26430 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a 20  ge, pgnoMove);. 
26440 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
26450 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 69  (pRoot);.      i
26460 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26470 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
26480 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
26490 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67       rc = getPag
264a0 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
264b0 20 26 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20   &pRoot);.      
264c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
264d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
264e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
264f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26500 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 52  e3pager_write(pR
26510 6f 6f 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  oot->aData);.   
26520 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26530 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26540 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
26550 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
26560 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
26570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26580 70 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76  pRoot = pPageMov
26590 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f  e;.    } ..    /
265a0 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 6f 69  * Update the poi
265b0 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74  nter-map and met
265c0 61 2d 64 61 74 61 20 77 69 74 68 20 74 68 65 20  a-data with the 
265d0 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  new root-page nu
265e0 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20  mber. */.    rc 
265f0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
26600 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41   pgnoRoot, PTRMA
26610 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a  P_ROOTPAGE, 0);.
26620 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
26630 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
26640 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65  pRoot);.      re
26650 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
26660 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
26670 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70  treeUpdateMeta(p
26680 42 74 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29  Bt, 4, pgnoRoot)
26690 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
266a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
266b0 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
266c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
266d0 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ..  }else{.    r
266e0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67 65  c = allocatePage
266f0 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
26700 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
26710 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
26720 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
26730 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  if.  assert( sql
26740 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
26750 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 61 44 61  eable(pRoot->aDa
26760 74 61 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ta) );.  zeroPag
26770 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c  e(pRoot, flags |
26780 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71   PTF_LEAF);.  sq
26790 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
267a0 28 70 52 6f 6f 74 2d 3e 61 44 61 74 61 29 3b 0a  (pRoot->aData);.
267b0 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e    *piTable = (in
267c0 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65  t)pgnoRoot;.  re
267d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
267e0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74  }../*.** Erase t
267f0 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
26800 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69  e page and all i
26810 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65  ts children.  Re
26820 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  turn.** the page
26830 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
26840 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26850 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
26860 65 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 2c  e(.  Btree *pBt,
26870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26880 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e  e BTree that con
26890 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
268a0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
268b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
268c0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65  ge number to cle
268d0 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ar */.  MemPage 
268e0 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a  *pParent,     /*
268f0 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e   Parent page.  N
26900 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ULL for the root
26910 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61   */.  int freePa
26920 67 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44  geFlag      /* D
26930 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69  eallocate page i
26940 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d  f true */.){.  M
26950 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
26960 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
26970 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
26980 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ell;.  int i;.. 
26990 20 69 66 28 20 70 67 6e 6f 3e 73 71 6c 69 74 65   if( pgno>sqlite
269a0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
269b0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
269c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
269d0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a  TE_CORRUPT;.  }.
269e0 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
269f0 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
26a00 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e  , &pPage, pParen
26a10 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  t);.  if( rc ) g
26a20 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
26a30 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 72 63 20  epage_out;.  rc 
26a40 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
26a50 72 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  rite(pPage->aDat
26a60 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  a);.  if( rc ) g
26a70 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
26a80 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72  epage_out;.  for
26a90 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
26aa0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
26ab0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
26ac0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
26ad0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
26ae0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63   ){.      rc = c
26af0 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
26b00 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70  (pBt, get4byte(p
26b10 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50  Cell), pPage->pP
26b20 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20  arent, 1);.     
26b30 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
26b40 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
26b50 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
26b60 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
26b70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
26b80 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
26b90 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
26ba0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  e_out;.  }.  if(
26bb0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
26bc0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
26bd0 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
26be0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
26bf0 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61  ->aData[8]), pPa
26c00 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b  ge->pParent, 1);
26c10 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
26c20 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
26c30 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
26c40 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67  if( freePageFlag
26c50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
26c60 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
26c70 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 65 72 6f 50  }else{.    zeroP
26c80 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65  age(pPage, pPage
26c90 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46  ->aData[0] | PTF
26ca0 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65  _LEAF);.  }..cle
26cb0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
26cc0 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ut:.  releasePag
26cd0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  e(pPage);.  retu
26ce0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26cf0 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72  Delete all infor
26d00 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69  mation from a si
26d10 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table in th
26d20 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54 61  e database.  iTa
26d30 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61  ble is.** the pa
26d40 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
26d50 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
26d60 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  le.  After this 
26d70 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c  routine returns,
26d80 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
26d90 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20  e is empty, but 
26da0 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a  still exists..**
26db0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
26dc0 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
26dd0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
26de0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
26df0 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73  pen.** read curs
26e00 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ors on the table
26e10 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75  .  Open write cu
26e20 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20  rsors are moved 
26e30 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f  to the.** root o
26e40 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  f the table..*/.
26e50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
26e60 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65 65  ClearTable(Btree
26e70 20 2a 70 42 74 2c 20 69 6e 74 20 69 54 61 62 6c   *pBt, int iTabl
26e80 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
26e90 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
26ea0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
26eb0 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
26ec0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
26ed0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
26ee0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
26ef0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
26f00 7d 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  }.  for(pCur=pBt
26f10 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
26f20 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
26f30 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  t){.    if( pCur
26f40 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e  ->pgnoRoot==(Pgn
26f50 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  o)iTable ){.    
26f60 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c    if( pCur->wrFl
26f70 61 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ag==0 ) return S
26f80 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
26f90 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70      moveToRoot(p
26fa0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
26fb0 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
26fc0 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 28 50  basePage(pBt, (P
26fd0 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 30  gno)iTable, 0, 0
26fe0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
26ff0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
27000 6f 6c 6c 62 61 63 6b 28 70 42 74 29 3b 0a 20 20  ollback(pBt);.  
27010 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27020 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c  ../*.** Erase al
27030 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  l information in
27040 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64   a table and add
27050 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
27060 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65   table to.** the
27070 20 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65   freelist.  Exce
27080 70 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  pt, the root of 
27090 74 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61  the principle ta
270a0 62 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a  ble (the one on.
270b0 2a 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e 65  ** page 1) is ne
270c0 76 65 72 20 61 64 64 65 64 20 74 6f 20 74 68 65  ver added to the
270d0 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
270e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
270f0 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c  ll fail with SQL
27100 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68  ITE_LOCKED if th
27110 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e  ere are any open
27120 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  .** cursors on t
27130 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
27140 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73  If AUTOVACUUM is
27150 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65   enabled and the
27160 20 70 61 67 65 20 61 74 20 69 54 61 62 6c 65 20   page at iTable 
27170 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a  is not the last.
27180 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  ** root page in 
27190 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
271a0 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  e, then the last
271b0 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69   root page .** i
271c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
271d0 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74  ile is moved int
271e0 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65  o the slot forme
271f0 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a  rly occupied by.
27200 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68  ** iTable and th
27210 61 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72  at last slot for
27220 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62  merly occupied b
27230 79 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  y the last root 
27240 70 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64  page.** is added
27250 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
27260 20 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62   instead of iTab
27270 6c 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79  le.  In this say
27280 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61  , all.** root pa
27290 67 65 73 20 61 72 65 20 6b 65 70 74 20 61 74 20  ges are kept at 
272a0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
272b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
272c0 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  le, which.** is 
272d0 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 41 55  necessary for AU
272e0 54 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b  TOVACUUM to work
272f0 20 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65   right.  *piMove
27300 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
27310 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
27320 74 68 61 74 20 75 73 65 64 20 74 6f 20 62 65 20  that used to be 
27330 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
27340 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62  ge in the file b
27350 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76  efore.** the mov
27360 65 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67  e.  If no page g
27370 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f  ets moved, *piMo
27380 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ved is set to 0.
27390 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f  .** The last roo
273a0 74 20 70 61 67 65 20 69 73 20 72 65 63 6f 72 64  t page is record
273b0 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e  ed in meta[3] an
273c0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
273d0 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64  * meta[3] is upd
273e0 61 74 65 64 20 62 79 20 74 68 69 73 20 70 72 6f  ated by this pro
273f0 63 65 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  cedure..*/.int s
27400 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
27410 61 62 6c 65 28 42 74 72 65 65 20 2a 70 42 74 2c  able(Btree *pBt,
27420 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
27430 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e   *piMoved){.  in
27440 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
27450 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 69  *pPage = 0;..  i
27460 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 21  f( pBt->inTrans!
27470 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
27480 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
27490 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
274a0 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
274b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
274c0 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67    /* It is illeg
274d0 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62  al to drop a tab
274e0 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  le if any cursor
274f0 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  s are open on th
27500 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
27510 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
27520 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
27530 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64  mode the backend
27540 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74   may.  ** need t
27550 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72  o move another r
27560 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c  oot-page to fill
27570 20 61 20 67 61 70 20 6c 65 66 74 20 62 79 20 74   a gap left by t
27580 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20  he deleted.  ** 
27590 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e  root page. If an
275a0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73   open cursor was
275b0 20 75 73 69 6e 67 20 74 68 69 73 20 70 61 67 65   using this page
275c0 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64   a problem would
275d0 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20   .  ** occur..  
275e0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43  */.  if( pBt->pC
275f0 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  ursor ){.    ret
27600 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
27610 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67  D;.  }..  rc = g
27620 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
27630 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65  o)iTable, &pPage
27640 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
27650 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
27660 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
27670 72 54 61 62 6c 65 28 70 42 74 2c 20 69 54 61 62  rTable(pBt, iTab
27680 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  le);.  if( rc ){
27690 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
276a0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  (pPage);.    ret
276b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a  urn rc;.  }..  *
276c0 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  piMoved = 0;..  
276d0 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a  if( iTable>1 ){.
276e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
276f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
27700 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
27710 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65  pPage);.    rele
27720 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
27730 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42  #else.    if( pB
27740 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
27750 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52  .      Pgno maxR
27760 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72  ootPgno;.      r
27770 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
27780 47 65 74 4d 65 74 61 28 70 42 74 2c 20 34 2c 20  GetMeta(pBt, 4, 
27790 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20  &maxRootPgno);. 
277a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
277b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
277c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
277d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
277e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
277f0 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62  ..      if( iTab
27800 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20  le==maxRootPgno 
27810 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
27820 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
27830 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20   dropped is the 
27840 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c  table with the l
27850 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
27860 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
27870 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
27880 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74  se, put the root
27890 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65   page on the fre
278a0 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20  e list. .       
278b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
278c0 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
278d0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
278e0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
278f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
27900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27910 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
27920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
27940 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
27950 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e  g dropped does n
27960 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67  ot have the larg
27970 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
27980 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
27990 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
279a0 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67   So move the pag
279b0 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f  e that does into
279c0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
279d0 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
279e0 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61   deleted root-pa
279f0 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ge..        */. 
27a00 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
27a10 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72  pMove;.        r
27a20 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
27a30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
27a40 67 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78  getPage(pBt, max
27a50 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65  RootPgno, &pMove
27a60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27a70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27a80 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
27a90 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
27aa0 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
27ab0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d  catePage(pBt, pM
27ac0 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  ove, PTRMAP_ROOT
27ad0 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 29  PAGE, 0, iTable)
27ae0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
27af0 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
27b00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
27b10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27b20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
27b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27b40 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
27b50 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
27b60 20 26 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20   &pMove);.      
27b70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27b80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
27b90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
27bb0 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76   = freePage(pMov
27bc0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
27bd0 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  asePage(pMove);.
27be0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
27bf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27c00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
27c10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27c20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d      *piMoved = m
27c30 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
27c40 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
27c50 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72  t the new 'max-r
27c60 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20  oot-page' value 
27c70 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
27c80 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20  header. This.   
27c90 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64     ** is the old
27ca0 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c   value less one,
27cb0 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69   less one more i
27cc0 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74  f that happens t
27cd0 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20  o.      ** be a 
27ce0 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
27cf0 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e  , less one again
27d00 20 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a   if that is the.
27d10 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47        ** PENDING
27d20 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20  _BYTE_PAGE..    
27d30 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f    */.      maxRo
27d40 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
27d50 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
27d60 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
27d70 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
27d80 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
27d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27da0 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
27db0 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
27dc0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2c 20  Bt->usableSize, 
27dd0 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a  maxRootPgno) ){.
27de0 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50          maxRootP
27df0 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  gno--;.      }. 
27e00 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61 78       assert( max
27e10 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  RootPgno!=PENDIN
27e20 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
27e30 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   );..      rc = 
27e40 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
27e50 74 65 4d 65 74 61 28 70 42 74 2c 20 34 2c 20 6d  teMeta(pBt, 4, m
27e60 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
27e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
27e80 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
27e90 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e);.      releas
27ea0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
27eb0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
27ec0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71  se{.    /* If sq
27ed0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
27ee0 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f  ble was called o
27ef0 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20  n page 1. */.   
27f00 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
27f10 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
27f20 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65  LEAF );.    rele
27f30 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
27f40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27f50 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    .}.../*.** Rea
27f60 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72  d the meta-infor
27f70 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20  mation out of a 
27f80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
27f90 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68  Meta[0].** is th
27fa0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
27fb0 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
27fc0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
27fd0 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68  .  Meta[1].** th
27fe0 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61  rough meta[15] a
27ff0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  re available for
28000 20 75 73 65 20 62 79 20 68 69 67 68 65 72 20 6c   use by higher l
28010 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a  ayers.  Meta[0].
28020 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  ** is read-only,
28030 20 74 68 65 20 6f 74 68 65 72 73 20 61 72 65 20   the others are 
28040 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a  read/write..** .
28050 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61  ** The schema la
28060 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61  yer numbers meta
28070 20 76 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e   values differen
28080 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63 68  tly.  At the sch
28090 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e  ema.** layer (an
280a0 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20  d the SetCookie 
280b0 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f  and ReadCookie o
280c0 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62  pcodes) the numb
280d0 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61  er of.** free pa
280e0 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62  ges is not visib
280f0 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30  le.  So Cookie[0
28100 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  ] is the same as
28110 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74   Meta[1]..*/.int
28120 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
28130 4d 65 74 61 28 42 74 72 65 65 20 2a 70 42 74 2c  Meta(Btree *pBt,
28140 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70   int idx, u32 *p
28150 4d 65 74 61 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Meta){.  int rc;
28160 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
28170 20 2a 70 50 31 3b 0a 0a 20 20 61 73 73 65 72 74   *pP1;..  assert
28180 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
28190 3d 31 35 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  =15 );.  rc = sq
281a0 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
281b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20 28  Bt->pPager, 1, (
281c0 76 6f 69 64 2a 2a 29 26 70 50 31 29 3b 0a 20 20  void**)&pP1);.  
281d0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
281e0 72 63 3b 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67  rc;.  *pMeta = g
281f0 65 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20  et4byte(&pP1[36 
28200 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73 71 6c  + idx*4]);.  sql
28210 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
28220 70 50 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  pP1);..  /* If a
28230 75 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64  utovacuumed is d
28240 69 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20  isabled in this 
28250 62 75 69 6c 64 20 62 75 74 20 77 65 20 61 72 65  build but we are
28260 20 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a   trying to .  **
28270 20 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76   access an autov
28280 61 63 75 75 6d 65 64 20 64 61 74 61 62 61 73 65  acuumed database
28290 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20  , then make the 
282a0 64 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c  database readonl
282b0 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  y. .  */.#ifdef 
282c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
282d0 56 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78  VACUUM.  if( idx
282e0 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30 20  ==4 && *pMeta>0 
282f0 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ) pBt->readOnly 
28300 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72  = 1;.#endif..  r
28310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
28330 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta-information
28340 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
28350 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30  atabase.  Meta[0
28360 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c  ] is.** read-onl
28370 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65  y and may not be
28380 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74   written..*/.int
28390 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
283a0 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70  ateMeta(Btree *p
283b0 42 74 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32  Bt, int idx, u32
283c0 20 69 4d 65 74 61 29 7b 0a 20 20 75 6e 73 69 67   iMeta){.  unsig
283d0 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20  ned char *pP1;. 
283e0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
283f0 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69 64 78  t( idx>=1 && idx
28400 3c 3d 31 35 20 29 3b 0a 20 20 69 66 28 20 70 42  <=15 );.  if( pB
28410 74 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  t->inTrans!=TRAN
28420 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
28430 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f  eturn pBt->readO
28440 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
28450 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
28460 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65  RROR;.  }.  asse
28470 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 21  rt( pBt->pPage1!
28480 3d 30 20 29 3b 0a 20 20 70 50 31 20 3d 20 70 42  =0 );.  pP1 = pB
28490 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
284a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
284b0 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 31 29  pager_write(pP1)
284c0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
284d0 75 72 6e 20 72 63 3b 0a 20 20 70 75 74 34 62 79  urn rc;.  put4by
284e0 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78  te(&pP1[36 + idx
284f0 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 20 20 72  *4], iMeta);.  r
28500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
28520 20 74 68 65 20 66 6c 61 67 20 62 79 74 65 20 61   the flag byte a
28530 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
28540 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
28550 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   the cursor.** i
28560 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
28570 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20  ting to..*/.int 
28580 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67  sqlite3BtreeFlag
28590 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
285a0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
285b0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
285c0 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  e;.  return pPag
285d0 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  e ? pPage->aData
285e0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
285f0 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  t] : 0;.}..#ifde
28600 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
28610 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 64 69 73  *.** Print a dis
28620 61 73 73 65 6d 62 6c 79 20 6f 66 20 74 68 65 20  assembly of the 
28630 67 69 76 65 6e 20 70 61 67 65 20 6f 6e 20 73 74  given page on st
28640 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 20 20  andard output.  
28650 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
28660 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  is used for debu
28670 67 67 69 6e 67 20 61 6e 64 20 74 65 73 74 69 6e  gging and testin
28680 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  g only..*/.stati
28690 63 20 69 6e 74 20 62 74 72 65 65 50 61 67 65 44  c int btreePageD
286a0 75 6d 70 28 42 74 72 65 65 20 2a 70 42 74 2c 20  ump(Btree *pBt, 
286b0 69 6e 74 20 70 67 6e 6f 2c 20 69 6e 74 20 72 65  int pgno, int re
286c0 63 75 72 73 69 76 65 2c 20 4d 65 6d 50 61 67 65  cursive, MemPage
286d0 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e   *pParent){.  in
286e0 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
286f0 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c  *pPage;.  int i,
28700 20 6a 2c 20 63 3b 0a 20 20 69 6e 74 20 6e 46 72   j, c;.  int nFr
28710 65 65 3b 0a 20 20 75 31 36 20 69 64 78 3b 0a 20  ee;.  u16 idx;. 
28720 20 69 6e 74 20 68 64 72 3b 0a 20 20 69 6e 74 20   int hdr;.  int 
28730 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 73 49  nCell;.  int isI
28740 6e 69 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  nit;.  unsigned 
28750 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 63 68  char *data;.  ch
28760 61 72 20 72 61 6e 67 65 5b 32 30 5d 3b 0a 20 20  ar range[20];.  
28770 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 61  unsigned char pa
28780 79 6c 6f 61 64 5b 32 30 5d 3b 0a 0a 20 20 72 63  yload[20];..  rc
28790 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
287a0 28 50 67 6e 6f 29 70 67 6e 6f 2c 20 26 70 50 61  (Pgno)pgno, &pPa
287b0 67 65 29 3b 0a 20 20 69 73 49 6e 69 74 20 3d 20  ge);.  isInit = 
287c0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
287d0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
287e0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 69  it==0 ){.    ini
287f0 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  tPage(pPage, pPa
28800 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rent);.  }.  if(
28810 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
28820 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 68 64 72 20  n rc;.  }.  hdr 
28830 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
28840 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  et;.  data = pPa
28850 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 63 20 3d  ge->aData;.  c =
28860 20 64 61 74 61 5b 68 64 72 5d 3b 0a 20 20 70 50   data[hdr];.  pP
28870 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 63  age->intKey = (c
28880 20 26 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50   & (PTF_INTKEY|P
28890 54 46 5f 4c 45 41 46 44 41 54 41 29 29 21 3d 30  TF_LEAFDATA))!=0
288a0 3b 0a 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44  ;.  pPage->zeroD
288b0 61 74 61 20 3d 20 28 63 20 26 20 50 54 46 5f 5a  ata = (c & PTF_Z
288c0 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20 20 70  ERODATA)!=0;.  p
288d0 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d  Page->leafData =
288e0 20 28 63 20 26 20 50 54 46 5f 4c 45 41 46 44 41   (c & PTF_LEAFDA
288f0 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d  TA)!=0;.  pPage-
28900 3e 6c 65 61 66 20 3d 20 28 63 20 26 20 50 54 46  >leaf = (c & PTF
28910 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61  _LEAF)!=0;.  pPa
28920 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28  ge->hasData = !(
28930 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
28940 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66  || (!pPage->leaf
28950 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44   && pPage->leafD
28960 61 74 61 29 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ata));.  nCell =
28970 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
28980 68 64 72 2b 33 5d 29 3b 0a 20 20 73 71 6c 69 74  hdr+3]);.  sqlit
28990 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50  e3DebugPrintf("P
289a0 41 47 45 20 25 64 3a 20 20 66 6c 61 67 73 3d 30  AGE %d:  flags=0
289b0 78 25 30 32 78 20 20 66 72 61 67 3d 25 64 20 20  x%02x  frag=%d  
289c0 20 70 61 72 65 6e 74 3d 25 64 5c 6e 22 2c 20 70   parent=%d\n", p
289d0 67 6e 6f 2c 0a 20 20 20 20 64 61 74 61 5b 68 64  gno,.    data[hd
289e0 72 5d 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c  r], data[hdr+7],
289f0 20 0a 20 20 20 20 28 70 50 61 67 65 2d 3e 69 73   .    (pPage->is
28a00 49 6e 69 74 20 26 26 20 70 50 61 67 65 2d 3e 70  Init && pPage->p
28a10 50 61 72 65 6e 74 29 20 3f 20 70 50 61 67 65 2d  Parent) ? pPage-
28a20 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 20 3a  >pParent->pgno :
28a30 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68   0);.  assert( h
28a40 64 72 20 3d 3d 20 28 70 67 6e 6f 3d 3d 31 20 3f  dr == (pgno==1 ?
28a50 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 69   100 : 0) );.  i
28a60 64 78 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  dx = hdr + 12 - 
28a70 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20  pPage->leaf*4;. 
28a80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
28a90 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43 65 6c  l; i++){.    Cel
28aa0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
28ab0 50 67 6e 6f 20 63 68 69 6c 64 3b 0a 20 20 20 20  Pgno child;.    
28ac0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
28ad0 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Cell;.    int sz
28ae0 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  ;.    int addr;.
28af0 0a 20 20 20 20 61 64 64 72 20 3d 20 67 65 74 32  .    addr = get2
28b00 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 20 2b  byte(&data[idx +
28b10 20 32 2a 69 5d 29 3b 0a 20 20 20 20 70 43 65 6c   2*i]);.    pCel
28b20 6c 20 3d 20 26 64 61 74 61 5b 61 64 64 72 5d 3b  l = &data[addr];
28b30 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74  .    parseCellPt
28b40 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
28b50 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d  &info);.    sz =
28b60 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20   info.nSize;.   
28b70 20 73 70 72 69 6e 74 66 28 72 61 6e 67 65 2c 22   sprintf(range,"
28b80 25 64 2e 2e 25 64 22 2c 20 61 64 64 72 2c 20 61  %d..%d", addr, a
28b90 64 64 72 2b 73 7a 2d 31 29 3b 0a 20 20 20 20 69  ddr+sz-1);.    i
28ba0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
28bb0 7b 0a 20 20 20 20 20 20 63 68 69 6c 64 20 3d 20  {.      child = 
28bc0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
28bd0 20 20 20 20 63 68 69 6c 64 20 3d 20 67 65 74 34      child = get4
28be0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
28bf0 20 7d 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f   }.    sz = info
28c00 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  .nData;.    if( 
28c10 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
28c20 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79   sz += info.nKey
28c30 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 73 69 7a  ;.    if( sz>siz
28c40 65 6f 66 28 70 61 79 6c 6f 61 64 29 2d 31 20 29  eof(payload)-1 )
28c50 20 73 7a 20 3d 20 73 69 7a 65 6f 66 28 70 61 79   sz = sizeof(pay
28c60 6c 6f 61 64 29 2d 31 3b 0a 20 20 20 20 6d 65 6d  load)-1;.    mem
28c70 63 70 79 28 70 61 79 6c 6f 61 64 2c 20 26 70 43  cpy(payload, &pC
28c80 65 6c 6c 5b 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ell[info.nHeader
28c90 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 66 6f 72 28  ], sz);.    for(
28ca0 6a 3d 30 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b  j=0; j<sz; j++){
28cb0 0a 20 20 20 20 20 20 69 66 28 20 70 61 79 6c 6f  .      if( paylo
28cc0 61 64 5b 6a 5d 3c 30 78 32 30 20 7c 7c 20 70 61  ad[j]<0x20 || pa
28cd0 79 6c 6f 61 64 5b 6a 5d 3e 30 78 37 66 20 29 20  yload[j]>0x7f ) 
28ce0 70 61 79 6c 6f 61 64 5b 6a 5d 20 3d 20 27 2e 27  payload[j] = '.'
28cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 79 6c  ;.    }.    payl
28d00 6f 61 64 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20  oad[sz] = 0;.   
28d10 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
28d20 6e 74 66 28 0a 20 20 20 20 20 20 22 63 65 6c 6c  ntf(.      "cell
28d30 20 25 32 64 3a 20 69 3d 25 2d 31 30 73 20 63 68   %2d: i=%-10s ch
28d40 6c 64 3d 25 2d 34 64 20 6e 6b 3d 25 2d 34 6c 6c  ld=%-4d nk=%-4ll
28d50 64 20 6e 64 3d 25 2d 34 64 20 70 61 79 6c 6f 61  d nd=%-4d payloa
28d60 64 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 69  d=%s\n",.      i
28d70 2c 20 72 61 6e 67 65 2c 20 63 68 69 6c 64 2c 20  , range, child, 
28d80 69 6e 66 6f 2e 6e 4b 65 79 2c 20 69 6e 66 6f 2e  info.nKey, info.
28d90 6e 44 61 74 61 2c 20 70 61 79 6c 6f 61 64 0a 20  nData, payload. 
28da0 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20     );.  }.  if( 
28db0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
28dc0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
28dd0 50 72 69 6e 74 66 28 22 72 69 67 68 74 5f 63 68  Printf("right_ch
28de0 69 6c 64 3a 20 25 64 5c 6e 22 2c 20 67 65 74 34  ild: %d\n", get4
28df0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 38  byte(&data[hdr+8
28e00 5d 29 29 3b 0a 20 20 7d 0a 20 20 6e 46 72 65 65  ]));.  }.  nFree
28e10 20 3d 20 30 3b 0a 20 20 69 20 3d 20 30 3b 0a 20   = 0;.  i = 0;. 
28e20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65 28   idx = get2byte(
28e30 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
28e40 20 77 68 69 6c 65 28 20 69 64 78 3e 30 20 26 26   while( idx>0 &&
28e50 20 69 64 78 3c 70 50 61 67 65 2d 3e 70 42 74 2d   idx<pPage->pBt-
28e60 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
28e70 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32     int sz = get2
28e80 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 2b 32  byte(&data[idx+2
28e90 5d 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  ]);.    sprintf(
28ea0 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64 22 2c 20  range,"%d..%d", 
28eb0 69 64 78 2c 20 69 64 78 2b 73 7a 2d 31 29 3b 0a  idx, idx+sz-1);.
28ec0 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 7a 3b      nFree += sz;
28ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
28ee0 67 50 72 69 6e 74 66 28 22 66 72 65 65 62 6c 6f  gPrintf("freeblo
28ef0 63 6b 20 25 32 64 3a 20 69 3d 25 2d 31 30 73 20  ck %2d: i=%-10s 
28f00 73 69 7a 65 3d 25 2d 34 64 20 74 6f 74 61 6c 3d  size=%-4d total=
28f10 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
28f20 20 72 61 6e 67 65 2c 20 73 7a 2c 20 6e 46 72 65   range, sz, nFre
28f30 65 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 67 65  e);.    idx = ge
28f40 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t2byte(&data[idx
28f50 5d 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d  ]);.    i++;.  }
28f60 0a 20 20 69 66 28 20 69 64 78 21 3d 30 20 29 7b  .  if( idx!=0 ){
28f70 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
28f80 67 50 72 69 6e 74 66 28 22 45 52 52 4f 52 3a 20  gPrintf("ERROR: 
28f90 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 69  next freeblock i
28fa0 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndex out of rang
28fb0 65 3a 20 25 64 5c 6e 22 2c 20 69 64 78 29 3b 0a  e: %d\n", idx);.
28fc0 20 20 7d 0a 20 20 69 66 28 20 72 65 63 75 72 73    }.  if( recurs
28fd0 69 76 65 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  ive && !pPage->l
28fe0 65 61 66 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  eaf ){.    for(i
28ff0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
29000 29 7b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65  ){.      unsigne
29010 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 20 3d 20  d char *pCell = 
29020 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
29030 69 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  i);.      btreeP
29040 61 67 65 44 75 6d 70 28 70 42 74 2c 20 67 65 74  ageDump(pBt, get
29050 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c  4byte(pCell), 1,
29060 20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69   pPage);.      i
29070 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 70 43  dx = get2byte(pC
29080 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ell);.    }.    
29090 62 74 72 65 65 50 61 67 65 44 75 6d 70 28 70 42  btreePageDump(pB
290a0 74 2c 20 67 65 74 34 62 79 74 65 28 26 64 61 74  t, get4byte(&dat
290b0 61 5b 68 64 72 2b 38 5d 29 2c 20 31 2c 20 70 50  a[hdr+8]), 1, pP
290c0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  age);.  }.  pPag
290d0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
290e0 69 74 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67  it;.  sqlite3pag
290f0 65 72 5f 75 6e 72 65 66 28 64 61 74 61 29 3b 0a  er_unref(data);.
29100 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
29110 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29120 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
29130 74 65 33 42 74 72 65 65 50 61 67 65 44 75 6d 70  te3BtreePageDump
29140 28 42 74 72 65 65 20 2a 70 42 74 2c 20 69 6e 74  (Btree *pBt, int
29150 20 70 67 6e 6f 2c 20 69 6e 74 20 72 65 63 75 72   pgno, int recur
29160 73 69 76 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  sive){.  return 
29170 62 74 72 65 65 50 61 67 65 44 75 6d 70 28 70 42  btreePageDump(pB
29180 74 2c 20 70 67 6e 6f 2c 20 72 65 63 75 72 73 69  t, pgno, recursi
29190 76 65 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  ve, 0);.}.#endif
291a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
291b0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20  TEST./*.** Fill 
291c0 61 52 65 73 75 6c 74 5b 5d 20 77 69 74 68 20 69  aResult[] with i
291d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
291e0 20 74 68 65 20 65 6e 74 72 79 20 61 6e 64 20 70   the entry and p
291f0 61 67 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  age that the.** 
29200 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
29210 6e 67 20 74 6f 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  ng to..** .**   
29220 61 52 65 73 75 6c 74 5b 30 5d 20 3d 20 20 54 68  aResult[0] =  Th
29230 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a  e page number.**
29240 20 20 20 61 52 65 73 75 6c 74 5b 31 5d 20 3d 20     aResult[1] = 
29250 20 54 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65   The entry numbe
29260 72 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 32  r.**   aResult[2
29270 5d 20 3d 20 20 54 6f 74 61 6c 20 6e 75 6d 62 65  ] =  Total numbe
29280 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
29290 74 68 69 73 20 70 61 67 65 0a 2a 2a 20 20 20 61  this page.**   a
292a0 52 65 73 75 6c 74 5b 33 5d 20 3d 20 20 43 65 6c  Result[3] =  Cel
292b0 6c 20 73 69 7a 65 20 28 6c 6f 63 61 6c 20 70 61  l size (local pa
292c0 79 6c 6f 61 64 20 2b 20 68 65 61 64 65 72 29 0a  yload + header).
292d0 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 34 5d 20  **   aResult[4] 
292e0 3d 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65  =  Number of fre
292f0 65 20 62 79 74 65 73 20 6f 6e 20 74 68 69 73 20  e bytes on this 
29300 70 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c  page.**   aResul
29310 74 5b 35 5d 20 3d 20 20 4e 75 6d 62 65 72 20 6f  t[5] =  Number o
29320 66 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 6f 6e  f free blocks on
29330 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 61   the page.**   a
29340 52 65 73 75 6c 74 5b 36 5d 20 3d 20 20 54 6f 74  Result[6] =  Tot
29350 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  al payload size 
29360 28 6c 6f 63 61 6c 20 2b 20 6f 76 65 72 66 6c 6f  (local + overflo
29370 77 29 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  w).**   aResult[
29380 37 5d 20 3d 20 20 48 65 61 64 65 72 20 73 69 7a  7] =  Header siz
29390 65 20 69 6e 20 62 79 74 65 73 0a 2a 2a 20 20 20  e in bytes.**   
293a0 61 52 65 73 75 6c 74 5b 38 5d 20 3d 20 20 4c 6f  aResult[8] =  Lo
293b0 63 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65  cal payload size
293c0 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 39 5d  .**   aResult[9]
293d0 20 3d 20 20 50 61 72 65 6e 74 20 70 61 67 65 20   =  Parent page 
293e0 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69  number.**.** Thi
293f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
29400 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
29410 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
29420 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29430 42 74 72 65 65 43 75 72 73 6f 72 49 6e 66 6f 28  BtreeCursorInfo(
29440 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
29450 69 6e 74 20 2a 61 52 65 73 75 6c 74 2c 20 69 6e  int *aResult, in
29460 74 20 75 70 43 6e 74 29 7b 0a 20 20 69 6e 74 20  t upCnt){.  int 
29470 63 6e 74 2c 20 69 64 78 3b 0a 20 20 4d 65 6d 50  cnt, idx;.  MemP
29480 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
29490 72 2d 3e 70 50 61 67 65 3b 0a 20 20 42 74 43 75  r->pPage;.  BtCu
294a0 72 73 6f 72 20 74 6d 70 43 75 72 3b 0a 0a 20 20  rsor tmpCur;..  
294b0 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70 50  pageIntegrity(pP
294c0 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  age);.  assert( 
294d0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
294e0 0a 20 20 67 65 74 54 65 6d 70 43 75 72 73 6f 72  .  getTempCursor
294f0 28 70 43 75 72 2c 20 26 74 6d 70 43 75 72 29 3b  (pCur, &tmpCur);
29500 0a 20 20 77 68 69 6c 65 28 20 75 70 43 6e 74 2d  .  while( upCnt-
29510 2d 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 50  - ){.    moveToP
29520 61 72 65 6e 74 28 26 74 6d 70 43 75 72 29 3b 0a  arent(&tmpCur);.
29530 20 20 7d 0a 20 20 70 50 61 67 65 20 3d 20 74 6d    }.  pPage = tm
29540 70 43 75 72 2e 70 50 61 67 65 3b 0a 20 20 70 61  pCur.pPage;.  pa
29550 67 65 49 6e 74 65 67 72 69 74 79 28 70 50 61 67  geIntegrity(pPag
29560 65 29 3b 0a 20 20 61 52 65 73 75 6c 74 5b 30 5d  e);.  aResult[0]
29570 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
29580 70 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  pagenumber(pPage
29590 2d 3e 61 44 61 74 61 29 3b 0a 20 20 61 73 73 65  ->aData);.  asse
295a0 72 74 28 20 61 52 65 73 75 6c 74 5b 30 5d 3d 3d  rt( aResult[0]==
295b0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
295c0 20 61 52 65 73 75 6c 74 5b 31 5d 20 3d 20 74 6d   aResult[1] = tm
295d0 70 43 75 72 2e 69 64 78 3b 0a 20 20 61 52 65 73  pCur.idx;.  aRes
295e0 75 6c 74 5b 32 5d 20 3d 20 70 50 61 67 65 2d 3e  ult[2] = pPage->
295f0 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 74 6d 70  nCell;.  if( tmp
29600 43 75 72 2e 69 64 78 3e 3d 30 20 26 26 20 74 6d  Cur.idx>=0 && tm
29610 70 43 75 72 2e 69 64 78 3c 70 50 61 67 65 2d 3e  pCur.idx<pPage->
29620 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 67 65 74  nCell ){.    get
29630 43 65 6c 6c 49 6e 66 6f 28 26 74 6d 70 43 75 72  CellInfo(&tmpCur
29640 29 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 33  );.    aResult[3
29650 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e  ] = tmpCur.info.
29660 6e 53 69 7a 65 3b 0a 20 20 20 20 61 52 65 73 75  nSize;.    aResu
29670 6c 74 5b 36 5d 20 3d 20 74 6d 70 43 75 72 2e 69  lt[6] = tmpCur.i
29680 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 61  nfo.nData;.    a
29690 52 65 73 75 6c 74 5b 37 5d 20 3d 20 74 6d 70 43  Result[7] = tmpC
296a0 75 72 2e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  ur.info.nHeader;
296b0 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 38 5d 20  .    aResult[8] 
296c0 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 4c  = tmpCur.info.nL
296d0 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ocal;.  }else{. 
296e0 20 20 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d 20     aResult[3] = 
296f0 30 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 36  0;.    aResult[6
29700 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52 65 73 75  ] = 0;.    aResu
29710 6c 74 5b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 61  lt[7] = 0;.    a
29720 52 65 73 75 6c 74 5b 38 5d 20 3d 20 30 3b 0a 20  Result[8] = 0;. 
29730 20 7d 0a 20 20 61 52 65 73 75 6c 74 5b 34 5d 20   }.  aResult[4] 
29740 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3b 0a  = pPage->nFree;.
29750 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 64 78    cnt = 0;.  idx
29760 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 50 61   = get2byte(&pPa
29770 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
29780 3e 68 64 72 4f 66 66 73 65 74 2b 31 5d 29 3b 0a  >hdrOffset+1]);.
29790 20 20 77 68 69 6c 65 28 20 69 64 78 3e 30 20 26    while( idx>0 &
297a0 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 70 42 74  & idx<pPage->pBt
297b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
297c0 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 69      cnt++;.    i
297d0 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  dx = get2byte(&p
297e0 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 64 78 5d  Page->aData[idx]
297f0 29 3b 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c 74  );.  }.  aResult
29800 5b 35 5d 20 3d 20 63 6e 74 3b 0a 20 20 69 66 28  [5] = cnt;.  if(
29810 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
29820 3d 30 20 7c 7c 20 69 73 52 6f 6f 74 50 61 67 65  =0 || isRootPage
29830 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 61  (pPage) ){.    a
29840 52 65 73 75 6c 74 5b 39 5d 20 3d 20 30 3b 0a 20  Result[9] = 0;. 
29850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65 73   }else{.    aRes
29860 75 6c 74 5b 39 5d 20 3d 20 70 50 61 67 65 2d 3e  ult[9] = pPage->
29870 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3b 0a 20  pParent->pgno;. 
29880 20 7d 0a 20 20 72 65 6c 65 61 73 65 54 65 6d 70   }.  releaseTemp
29890 43 75 72 73 6f 72 28 26 74 6d 70 43 75 72 29 3b  Cursor(&tmpCur);
298a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
298b0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
298c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
298d0 70 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64  pager associated
298e0 20 77 69 74 68 20 61 20 42 54 72 65 65 2e 20 20   with a BTree.  
298f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
29900 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
29910 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
29920 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72  g only..*/.Pager
29930 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61   *sqlite3BtreePa
29940 67 65 72 28 42 74 72 65 65 20 2a 70 42 74 29 7b  ger(Btree *pBt){
29950 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70  .  return pBt->p
29960 50 61 67 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Pager;.}../*.** 
29970 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  This structure i
29980 73 20 70 61 73 73 65 64 20 61 72 6f 75 6e 64 20  s passed around 
29990 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20  through all the 
299a0 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
299b0 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 69 6e 20 6f  routines.** in o
299c0 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 72 61  rder to keep tra
299d0 63 6b 20 6f 66 20 73 6f 6d 65 20 67 6c 6f 62 61  ck of some globa
299e0 6c 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  l state informat
299f0 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
29a00 73 74 72 75 63 74 20 49 6e 74 65 67 72 69 74 79  struct Integrity
29a10 43 6b 20 49 6e 74 65 67 72 69 74 79 43 6b 3b 0a  Ck IntegrityCk;.
29a20 73 74 72 75 63 74 20 49 6e 74 65 67 72 69 74 79  struct Integrity
29a30 43 6b 20 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  Ck {.  Btree *pB
29a40 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 72 65  t;    /* The tre
29a50 65 20 62 65 69 6e 67 20 63 68 65 63 6b 65 64 20  e being checked 
29a60 6f 75 74 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  out */.  Pager *
29a70 70 50 61 67 65 72 3b 20 2f 2a 20 54 68 65 20 61  pPager; /* The a
29a80 73 73 6f 63 69 61 74 65 64 20 70 61 67 65 72 2e  ssociated pager.
29a90 20 20 41 6c 73 6f 20 61 63 63 65 73 73 69 62 6c    Also accessibl
29aa0 65 20 62 79 20 70 42 74 2d 3e 70 50 61 67 65 72  e by pBt->pPager
29ab0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
29ac0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
29ad0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
29ae0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
29af0 20 2a 61 6e 52 65 66 3b 20 20 20 20 2f 2a 20 4e   *anRef;    /* N
29b00 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 65  umber of times e
29b10 61 63 68 20 70 61 67 65 20 69 73 20 72 65 66 65  ach page is refe
29b20 72 65 6e 63 65 64 20 2a 2f 0a 20 20 63 68 61 72  renced */.  char
29b30 20 2a 7a 45 72 72 4d 73 67 3b 20 2f 2a 20 41 6e   *zErrMsg; /* An
29b40 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
29b50 20 4e 55 4c 4c 20 6f 66 20 6e 6f 20 65 72 72 6f   NULL of no erro
29b60 72 73 20 73 65 65 6e 2e 20 2a 2f 0a 7d 3b 0a 0a  rs seen. */.};..
29b70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29b80 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
29b90 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  ECK./*.** Append
29ba0 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68   a message to th
29bb0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
29bc0 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
29bd0 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65  c void checkAppe
29be0 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69  ndMsg(.  Integri
29bf0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20  tyCk *pCheck,.  
29c00 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63  char *zMsg1,.  c
29c10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
29c20 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76  at,.  ....){.  v
29c30 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
29c40 72 20 2a 7a 4d 73 67 32 3b 0a 20 20 76 61 5f 73  r *zMsg2;.  va_s
29c50 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
29c60 29 3b 0a 20 20 7a 4d 73 67 32 20 3d 20 73 71 6c  );.  zMsg2 = sql
29c70 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f  ite3VMPrintf(zFo
29c80 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
29c90 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
29ca0 4d 73 67 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20  Msg1==0 ) zMsg1 
29cb0 3d 20 22 22 3b 0a 20 20 69 66 28 20 70 43 68 65  = "";.  if( pChe
29cc0 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ck->zErrMsg ){. 
29cd0 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20     char *zOld = 
29ce0 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b  pCheck->zErrMsg;
29cf0 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72  .    pCheck->zEr
29d00 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71  rMsg = 0;.    sq
29d10 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
29d20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c  pCheck->zErrMsg,
29d30 20 7a 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73   zOld, "\n", zMs
29d40 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72  g1, zMsg2, (char
29d50 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  *)0);.    sqlite
29d60 46 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 65  Free(zOld);.  }e
29d70 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
29d80 53 65 74 53 74 72 69 6e 67 28 26 70 43 68 65 63  SetString(&pChec
29d90 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67  k->zErrMsg, zMsg
29da0 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a  1, zMsg2, (char*
29db0 29 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  )0);.  }.  sqlit
29dc0 65 46 72 65 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a  eFree(zMsg2);.}.
29dd0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
29de0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
29df0 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
29e00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
29e10 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
29e20 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20 74 68 65  .** Add 1 to the
29e30 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
29e40 20 66 6f 72 20 70 61 67 65 20 69 50 61 67 65 2e   for page iPage.
29e50 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
29e60 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72   second.** refer
29e70 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
29e80 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d  , add an error m
29e90 65 73 73 61 67 65 20 74 6f 20 70 43 68 65 63 6b  essage to pCheck
29ea0 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65  ->zErrMsg..** Re
29eb0 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20  turn 1 if there 
29ec0 61 72 65 20 32 20 6f 72 65 20 6d 6f 72 65 20 72  are 2 ore more r
29ed0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
29ee0 20 70 61 67 65 20 61 6e 64 20 30 20 69 66 0a 2a   page and 0 if.*
29ef0 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  * if this is the
29f00 20 66 69 72 73 74 20 72 65 66 65 72 65 6e 63 65   first reference
29f10 20 74 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   to the page..**
29f20 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 74  .** Also check t
29f30 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
29f40 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e 64 73  ber is in bounds
29f50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29f60 63 68 65 63 6b 52 65 66 28 49 6e 74 65 67 72 69  checkRef(Integri
29f70 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e  tyCk *pCheck, in
29f80 74 20 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a  t iPage, char *z
29f90 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20  Context){.  if( 
29fa0 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  iPage==0 ) retur
29fb0 6e 20 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65  n 1;.  if( iPage
29fc0 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c  >pCheck->nPage |
29fd0 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a 20 20 20  | iPage<0 ){.   
29fe0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
29ff0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
2a000 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65 20  , "invalid page 
2a010 6e 75 6d 62 65 72 20 25 64 22 2c 20 69 50 61 67  number %d", iPag
2a020 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
2a030 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 68 65  ;.  }.  if( pChe
2a040 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d  ck->anRef[iPage]
2a050 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  ==1 ){.    check
2a060 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
2a070 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64  , zContext, "2nd
2a080 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
2a090 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
2a0a0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2a0b0 7d 0a 20 20 72 65 74 75 72 6e 20 20 28 70 43 68  }.  return  (pCh
2a0c0 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65  eck->anRef[iPage
2a0d0 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64  ]++)>1;.}..#ifnd
2a0e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2a0f0 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
2a100 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 65  Check that the e
2a110 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
2a120 74 65 72 2d 6d 61 70 20 66 6f 72 20 70 61 67 65  ter-map for page
2a130 20 69 43 68 69 6c 64 20 6d 61 70 73 20 74 6f 20   iChild maps to 
2a140 0a 2a 2a 20 70 61 67 65 20 69 50 61 72 65 6e 74  .** page iParent
2a150 2c 20 70 6f 69 6e 74 65 72 20 74 79 70 65 20 70  , pointer type p
2a160 74 72 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20  trType. If not, 
2a170 61 70 70 65 6e 64 20 61 6e 20 65 72 72 6f 72 20  append an error 
2a180 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43  message.** to pC
2a190 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  heck..*/.static 
2a1a0 76 6f 69 64 20 63 68 65 63 6b 50 74 72 6d 61 70  void checkPtrmap
2a1b0 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
2a1c0 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e  *pCheck,   /* In
2a1d0 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 63 6f  tegrity check co
2a1e0 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  ntext */.  Pgno 
2a1f0 69 43 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20  iChild,         
2a200 20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20    /* Child page 
2a210 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65  number */.  u8 e
2a220 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
2a230 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70     /* Expected p
2a240 6f 69 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20  ointer map type 
2a250 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e  */.  Pgno iParen
2a260 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  t,          /* E
2a270 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20  xpected pointer 
2a280 6d 61 70 20 70 61 72 65 6e 74 20 70 61 67 65 20  map parent page 
2a290 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72  number */.  char
2a2a0 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20   *zContext      
2a2b0 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65     /* Context de
2a2c0 73 63 72 69 70 74 69 6f 6e 20 28 75 73 65 64 20  scription (used 
2a2d0 66 6f 72 20 65 72 72 6f 72 20 6d 73 67 29 20 2a  for error msg) *
2a2e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
2a2f0 20 75 38 20 65 50 74 72 6d 61 70 54 79 70 65 3b   u8 ePtrmapType;
2a300 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 50  .  Pgno iPtrmapP
2a310 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70  arent;..  rc = p
2a320 74 72 6d 61 70 47 65 74 28 70 43 68 65 63 6b 2d  trmapGet(pCheck-
2a330 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c 20 26 65  >pBt, iChild, &e
2a340 50 74 72 6d 61 70 54 79 70 65 2c 20 26 69 50 74  PtrmapType, &iPt
2a350 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 69  rmapParent);.  i
2a360 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a370 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
2a380 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
2a390 43 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64  Context, "Failed
2a3a0 20 74 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20   to read ptrmap 
2a3b0 6b 65 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29  key=%d", iChild)
2a3c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2a3d0 7d 0a 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70  }..  if( ePtrmap
2a3e0 54 79 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69  Type!=eType || i
2a3f0 50 74 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50  PtrmapParent!=iP
2a400 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65  arent ){.    che
2a410 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
2a420 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20  ck, zContext, . 
2a430 20 20 20 20 20 22 42 61 64 20 70 74 72 20 6d 61       "Bad ptr ma
2a440 70 20 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65  p entry key=%d e
2a450 78 70 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20  xpected=(%d,%d) 
2a460 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20  got=(%d,%d)", . 
2a470 20 20 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79       iChild, eTy
2a480 70 65 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74  pe, iParent, ePt
2a490 72 6d 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61  rmapType, iPtrma
2a4a0 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a  pParent);.  }.}.
2a4b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
2a4c0 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
2a4d0 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  y of the freelis
2a4e0 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  t or of an overf
2a4f0 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  low page list..*
2a500 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
2a510 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
2a520 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73  s on the list is
2a530 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   N..*/.static vo
2a540 69 64 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20  id checkList(.  
2a550 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
2a560 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69  eck,  /* Integri
2a570 74 79 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74  ty checking cont
2a580 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46  ext */.  int isF
2a590 72 65 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  reeList,       /
2a5a0 2a 20 54 72 75 65 20 66 6f 72 20 61 20 66 72 65  * True for a fre
2a5b0 65 6c 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f  elist.  False fo
2a5c0 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  r overflow page 
2a5d0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50  list */.  int iP
2a5e0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
2a5f0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
2a600 6f 72 20 66 69 72 73 74 20 70 61 67 65 20 69 6e  or first page in
2a610 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69   the list */.  i
2a620 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
2a630 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
2a640 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2a650 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
2a660 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74    char *zContext
2a670 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
2a680 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
2a690 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sages */.){.  in
2a6a0 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63  t i;.  int expec
2a6b0 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69  ted = N;.  int i
2a6c0 46 69 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20  First = iPage;. 
2a6d0 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20   while( N-- > 0 
2a6e0 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  ){.    unsigned 
2a6f0 63 68 61 72 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  char *pOvfl;.   
2a700 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a   if( iPage<1 ){.
2a710 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
2a720 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
2a730 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
2a740 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73 20  "%d of %d pages 
2a750 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65  missing from ove
2a760 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74  rflow list start
2a770 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20  ing at %d",.    
2a780 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63        N+1, expec
2a790 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  ted, iFirst);.  
2a7a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2a7b0 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
2a7c0 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
2a7d0 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65   zContext) ) bre
2a7e0 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ak;.    if( sqli
2a7f0 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 43 68  te3pager_get(pCh
2a800 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67  eck->pPager, (Pg
2a810 6e 6f 29 69 50 61 67 65 2c 20 28 76 6f 69 64 2a  no)iPage, (void*
2a820 2a 29 26 70 4f 76 66 6c 29 20 29 7b 0a 20 20 20  *)&pOvfl) ){.   
2a830 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
2a840 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
2a850 78 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 67  xt, "failed to g
2a860 65 74 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  et page %d", iPa
2a870 67 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ge);.      break
2a880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2a890 69 73 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20  isFreeList ){.  
2a8a0 20 20 20 20 69 6e 74 20 6e 20 3d 20 67 65 74 34      int n = get4
2a8b0 62 79 74 65 28 26 70 4f 76 66 6c 5b 34 5d 29 3b  byte(&pOvfl[4]);
2a8c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2a8d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2a8e0 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
2a8f0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
2a900 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
2a910 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
2a920 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
2a930 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
2a940 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
2a950 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
2a960 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75  n>pCheck->pBt->u
2a970 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29 7b  sableSize/4-8 ){
2a980 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
2a990 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
2a9a0 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
2a9b0 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c       "freelist l
2a9c0 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69  eaf count too bi
2a9d0 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69  g on page %d", i
2a9e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e  Page);.        N
2a9f0 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
2aa00 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2aa10 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
2aa20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
2aa30 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  ePage = get4byte
2aa40 28 26 70 4f 76 66 6c 5b 38 2b 69 2a 34 5d 29 3b  (&pOvfl[8+i*4]);
2aa50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2aa60 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2aa70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2aa80 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  heck->pBt->autoV
2aa90 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
2aaa0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
2aab0 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61  (pCheck, iFreePa
2aac0 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
2aad0 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74  AGE, 0, zContext
2aae0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
2aaf0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
2ab00 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c  checkRef(pCheck,
2ab10 20 69 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e   iFreePage, zCon
2ab20 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  text);.        }
2ab30 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b  .        N -= n;
2ab40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
2ab50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ab60 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2ab70 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
2ab80 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73   If this databas
2ab90 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
2aba0 76 61 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65  vacuum and iPage
2abb0 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
2abc0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69  .      ** page i
2abd0 6e 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  n this overflow 
2abe0 6c 69 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74  list, check that
2abf0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2ac00 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20   entry for.     
2ac10 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
2ac20 67 20 70 61 67 65 20 6d 61 74 63 68 65 73 20 69  g page matches i
2ac30 50 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Page..      */. 
2ac40 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d       if( pCheck-
2ac50 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
2ac60 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20   && N>0 ){.     
2ac70 20 20 20 69 20 3d 20 67 65 74 34 62 79 74 65 28     i = get4byte(
2ac80 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
2ac90 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
2aca0 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56  ck, i, PTRMAP_OV
2acb0 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20  ERFLOW2, iPage, 
2acc0 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
2acd0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
2ace0 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
2acf0 62 79 74 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  byte(pOvfl);.   
2ad00 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
2ad10 72 65 66 28 70 4f 76 66 6c 29 3b 0a 20 20 7d 0a  ref(pOvfl);.  }.
2ad20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2ad30 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
2ad40 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
2ad50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ad60 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
2ad70 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73  /*.** Do various
2ad80 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f   sanity checks o
2ad90 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  n a single page 
2ada0 6f 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75  of a tree.  Retu
2adb0 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64  rn.** the tree d
2adc0 65 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65  epth.  Root page
2add0 73 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72  s return 0.  Par
2ade0 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67  ents of root pag
2adf0 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20  es.** return 1, 
2ae00 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  and so forth..**
2ae10 20 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b   .** These check
2ae20 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a  s are done:.**.*
2ae30 2a 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20  *      1.  Make 
2ae40 73 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20  sure that cells 
2ae50 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64  and freeblocks d
2ae60 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a  o not overlap.**
2ae70 20 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f            but co
2ae80 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74  mbine to complet
2ae90 65 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61  ely cover the pa
2aea0 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20  ge..**  NO  2.  
2aeb0 4d 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b  Make sure cell k
2aec0 65 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72  eys are in order
2aed0 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61  ..**  NO  3.  Ma
2aee0 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69  ke sure no key i
2aef0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
2af00 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f  qual to zLowerBo
2af10 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20  und..**  NO  4. 
2af20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65   Make sure no ke
2af30 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  y is greater tha
2af40 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55  n or equal to zU
2af50 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20  pperBound..**   
2af60 20 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65     5.  Check the
2af70 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76   integrity of ov
2af80 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
2af90 20 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73        6.  Recurs
2afa0 69 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b  ively call check
2afb0 54 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20  TreePage on all 
2afc0 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20  children..**    
2afd0 20 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61    7.  Verify tha
2afe0 74 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61  t the depth of a
2aff0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74  ll children is t
2b000 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20  he same..**     
2b010 20 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74   8.  Make sure t
2b020 68 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c  his page is at l
2b030 65 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72  east 33% full or
2b040 20 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20   else it is.**  
2b050 20 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74          the root
2b060 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f   of the tree..*/
2b070 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
2b080 6b 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74  kTreePage(.  Int
2b090 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
2b0a0 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f  ,  /* Context fo
2b0b0 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65  r the sanity che
2b0c0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67  ck */.  int iPag
2b0d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
2b0e0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
2b0f0 74 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63  the page to chec
2b100 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  k */.  MemPage *
2b110 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20  pParent,     /* 
2b120 50 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  Parent page */. 
2b130 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f   char *zParentCo
2b140 6e 74 65 78 74 2c 20 2f 2a 20 50 61 72 65 6e 74  ntext, /* Parent
2b150 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68   context */.  ch
2b160 61 72 20 2a 7a 4c 6f 77 65 72 42 6f 75 6e 64 2c  ar *zLowerBound,
2b170 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20      /* All keys 
2b180 73 68 6f 75 6c 64 20 62 65 20 67 72 65 61 74 65  should be greate
2b190 72 20 74 68 61 6e 20 74 68 69 73 2c 20 69 66 20  r than this, if 
2b1a0 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e  not NULL */.  in
2b1b0 74 20 6e 4c 6f 77 65 72 2c 20 20 20 20 20 20 20  t nLower,       
2b1c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2b1d0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
2b1e0 4c 6f 77 65 72 42 6f 75 6e 64 20 2a 2f 0a 20 20  LowerBound */.  
2b1f0 63 68 61 72 20 2a 7a 55 70 70 65 72 42 6f 75 6e  char *zUpperBoun
2b200 64 2c 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79  d,    /* All key
2b210 73 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 73 73  s should be less
2b220 20 74 68 61 6e 20 74 68 69 73 2c 20 69 66 20 6e   than this, if n
2b230 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  ot NULL */.  int
2b240 20 6e 55 70 70 65 72 20 20 20 20 20 20 20 20 20   nUpper         
2b250 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b260 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 55  characters in zU
2b270 70 70 65 72 42 6f 75 6e 64 20 2a 2f 0a 29 7b 0a  pperBound */.){.
2b280 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2b290 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64  ;.  int i, rc, d
2b2a0 65 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20  epth, d2, pgno, 
2b2b0 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20  cnt;.  int hdr, 
2b2c0 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74  cellStart;.  int
2b2d0 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61   nCell;.  u8 *da
2b2e0 74 61 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 63  ta;.  BtCursor c
2b2f0 75 72 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ur;.  Btree *pBt
2b300 3b 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c  ;.  int maxLocal
2b310 2c 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  , usableSize;.  
2b320 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30  char zContext[10
2b330 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 3b  0];.  char *hit;
2b340 0a 0a 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e  ..  sprintf(zCon
2b350 74 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20  text, "Page %d: 
2b360 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  ", iPage);..  /*
2b370 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2b380 70 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f  page exists.  */
2b390 0a 20 20 63 75 72 2e 70 42 74 20 3d 20 70 42 74  .  cur.pBt = pBt
2b3a0 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a   = pCheck->pBt;.
2b3b0 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
2b3c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
2b3d0 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
2b3e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
2b3f0 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
2b400 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74  , iPage, zParent
2b410 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74 75 72  Context) ) retur
2b420 6e 20 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d  n 0;.  if( (rc =
2b430 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 28 50   getPage(pBt, (P
2b440 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 50 61 67  gno)iPage, &pPag
2b450 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68  e))!=0 ){.    ch
2b460 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
2b470 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
2b480 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
2b490 20 67 65 74 20 74 68 65 20 70 61 67 65 2e 20 65   get the page. e
2b4a0 72 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20 72  rror code=%d", r
2b4b0 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  c);.    return 0
2b4c0 3b 0a 20 20 7d 0a 20 20 6d 61 78 4c 6f 63 61 6c  ;.  }.  maxLocal
2b4d0 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61   = pPage->leafDa
2b4e0 74 61 20 3f 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ta ? pBt->maxLea
2b4f0 66 20 3a 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  f : pBt->maxLoca
2b500 6c 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 69  l;.  if( (rc = i
2b510 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70  nitPage(pPage, p
2b520 50 61 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20  Parent))!=0 ){. 
2b530 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
2b540 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
2b550 78 74 2c 20 22 69 6e 69 74 50 61 67 65 28 29 20  xt, "initPage() 
2b560 72 65 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f  returns error co
2b570 64 65 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20  de %d", rc);.   
2b580 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2b590 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
2b5a0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  0;.  }..  /* Che
2b5b0 63 6b 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63  ck out all the c
2b5c0 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70  ells..  */.  dep
2b5d0 74 68 20 3d 20 30 3b 0a 20 20 63 75 72 2e 70 50  th = 0;.  cur.pP
2b5e0 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 66  age = pPage;.  f
2b5f0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
2b600 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
2b610 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
2b620 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43 65 6c   int sz;.    Cel
2b630 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20  lInfo info;..   
2b640 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f 61   /* Check payloa
2b650 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  d overflow pages
2b660 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 70 72 69  .    */.    spri
2b670 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22 4f  ntf(zContext, "O
2b680 6e 20 74 72 65 65 20 70 61 67 65 20 25 64 20 63  n tree page %d c
2b690 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65  ell %d: ", iPage
2b6a0 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20  , i);.    pCell 
2b6b0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2b6c0 2c 69 29 3b 0a 20 20 20 20 70 61 72 73 65 43 65  ,i);.    parseCe
2b6d0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
2b6e0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
2b6f0 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b  sz = info.nData;
2b700 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2b710 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20  >intKey ) sz += 
2b720 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 69  info.nKey;.    i
2b730 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  f( sz>info.nLoca
2b740 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  l ){.      int n
2b750 50 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66  Page = (sz - inf
2b760 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c  o.nLocal + usabl
2b770 65 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61 62  eSize - 5)/(usab
2b780 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
2b790 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c     Pgno pgnoOvfl
2b7a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
2b7b0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
2b7c0 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  w]);.#ifndef SQL
2b7d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2b7e0 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42  UUM.      if( pB
2b7f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2b800 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
2b810 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
2b820 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  oOvfl, PTRMAP_OV
2b830 45 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20  ERFLOW1, iPage, 
2b840 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
2b850 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2b860 63 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63 6b  checkList(pCheck
2b870 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e  , 0, pgnoOvfl, n
2b880 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
2b890 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2b8a0 68 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c  heck sanity of l
2b8b0 65 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e 0a  eft child page..
2b8c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
2b8d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2b8e0 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
2b8f0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66  byte(pCell);.#if
2b900 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b910 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2b920 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2b930 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
2b940 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
2b950 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  eck, pgno, PTRMA
2b960 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20  P_BTREE, iPage, 
2b970 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
2b980 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2b990 64 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50 61  d2 = checkTreePa
2b9a0 67 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70  ge(pCheck,pgno,p
2b9b0 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74 2c 30 2c  Page,zContext,0,
2b9c0 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,0,0);.      if
2b9d0 28 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70  ( i>0 && d2!=dep
2b9e0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  th ){.        ch
2b9f0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
2ba00 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
2ba10 43 68 69 6c 64 20 70 61 67 65 20 64 65 70 74 68  Child page depth
2ba20 20 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20   differs");.    
2ba30 20 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20    }.      depth 
2ba40 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = d2;.    }.  }.
2ba50 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2ba60 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
2ba70 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2ba80 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2ba90 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2baa0 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e 74 65    sprintf(zConte
2bab0 78 74 2c 20 22 4f 6e 20 70 61 67 65 20 25 64 20  xt, "On page %d 
2bac0 61 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20  at right child: 
2bad0 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64  ", iPage);.#ifnd
2bae0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2baf0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2bb00 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2bb10 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  m ){.      check
2bb20 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70  Ptrmap(pCheck, p
2bb30 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
2bb40 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20  E, iPage, 0);.  
2bb50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
2bb60 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68  heckTreePage(pCh
2bb70 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65  eck, pgno, pPage
2bb80 2c 20 7a 43 6f 6e 74 65 78 74 2c 30 2c 30 2c 30  , zContext,0,0,0
2bb90 2c 30 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20  ,0);.  }. .  /* 
2bba0 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65  Check for comple
2bbb0 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74  te coverage of t
2bbc0 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64  he page.  */.  d
2bbd0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2bbe0 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
2bbf0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
2bc00 68 69 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  hit = sqliteMall
2bc10 6f 63 28 20 75 73 61 62 6c 65 53 69 7a 65 20 29  oc( usableSize )
2bc20 3b 0a 20 20 69 66 28 20 68 69 74 20 29 7b 0a 20  ;.  if( hit ){. 
2bc30 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20 31     memset(hit, 1
2bc40 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  , get2byte(&data
2bc50 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20 20 6e  [hdr+5]));.    n
2bc60 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
2bc70 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
2bc80 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d 20 68     cellStart = h
2bc90 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
2bca0 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f 72  e->leaf;.    for
2bcb0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
2bcc0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
2bcd0 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
2bce0 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a 32  ta[cellStart+i*2
2bcf0 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  ]);.      int si
2bd00 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
2bd10 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
2bd20 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  ]);.      int j;
2bd30 0a 20 20 20 20 20 20 69 66 28 20 28 70 63 2b 73  .      if( (pc+s
2bd40 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69  ize-1)>=usableSi
2bd50 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20  ze || pc<0 ){.  
2bd60 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
2bd70 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
2bd80 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f  .            "Co
2bd90 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65  rruption detecte
2bda0 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20  d in cell %d on 
2bdb0 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65  page %d",i,iPage
2bdc0 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,0);.      }else
2bdd0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
2bde0 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63  pc+size-1; j>=pc
2bdf0 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b  ; j--) hit[j]++;
2be00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2be10 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d     for(cnt=0, i=
2be20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2be30 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20 69  dr+1]); i>0 && i
2be40 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  <usableSize && c
2be50 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20 20 20  nt<10000; .     
2be60 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20        cnt++){.  
2be70 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67      int size = g
2be80 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 2b  et2byte(&data[i+
2be90 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  2]);.      int j
2bea0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 2b 73  ;.      if( (i+s
2beb0 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69  ize-1)>=usableSi
2bec0 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20  ze || i<0 ){.   
2bed0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
2bee0 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 20  Msg(pCheck, 0,  
2bef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f  .            "Co
2bf00 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65  rruption detecte
2bf10 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20  d in cell %d on 
2bf20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65  page %d",i,iPage
2bf30 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,0);.      }else
2bf40 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
2bf50 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20  i+size-1; j>=i; 
2bf60 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20  j--) hit[j]++;. 
2bf70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
2bf80 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
2bf90 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
2bfa0 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73  or(i=cnt=0; i<us
2bfb0 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a  ableSize; i++){.
2bfc0 20 20 20 20 20 20 69 66 28 20 68 69 74 5b 69 5d        if( hit[i]
2bfd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
2bfe0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
2bff0 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31 20 29  e if( hit[i]>1 )
2c000 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
2c010 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
2c020 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d   0,.          "M
2c030 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66 6f 72  ultiple uses for
2c040 20 62 79 74 65 20 25 64 20 6f 66 20 70 61 67 65   byte %d of page
2c050 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65 29 3b   %d", i, iPage);
2c060 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2c070 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c080 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74 61 5b    if( cnt!=data[
2c090 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20  hdr+7] ){.      
2c0a0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
2c0b0 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20  Check, 0, .     
2c0c0 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74 65 64       "Fragmented
2c0d0 20 73 70 61 63 65 20 69 73 20 25 64 20 62 79 74   space is %d byt
2c0e0 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 25 64  e reported as %d
2c0f0 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a 20 20   on page %d",.  
2c100 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64 61 74          cnt, dat
2c110 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67 65 29  a[hdr+7], iPage)
2c120 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
2c130 6c 69 74 65 46 72 65 65 28 68 69 74 29 3b 0a 0a  liteFree(hit);..
2c140 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2c150 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64  age);.  return d
2c160 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66  epth+1;.}.#endif
2c170 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2c180 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
2c190 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2c1a0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
2c1b0 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  Y_CHECK./*.** Th
2c1c0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
2c1d0 61 20 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b  a complete check
2c1e0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 42 54   of the given BT
2c1f0 72 65 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74  ree file.  aRoot
2c200 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61  [] is.** an arra
2c210 79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65  y of pages numbe
2c220 72 73 20 77 65 72 65 20 65 61 63 68 20 70 61 67  rs were each pag
2c230 65 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20  e number is the 
2c240 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  root page of.** 
2c250 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20  a table.  nRoot 
2c260 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2c270 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f   entries in aRoo
2c280 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  t..**.** If ever
2c290 79 74 68 69 6e 67 20 63 68 65 63 6b 73 20 6f 75  ything checks ou
2c2a0 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
2c2b0 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 49  returns NULL.  I
2c2c0 66 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 0a 2a  f something is.*
2c2d0 2a 20 61 6d 69 73 73 2c 20 61 6e 20 65 72 72 6f  * amiss, an erro
2c2e0 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
2c2f0 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  tten into memory
2c300 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
2c310 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20 61  alloc().** and a
2c320 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74   pointer to that
2c330 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2c340 73 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65  s returned.  The
2c350 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2c360 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  n.** is responsi
2c370 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20  ble for freeing 
2c380 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
2c390 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
2c3a0 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  e..*/.char *sqli
2c3b0 74 65 33 42 74 72 65 65 49 6e 74 65 67 72 69 74  te3BtreeIntegrit
2c3c0 79 43 68 65 63 6b 28 42 74 72 65 65 20 2a 70 42  yCheck(Btree *pB
2c3d0 74 2c 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 69  t, int *aRoot, i
2c3e0 6e 74 20 6e 52 6f 6f 74 29 7b 0a 20 20 69 6e 74  nt nRoot){.  int
2c3f0 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a   i;.  int nRef;.
2c400 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43    IntegrityCk sC
2c410 68 65 63 6b 3b 0a 0a 20 20 6e 52 65 66 20 3d 20  heck;..  nRef = 
2c420 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74  *sqlite3pager_st
2c430 61 74 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ats(pBt->pPager)
2c440 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65  ;.  if( lockBtre
2c450 65 57 69 74 68 52 65 74 72 79 28 70 42 74 29 21  eWithRetry(pBt)!
2c460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c470 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 53    return sqliteS
2c480 74 72 44 75 70 28 22 55 6e 61 62 6c 65 20 74 6f  trDup("Unable to
2c490 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 20   acquire a read 
2c4a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2c4b0 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73 43  base");.  }.  sC
2c4c0 68 65 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b 0a  heck.pBt = pBt;.
2c4d0 20 20 73 43 68 65 63 6b 2e 70 50 61 67 65 72 20    sCheck.pPager 
2c4e0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
2c4f0 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20   sCheck.nPage = 
2c500 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
2c510 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70 50  ecount(sCheck.pP
2c520 61 67 65 72 29 3b 0a 20 20 69 66 28 20 73 43 68  ager);.  if( sCh
2c530 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  eck.nPage==0 ){.
2c540 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
2c550 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
2c560 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2c570 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d    sCheck.anRef =
2c580 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
2c590 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b  ( (sCheck.nPage+
2c5a0 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b  1)*sizeof(sCheck
2c5b0 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20  .anRef[0]) );.  
2c5c0 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65  if( !sCheck.anRe
2c5d0 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  f ){.    unlockB
2c5e0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
2c5f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
2c600 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 55 6e  lite3MPrintf("Un
2c610 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 25  able to malloc %
2c620 64 20 62 79 74 65 73 22 2c 20 0a 20 20 20 20 20  d bytes", .     
2c630 20 20 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65     (sCheck.nPage
2c640 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63  +1)*sizeof(sChec
2c650 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20 20  k.anRef[0]));.  
2c660 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  }.  for(i=0; i<=
2c670 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b  sCheck.nPage; i+
2c680 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  +){ sCheck.anRef
2c690 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d  [i] = 0; }.  i =
2c6a0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
2c6b0 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20 69  GE(pBt);.  if( i
2c6c0 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 29  <=sCheck.nPage )
2c6d0 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e 52  {.    sCheck.anR
2c6e0 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20  ef[i] = 1;.  }. 
2c6f0 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 20   sCheck.zErrMsg 
2c700 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  = 0;..  /* Check
2c710 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
2c720 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  f the freelist. 
2c730 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74 28   */.  checkList(
2c740 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74 34  &sCheck, 1, get4
2c750 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
2c760 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20  1->aData[32]),. 
2c770 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62             get4b
2c780 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
2c790 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d  ->aData[36]), "M
2c7a0 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22 29  ain freelist: ")
2c7b0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c  ;..  /* Check al
2c7c0 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20 20  l the tables..  
2c7d0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2c7e0 6e 52 6f 6f 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  nRoot; i++){.   
2c7f0 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30   if( aRoot[i]==0
2c800 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66   ) continue;.#if
2c810 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c820 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2c830 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2c840 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e  uum && aRoot[i]>
2c850 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  1 ){.      check
2c860 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c 20  Ptrmap(&sCheck, 
2c870 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41 50  aRoot[i], PTRMAP
2c880 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30 29  _ROOTPAGE, 0, 0)
2c890 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2c8a0 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65     checkTreePage
2c8b0 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b  (&sCheck, aRoot[
2c8c0 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66 20  i], 0, "List of 
2c8d0 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 2c 20 30  tree roots: ", 0
2c8e0 2c 30 2c 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20  ,0,0,0);.  }..  
2c8f0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65  /* Make sure eve
2c900 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  ry page in the f
2c910 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e 63 65  ile is reference
2c920 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31  d.  */.  for(i=1
2c930 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67  ; i<=sCheck.nPag
2c940 65 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20  e; i++){.#ifdef 
2c950 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2c960 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 73  VACUUM.    if( s
2c970 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d  Check.anRef[i]==
2c980 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  0 ){.      check
2c990 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63  AppendMsg(&sChec
2c9a0 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20 69  k, 0, "Page %d i
2c9b0 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69  s never used", i
2c9c0 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  );.    }.#else. 
2c9d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
2c9e0 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
2c9f0 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65  uto-vacuum, make
2ca00 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65 73 20   sure no tables 
2ca10 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72  contain.    ** r
2ca20 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70 6f 69  eferences to poi
2ca30 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a  nter-map pages..
2ca40 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
2ca50 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d  Check.anRef[i]==
2ca60 30 20 26 26 20 0a 20 20 20 20 20 20 20 28 50 54  0 && .       (PT
2ca70 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2d  RMAP_PAGENO(pBt-
2ca80 3e 75 73 61 62 6c 65 53 69 7a 65 2c 20 69 29 21  >usableSize, i)!
2ca90 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f  =i || !pBt->auto
2caa0 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20  Vacuum) ){.     
2cab0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
2cac0 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67  &sCheck, 0, "Pag
2cad0 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75 73  e %d is never us
2cae0 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  ed", i);.    }. 
2caf0 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
2cb00 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20  Ref[i]!=0 && .  
2cb10 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47       (PTRMAP_PAG
2cb20 45 4e 4f 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  ENO(pBt->usableS
2cb30 69 7a 65 2c 20 69 29 3d 3d 69 20 26 26 20 70 42  ize, i)==i && pB
2cb40 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29  t->autoVacuum) )
2cb50 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
2cb60 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
2cb70 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20  0, "Pointer map 
2cb80 70 61 67 65 20 25 64 20 69 73 20 72 65 66 65 72  page %d is refer
2cb90 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20  enced", i);.    
2cba0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
2cbb0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  /* Make sure thi
2cbc0 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e  s analysis did n
2cbd0 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72  ot leave any unr
2cbe0 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a  ef() pages.  */.
2cbf0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
2cc00 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66  nused(pBt);.  if
2cc10 28 20 6e 52 65 66 20 21 3d 20 2a 73 71 6c 69 74  ( nRef != *sqlit
2cc20 65 33 70 61 67 65 72 5f 73 74 61 74 73 28 70 42  e3pager_stats(pB
2cc30 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
2cc40 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
2cc50 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  (&sCheck, 0, .  
2cc60 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e 67      "Outstanding
2cc70 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65 73   page count goes
2cc80 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20 64   from %d to %d d
2cc90 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c 79  uring this analy
2cca0 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65 66  sis",.      nRef
2ccb0 2c 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  , *sqlite3pager_
2ccc0 73 74 61 74 73 28 70 42 74 2d 3e 70 50 61 67 65  stats(pBt->pPage
2ccd0 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  r).    );.  }.. 
2cce0 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20 61 6e   /* Clean  up an
2ccf0 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 2e  d report errors.
2cd00 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72  .  */.  sqliteFr
2cd10 65 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 29  ee(sCheck.anRef)
2cd20 3b 0a 20 20 72 65 74 75 72 6e 20 73 43 68 65 63  ;.  return sChec
2cd30 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e  k.zErrMsg;.}.#en
2cd40 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2cd50 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
2cd60 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CK */../*.** Ret
2cd70 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
2cd80 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64  hname of the und
2cd90 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
2cda0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
2cdb0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
2cdc0 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74  eeGetFilename(Bt
2cdd0 72 65 65 20 2a 70 42 74 29 7b 0a 20 20 61 73 73  ree *pBt){.  ass
2cde0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 72  ert( pBt->pPager
2cdf0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
2ce00 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c  sqlite3pager_fil
2ce10 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
2ce20 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  r);.}../*.** Ret
2ce30 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65  urn the pathname
2ce40 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
2ce50 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
2ce60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ce70 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
2ce80 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65   *sqlite3BtreeGe
2ce90 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a  tDirname(Btree *
2cea0 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
2ceb0 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
2cec0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
2ced0 65 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28  e3pager_dirname(
2cee0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
2cef0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2cf00 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  e pathname of th
2cf10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
2cf20 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
2cf30 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20  . The return.** 
2cf40 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72 6f  value of this ro
2cf50 75 74 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d  utine is the sam
2cf60 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  e regardless of 
2cf70 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75 72  whether the jour
2cf80 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  nal file.** has 
2cf90 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 72 20  been created or 
2cfa0 6e 6f 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  not..*/.const ch
2cfb0 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
2cfc0 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42  GetJournalname(B
2cfd0 74 72 65 65 20 2a 70 42 74 29 7b 0a 20 20 61 73  tree *pBt){.  as
2cfe0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
2cff0 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
2d000 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f   sqlite3pager_jo
2d010 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 2d 3e 70  urnalname(pBt->p
2d020 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64  Pager);.}..#ifnd
2d030 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2d040 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  ACUUM./*.** Copy
2d050 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
2d060 6e 74 65 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d  ntent of pBtFrom
2d070 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41 20   into pBtTo.  A 
2d080 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d  transaction.** m
2d090 75 73 74 20 62 65 20 61 63 74 69 76 65 20 66 6f  ust be active fo
2d0a0 72 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a  r both files..**
2d0b0 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
2d0c0 66 69 6c 65 20 70 42 74 46 72 6f 6d 20 6d 61 79  file pBtFrom may
2d0d0 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20 74   be reduced by t
2d0e0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
2d0f0 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
2d100 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72  es wrong, the tr
2d110 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 42 74  ansaction on pBt
2d120 46 72 6f 6d 20 69 73 20 72 6f 6c 6c 65 64 20 62  From is rolled b
2d130 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ack..*/.int sqli
2d140 74 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65  te3BtreeCopyFile
2d150 28 42 74 72 65 65 20 2a 70 42 74 54 6f 2c 20 42  (Btree *pBtTo, B
2d160 74 72 65 65 20 2a 70 42 74 46 72 6f 6d 29 7b 0a  tree *pBtFrom){.
2d170 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2d180 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 2c 20  E_OK;.  Pgno i, 
2d190 6e 50 61 67 65 2c 20 6e 54 6f 50 61 67 65 3b 0a  nPage, nToPage;.
2d1a0 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 69 6e  .  if( pBtTo->in
2d1b0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
2d1c0 54 45 20 7c 7c 20 70 42 74 46 72 6f 6d 2d 3e 69  TE || pBtFrom->i
2d1d0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
2d1e0 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ITE ){.    retur
2d1f0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2d200 20 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d    }.  if( pBtTo-
2d210 3e 70 43 75 72 73 6f 72 20 29 20 72 65 74 75 72  >pCursor ) retur
2d220 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
2d230 20 6e 54 6f 50 61 67 65 20 3d 20 73 71 6c 69 74   nToPage = sqlit
2d240 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
2d250 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29  t(pBtTo->pPager)
2d260 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69  ;.  nPage = sqli
2d270 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
2d280 6e 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67  nt(pBtFrom->pPag
2d290 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  er);.  for(i=1; 
2d2a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d2b0 20 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b   i<=nPage; i++){
2d2c0 0a 20 20 20 20 76 6f 69 64 20 2a 70 50 61 67 65  .    void *pPage
2d2d0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2d2e0 65 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 46  e3pager_get(pBtF
2d2f0 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20  rom->pPager, i, 
2d300 26 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  &pPage);.    if(
2d310 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
2d320 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
2d330 65 72 5f 6f 76 65 72 77 72 69 74 65 28 70 42 74  er_overwrite(pBt
2d340 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 70  To->pPager, i, p
2d350 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2d360 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  c ) break;.    s
2d370 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
2d380 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  f(pPage);.  }.  
2d390 66 6f 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72  for(i=nPage+1; r
2d3a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2d3b0 69 3c 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29  i<=nToPage; i++)
2d3c0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 50 61 67  {.    void *pPag
2d3d0 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
2d3e0 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 42 74  te3pager_get(pBt
2d3f0 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  To->pPager, i, &
2d400 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
2d410 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
2d420 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
2d430 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
2d440 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
2d450 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
2d460 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
2d470 64 6f 6e 74 5f 77 72 69 74 65 28 70 42 74 54 6f  dont_write(pBtTo
2d480 2d 3e 70 50 61 67 65 72 2c 20 69 29 3b 0a 20 20  ->pPager, i);.  
2d490 7d 0a 20 20 69 66 28 20 21 72 63 20 26 26 20 6e  }.  if( !rc && n
2d4a0 50 61 67 65 3c 6e 54 6f 50 61 67 65 20 29 7b 0a  Page<nToPage ){.
2d4b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d4c0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
2d4d0 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 50  BtTo->pPager, nP
2d4e0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  age);.  }.  if( 
2d4f0 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
2d500 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
2d510 42 74 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  BtTo);.  }.  ret
2d520 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 23 65 6e 64  urn rc;  .}.#end
2d530 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2d540 54 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a  T_VACUUM */../*.
2d550 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
2d560 72 6f 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ro if a transact
2d570 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2d580 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2d590 65 65 49 73 49 6e 54 72 61 6e 73 28 42 74 72 65  eeIsInTrans(Btre
2d5a0 65 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  e *pBt){.  retur
2d5b0 6e 20 28 70 42 74 20 26 26 20 28 70 42 74 2d 3e  n (pBt && (pBt->
2d5c0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2d5d0 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  RITE));.}../*.**
2d5e0 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
2d5f0 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
2d600 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2d610 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctive..*/.int sq
2d620 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 53 74  lite3BtreeIsInSt
2d630 6d 74 28 42 74 72 65 65 20 2a 70 42 74 29 7b 0a  mt(Btree *pBt){.
2d640 20 20 72 65 74 75 72 6e 20 28 70 42 74 20 26 26    return (pBt &&
2d650 20 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d   pBt->inStmt);.}
2d660 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ../*.** This cal
2d670 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
2d680 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
2d690 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
2d6a0 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
2d6b0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
2d6c0 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
2d6d0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
2d6e0 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
2d6f0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
2d700 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
2d710 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
2d720 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
2d730 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
2d740 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
2d750 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
2d760 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
2d770 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
2d780 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
2d790 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
2d7a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
2d7b0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
2d7c0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
2d7d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
2d7e0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
2d7f0 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
2d800 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
2d810 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
2d820 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
2d830 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
2d840 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
2d850 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
2d860 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
2d870 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
2d880 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
2d890 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
2d8a0 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
2d8b0 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
2d8c0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
2d8d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2d8e0 72 65 65 53 79 6e 63 28 42 74 72 65 65 20 2a 70  reeSync(Btree *p
2d8f0 42 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Bt, const char *
2d900 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 66 28 20  zMaster){.  if( 
2d910 70 42 74 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  pBt->inTrans==TR
2d920 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 23 69 66  ANS_WRITE ){.#if
2d930 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d940 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2d950 50 67 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b  Pgno nTrunc = 0;
2d960 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
2d970 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2d980 20 20 69 6e 74 20 72 63 20 3d 20 61 75 74 6f 56    int rc = autoV
2d990 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c  acuumCommit(pBt,
2d9a0 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20 20   &nTrunc); .    
2d9b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d9c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
2d9d0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2d9e0 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  n sqlite3pager_s
2d9f0 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ync(pBt->pPager,
2da00 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63   zMaster, nTrunc
2da10 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
2da20 74 75 72 6e 20 73 71 6c 69 74 65 33 70 61 67 65  turn sqlite3page
2da30 72 5f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67  r_sync(pBt->pPag
2da40 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
2da50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2da60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
2da70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2da80 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a 2f 2a  GLOBALRECOVER./*
2da90 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 62 74  .** Reset the bt
2daa0 72 65 65 20 61 6e 64 20 75 6e 64 65 72 6c 79 69  ree and underlyi
2dab0 6e 67 20 70 61 67 65 72 20 61 66 74 65 72 20 61  ng pager after a
2dac0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
2dad0 65 2e 20 41 6e 79 0a 2a 2a 20 74 72 61 6e 73 61  e. Any.** transa
2dae0 63 74 69 6f 6e 20 74 68 61 74 20 77 61 73 20 61  ction that was a
2daf0 63 74 69 76 65 20 77 68 65 6e 20 6d 61 6c 6c 6f  ctive when mallo
2db00 63 28 29 20 66 61 69 6c 65 64 20 69 73 20 72 6f  c() failed is ro
2db10 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 69 6e  lled back..*/.in
2db20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65  t sqlite3BtreeRe
2db30 73 65 74 28 42 74 72 65 65 20 2a 70 42 74 29 7b  set(Btree *pBt){
2db40 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72  .  if( pBt->pCur
2db50 73 6f 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  sor ) return SQL
2db60 49 54 45 5f 42 55 53 59 3b 0a 20 20 70 42 74 2d  ITE_BUSY;.  pBt-
2db70 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
2db80 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42  _NONE;.  unlockB
2db90 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
2dba0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
2dbb0 74 65 33 70 61 67 65 72 5f 72 65 73 65 74 28 70  te3pager_reset(p
2dbc0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 23  Bt->pPager);.}.#
2dbd0 65 6e 64 69 66 0a                                endif.