System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 3ef5b9dd224f460701a9738b7e0080e5aff46e36:


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 31 20 32 30 30 35 2f 30 33 2f  c,v 1.1 2005/03/
0190: 30 31 20 31 36 3a 30 34 3a 32 37 20 72 6d 73 69  01 16:04:27 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 7d 3b 0a 74 79 70 65 64 65  ble */.};.typede
3930: 66 20 42 74 72 65 65 20 42 74 3b 0a 0a 2f 2a 0a  f Btree Bt;../*.
3940: 2a 2a 20 42 74 72 65 65 2e 69 6e 54 72 61 6e 73  ** Btree.inTrans
3950: 20 6d 61 79 20 74 61 6b 65 20 6f 6e 65 20 6f 66   may take one of
3960: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
3970: 61 6c 75 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  alues..*/.#defin
3980: 65 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 20 30 0a  e TRANS_NONE  0.
3990: 23 64 65 66 69 6e 65 20 54 52 41 4e 53 5f 52 45  #define TRANS_RE
39a0: 41 44 20 20 31 0a 23 64 65 66 69 6e 65 20 54 52  AD  1.#define TR
39b0: 41 4e 53 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a  ANS_WRITE 2../*.
39c0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
39d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
39e0: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
39f0: 64 20 74 6f 20 68 6f 6c 64 20 69 6e 66 6f 72 6d  d to hold inform
3a00: 61 74 69 6f 6e 0a 2a 2a 20 61 62 6f 75 74 20 61  ation.** about a
3a10: 20 63 65 6c 6c 2e 20 20 54 68 65 20 70 61 72 73   cell.  The pars
3a20: 65 43 65 6c 6c 50 74 72 28 29 20 66 75 6e 63 74  eCellPtr() funct
3a30: 69 6f 6e 20 66 69 6c 6c 73 20 69 6e 20 74 68 69  ion fills in thi
3a40: 73 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62  s structure.** b
3a50: 61 73 65 64 20 6f 6e 20 69 6e 66 6f 72 6d 61 74  ased on informat
3a60: 69 6f 6e 20 65 78 74 72 61 63 74 20 66 72 6f 6d  ion extract from
3a70: 20 74 68 65 20 72 61 77 20 64 69 73 6b 20 70 61   the raw disk pa
3a80: 67 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ge..*/.typedef s
3a90: 74 72 75 63 74 20 43 65 6c 6c 49 6e 66 6f 20 43  truct CellInfo C
3aa0: 65 6c 6c 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20  ellInfo;.struct 
3ab0: 43 65 6c 6c 49 6e 66 6f 20 7b 0a 20 20 75 38 20  CellInfo {.  u8 
3ac0: 2a 70 43 65 6c 6c 3b 20 20 20 20 20 2f 2a 20 50  *pCell;     /* P
3ad0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74  ointer to the st
3ae0: 61 72 74 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  art of cell cont
3af0: 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  ent */.  i64 nKe
3b00: 79 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b  y;      /* The k
3b10: 65 79 20 66 6f 72 20 49 4e 54 4b 45 59 20 74 61  ey for INTKEY ta
3b20: 62 6c 65 73 2c 20 6f 72 20 6e 75 6d 62 65 72 20  bles, or number 
3b30: 6f 66 20 62 79 74 65 73 20 69 6e 20 6b 65 79 20  of bytes in key 
3b40: 2a 2f 0a 20 20 75 33 32 20 6e 44 61 74 61 3b 20  */.  u32 nData; 
3b50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3b60: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 2a   bytes of data *
3b70: 2f 0a 20 20 75 31 36 20 6e 48 65 61 64 65 72 3b  /.  u16 nHeader;
3b80: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
3b90: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
3ba0: 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a  eader in bytes *
3bb0: 2f 0a 20 20 75 31 36 20 6e 4c 6f 63 61 6c 3b 20  /.  u16 nLocal; 
3bc0: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
3bd0: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
3be0: 61 6c 6c 79 20 2a 2f 0a 20 20 75 31 36 20 69 4f  ally */.  u16 iO
3bf0: 76 65 72 66 6c 6f 77 3b 20 2f 2a 20 4f 66 66 73  verflow; /* Offs
3c00: 65 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  et to overflow p
3c10: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 5a 65 72  age number.  Zer
3c20: 6f 20 69 66 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o if no overflow
3c30: 20 2a 2f 0a 20 20 75 31 36 20 6e 53 69 7a 65 3b   */.  u16 nSize;
3c40: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
3c50: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
3c60: 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
3c70: 72 65 65 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 0a  ree page */.};..
3c80: 2f 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69  /*.** A cursor i
3c90: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
3ca0: 20 70 61 72 74 69 63 75 6c 61 72 20 65 6e 74 72   particular entr
3cb0: 79 20 69 6e 20 74 68 65 20 42 54 72 65 65 2e 0a  y in the BTree..
3cc0: 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 69 73 20  ** The entry is 
3cd0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 74  identified by it
3ce0: 73 20 4d 65 6d 50 61 67 65 20 61 6e 64 20 74 68  s MemPage and th
3cf0: 65 20 69 6e 64 65 78 20 69 6e 0a 2a 2a 20 4d 65  e index in.** Me
3d00: 6d 50 61 67 65 2e 61 43 65 6c 6c 5b 5d 20 6f 66  mPage.aCell[] of
3d10: 20 74 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73   the entry..*/.s
3d20: 74 72 75 63 74 20 42 74 43 75 72 73 6f 72 20 7b  truct BtCursor {
3d30: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 20 20  .  Btree *pBt;  
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d50: 54 68 65 20 42 74 72 65 65 20 74 6f 20 77 68 69  The Btree to whi
3d60: 63 68 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ch this cursor b
3d70: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 42 74 43 75  elongs */.  BtCu
3d80: 72 73 6f 72 20 2a 70 4e 65 78 74 2c 20 2a 70 50  rsor *pNext, *pP
3d90: 72 65 76 3b 20 20 2f 2a 20 46 6f 72 6d 73 20 61  rev;  /* Forms a
3da0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
3db0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20  all cursors */. 
3dc0: 20 69 6e 74 20 28 2a 78 43 6f 6d 70 61 72 65 29   int (*xCompare)
3dd0: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
3de0: 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
3df0: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 4b 65 79 20   void*); /* Key 
3e00: 63 6f 6d 70 20 66 75 6e 63 20 2a 2f 0a 20 20 76  comp func */.  v
3e10: 6f 69 64 20 2a 70 41 72 67 3b 20 20 20 20 20 20  oid *pArg;      
3e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3e30: 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
3e40: 65 28 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  e() */.  Pgno pg
3e50: 6e 6f 52 6f 6f 74 3b 20 20 20 20 20 20 20 20 20  noRoot;         
3e60: 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70     /* The root p
3e70: 61 67 65 20 6f 66 20 74 68 69 73 20 74 72 65 65  age of this tree
3e80: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
3e90: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
3ea0: 2f 2a 20 50 61 67 65 20 74 68 61 74 20 63 6f 6e  /* Page that con
3eb0: 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20  tains the entry 
3ec0: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20  */.  int idx;   
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3ee0: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65  * Index of the e
3ef0: 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
3f00: 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 43 65 6c 6c  Cell[] */.  Cell
3f10: 49 6e 66 6f 20 69 6e 66 6f 3b 20 20 20 20 20 20  Info info;      
3f20: 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 73 65        /* A parse
3f30: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 77 65 20   of the cell we 
3f40: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
3f50: 2a 2f 0a 20 20 75 38 20 77 72 46 6c 61 67 3b 20  */.  u8 wrFlag; 
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f70: 2a 20 54 72 75 65 20 69 66 20 77 72 69 74 61 62  * True if writab
3f80: 6c 65 20 2a 2f 0a 20 20 75 38 20 69 73 56 61 6c  le */.  u8 isVal
3f90: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3fa0: 20 20 2f 2a 20 54 52 55 45 20 69 66 20 70 6f 69    /* TRUE if poi
3fb0: 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65  nts to a valid e
3fc0: 6e 74 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ntry */.};../*.*
3fd0: 2a 20 54 68 65 20 54 52 41 43 45 20 6d 61 63 72  * The TRACE macr
3fe0: 6f 20 77 69 6c 6c 20 70 72 69 6e 74 20 68 69 67  o will print hig
3ff0: 68 2d 6c 65 76 65 6c 20 73 74 61 74 75 73 20 69  h-level status i
4000: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
4010: 20 74 68 65 0a 2a 2a 20 62 74 72 65 65 20 6f 70   the.** btree op
4020: 65 72 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65  eration when the
4030: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
4040: 20 73 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74   sqlite3_btree_t
4050: 72 61 63 65 20 69 73 0a 2a 2a 20 65 6e 61 62 6c  race is.** enabl
4060: 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ed..*/.#if SQLIT
4070: 45 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20  E_TEST.# define 
4080: 54 52 41 43 45 28 58 29 20 20 20 69 66 28 20 73  TRACE(X)   if( s
4090: 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61  qlite3_btree_tra
40a0: 63 65 20 29 5c 0a 20 20 20 20 20 20 20 20 20 20  ce )\.          
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
40c0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
40d0: 74 66 20 58 3b 20 66 66 6c 75 73 68 28 73 74 64  tf X; fflush(std
40e0: 6f 75 74 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20  out); }.#else.# 
40f0: 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29 0a  define TRACE(X).
4100: 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74  #endif.int sqlit
4110: 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65 3d 30  e3_btree_trace=0
4120: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
4130: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
4140: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
4150: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
4160: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
4170: 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a 2c 50  adLocks(Btree*,P
4180: 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a  gno,BtCursor*);.
4190: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 6f 72 20 77  ./*.** Read or w
41a0: 72 69 74 65 20 61 20 74 77 6f 2d 20 61 6e 64 20  rite a two- and 
41b0: 66 6f 75 72 2d 62 79 74 65 20 62 69 67 2d 65 6e  four-byte big-en
41c0: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  dian integer val
41d0: 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ues..*/.static u
41e0: 33 32 20 67 65 74 32 62 79 74 65 28 75 6e 73 69  32 get2byte(unsi
41f0: 67 6e 65 64 20 63 68 61 72 20 2a 70 29 7b 0a 20  gned char *p){. 
4200: 20 72 65 74 75 72 6e 20 28 70 5b 30 5d 3c 3c 38   return (p[0]<<8
4210: 29 20 7c 20 70 5b 31 5d 3b 0a 7d 0a 73 74 61 74  ) | p[1];.}.stat
4220: 69 63 20 75 33 32 20 67 65 74 34 62 79 74 65 28  ic u32 get4byte(
4230: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
4240: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 5b 30  ){.  return (p[0
4250: 5d 3c 3c 32 34 29 20 7c 20 28 70 5b 31 5d 3c 3c  ]<<24) | (p[1]<<
4260: 31 36 29 20 7c 20 28 70 5b 32 5d 3c 3c 38 29 20  16) | (p[2]<<8) 
4270: 7c 20 70 5b 33 5d 3b 0a 7d 0a 73 74 61 74 69 63  | p[3];.}.static
4280: 20 76 6f 69 64 20 70 75 74 32 62 79 74 65 28 75   void put2byte(u
4290: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c  nsigned char *p,
42a0: 20 75 33 32 20 76 29 7b 0a 20 20 70 5b 30 5d 20   u32 v){.  p[0] 
42b0: 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 31 5d 20 3d  = v>>8;.  p[1] =
42c0: 20 76 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   v;.}.static voi
42d0: 64 20 70 75 74 34 62 79 74 65 28 75 6e 73 69 67  d put4byte(unsig
42e0: 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 33 32  ned char *p, u32
42f0: 20 76 29 7b 0a 20 20 70 5b 30 5d 20 3d 20 76 3e   v){.  p[0] = v>
4300: 3e 32 34 3b 0a 20 20 70 5b 31 5d 20 3d 20 76 3e  >24;.  p[1] = v>
4310: 3e 31 36 3b 0a 20 20 70 5b 32 5d 20 3d 20 76 3e  >16;.  p[2] = v>
4320: 3e 38 3b 0a 20 20 70 5b 33 5d 20 3d 20 76 3b 0a  >8;.  p[3] = v;.
4330: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  }../*.** Routine
4340: 73 20 74 6f 20 72 65 61 64 20 61 6e 64 20 77 72  s to read and wr
4350: 69 74 65 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e  ite variable-len
4360: 67 74 68 20 69 6e 74 65 67 65 72 73 2e 20 20 54  gth integers.  T
4370: 68 65 73 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20  hese used to.** 
4380: 62 65 20 64 65 66 69 6e 65 64 20 6c 6f 63 61 6c  be defined local
4390: 6c 79 2c 20 62 75 74 20 6e 6f 77 20 77 65 20 75  ly, but now we u
43a0: 73 65 20 74 68 65 20 76 61 72 69 6e 74 20 72 6f  se the varint ro
43b0: 75 74 69 6e 65 73 20 69 6e 20 74 68 65 20 75 74  utines in the ut
43c0: 69 6c 2e 63 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f  il.c.** file..*/
43d0: 0a 23 64 65 66 69 6e 65 20 67 65 74 56 61 72 69  .#define getVari
43e0: 6e 74 20 20 20 20 73 71 6c 69 74 65 33 47 65 74  nt    sqlite3Get
43f0: 56 61 72 69 6e 74 0a 23 64 65 66 69 6e 65 20 67  Varint.#define g
4400: 65 74 56 61 72 69 6e 74 33 32 20 20 73 71 6c 69  etVarint32  sqli
4410: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 0a 23  te3GetVarint32.#
4420: 64 65 66 69 6e 65 20 70 75 74 56 61 72 69 6e 74  define putVarint
4430: 20 20 20 20 73 71 6c 69 74 65 33 50 75 74 56 61      sqlite3PutVa
4440: 72 69 6e 74 0a 0a 2f 2a 20 54 68 65 20 64 61 74  rint../* The dat
4450: 61 62 61 73 65 20 70 61 67 65 20 74 68 65 20 50  abase page the P
4460: 45 4e 44 49 4e 47 5f 42 59 54 45 20 6f 63 63 75  ENDING_BYTE occu
4470: 70 69 65 73 2e 20 54 68 69 73 20 70 61 67 65 20  pies. This page 
4480: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 0a 2a  is never used..*
4490: 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 6d 61 63  * TODO: This mac
44a0: 72 6f 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c  ro is very simil
44b0: 61 72 79 20 74 6f 20 50 41 47 45 52 5f 4d 4a 5f  ary to PAGER_MJ_
44c0: 50 47 4e 4f 28 29 20 69 6e 20 70 61 67 65 72 2e  PGNO() in pager.
44d0: 63 2e 20 54 68 65 79 0a 2a 2a 20 73 68 6f 75 6c  c. They.** shoul
44e0: 64 20 70 6f 73 73 69 62 6c 79 20 62 65 20 63 6f  d possibly be co
44f0: 6e 73 6f 6c 69 64 61 74 65 64 20 28 70 72 65 73  nsolidated (pres
4500: 75 6d 61 62 6c 79 20 69 6e 20 70 61 67 65 72 2e  umably in pager.
4510: 68 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  h)..*/.#define P
4520: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
4530: 28 70 42 74 29 20 28 28 50 45 4e 44 49 4e 47 5f  (pBt) ((PENDING_
4540: 42 59 54 45 2f 28 70 42 74 29 2d 3e 70 61 67 65  BYTE/(pBt)->page
4550: 53 69 7a 65 29 2b 31 29 0a 0a 23 69 66 6e 64 65  Size)+1)..#ifnde
4560: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
4570: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54  TOVACUUM./*.** T
4580: 68 65 73 65 20 6d 61 63 72 6f 73 20 64 65 66 69  hese macros defi
4590: 6e 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ne the location 
45a0: 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
45b0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 61 20 0a  ap entry for a .
45c0: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
45d0: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
45e0: 6d 65 6e 74 20 74 6f 20 65 61 63 68 20 69 73 20  ment to each is 
45f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73  the number of us
4600: 61 62 6c 65 0a 2a 2a 20 62 79 74 65 73 20 6f 6e  able.** bytes on
4610: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 74 68   each page of th
4620: 65 20 64 61 74 61 62 61 73 65 20 28 6f 66 74 65  e database (ofte
4630: 6e 20 31 30 32 34 29 2e 20 54 68 65 20 73 65 63  n 1024). The sec
4640: 6f 6e 64 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ond is the.** pa
4650: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 6f  ge number to loo
4660: 6b 20 75 70 20 69 6e 20 74 68 65 20 70 6f 69 6e  k up in the poin
4670: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 50  ter map..**.** P
4680: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20 72 65 74  TRMAP_PAGENO ret
4690: 75 72 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  urns the databas
46a0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
46b0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
46c0: 0a 2a 2a 20 70 61 67 65 20 74 68 61 74 20 73 74  .** page that st
46d0: 6f 72 65 73 20 74 68 65 20 72 65 71 75 69 72 65  ores the require
46e0: 64 20 70 6f 69 6e 74 65 72 2e 20 50 54 52 4d 41  d pointer. PTRMA
46f0: 50 5f 50 54 52 4f 46 46 53 45 54 20 72 65 74 75  P_PTROFFSET retu
4700: 72 6e 73 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65  rns.** the offse
4710: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  t of the request
4720: 65 64 20 6d 61 70 20 65 6e 74 72 79 2e 0a 2a 2a  ed map entry..**
4730: 0a 2a 2a 20 49 66 20 74 68 65 20 70 67 6e 6f 20  .** If the pgno 
4740: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
4750: 74 6f 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  to PTRMAP_PAGENO
4760: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   is a pointer-ma
4770: 70 20 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  p page,.** then 
4780: 70 67 6e 6f 20 69 73 20 72 65 74 75 72 6e 65 64  pgno is returned
4790: 2e 20 53 6f 20 28 70 67 6e 6f 3d 3d 50 54 52 4d  . So (pgno==PTRM
47a0: 41 50 5f 50 41 47 45 4e 4f 28 70 67 73 7a 2c 20  AP_PAGENO(pgsz, 
47b0: 70 67 6e 6f 29 29 20 63 61 6e 20 62 65 0a 2a 2a  pgno)) can be.**
47c0: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 69 66   used to test if
47d0: 20 70 67 6e 6f 20 69 73 20 61 20 70 6f 69 6e 74   pgno is a point
47e0: 65 72 2d 6d 61 70 20 70 61 67 65 2e 20 50 54 52  er-map page. PTR
47f0: 4d 41 50 5f 49 53 50 41 47 45 20 69 6d 70 6c 65  MAP_ISPAGE imple
4800: 6d 65 6e 74 73 0a 2a 2a 20 74 68 69 73 20 74 65  ments.** this te
4810: 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  st..*/.#define P
4820: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 67 73  TRMAP_PAGENO(pgs
4830: 7a 2c 20 70 67 6e 6f 29 20 28 28 28 70 67 6e 6f  z, pgno) (((pgno
4840: 2d 32 29 2f 28 70 67 73 7a 2f 35 2b 31 29 29 2a  -2)/(pgsz/5+1))*
4850: 28 70 67 73 7a 2f 35 2b 31 29 2b 32 29 0a 23 64  (pgsz/5+1)+2).#d
4860: 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 50 54 52  efine PTRMAP_PTR
4870: 4f 46 46 53 45 54 28 70 67 73 7a 2c 20 70 67 6e  OFFSET(pgsz, pgn
4880: 6f 29 20 28 28 28 70 67 6e 6f 2d 32 29 25 28 70  o) (((pgno-2)%(p
4890: 67 73 7a 2f 35 2b 31 29 2d 31 29 2a 35 29 0a 23  gsz/5+1)-1)*5).#
48a0: 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 49 53  define PTRMAP_IS
48b0: 50 41 47 45 28 70 67 73 7a 2c 20 70 67 6e 6f 29  PAGE(pgsz, pgno)
48c0: 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28   (PTRMAP_PAGENO(
48d0: 70 67 73 7a 2c 70 67 6e 6f 29 3d 3d 70 67 6e 6f  pgsz,pgno)==pgno
48e0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  )../*.** The poi
48f0: 6e 74 65 72 20 6d 61 70 20 69 73 20 61 20 6c 6f  nter map is a lo
4900: 6f 6b 75 70 20 74 61 62 6c 65 20 74 68 61 74 20  okup table that 
4910: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70  identifies the p
4920: 61 72 65 6e 74 20 70 61 67 65 20 66 6f 72 0a 2a  arent page for.*
4930: 2a 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67  * each child pag
4940: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
4950: 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 61 72  e file.  The par
4960: 65 6e 74 20 70 61 67 65 20 69 73 20 74 68 65 20  ent page is the 
4970: 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 63 6f 6e  page that.** con
4980: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
4990: 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 45  to the child.  E
49a0: 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
49b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
49c0: 6e 73 0a 2a 2a 20 30 20 6f 72 20 31 20 70 61 72  ns.** 0 or 1 par
49d0: 65 6e 74 20 70 61 67 65 73 2e 20 20 28 49 6e 20  ent pages.  (In 
49e0: 74 68 69 73 20 63 6f 6e 74 65 78 74 20 27 64 61  this context 'da
49f0: 74 61 62 61 73 65 20 70 61 67 65 27 20 72 65 66  tabase page' ref
4a00: 65 72 73 0a 2a 2a 20 74 6f 20 61 6e 79 20 70 61  ers.** to any pa
4a10: 67 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70  ge that is not p
4a20: 61 72 74 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  art of the point
4a30: 65 72 20 6d 61 70 20 69 74 73 65 6c 66 2e 29 20  er map itself.) 
4a40: 20 45 61 63 68 20 70 6f 69 6e 74 65 72 20 6d 61   Each pointer ma
4a50: 70 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 6e 73 69  p.** entry consi
4a60: 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
4a70: 62 79 74 65 20 27 74 79 70 65 27 20 61 6e 64 20  byte 'type' and 
4a80: 61 20 34 20 62 79 74 65 20 70 61 72 65 6e 74 20  a 4 byte parent 
4a90: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
4aa0: 54 68 65 20 50 54 52 4d 41 50 5f 58 58 58 20 69  The PTRMAP_XXX i
4ab0: 64 65 6e 74 69 66 69 65 72 73 20 62 65 6c 6f 77  dentifiers below
4ac0: 20 61 72 65 20 74 68 65 20 76 61 6c 69 64 20 74   are the valid t
4ad0: 79 70 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ypes..**.** The 
4ae0: 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 70  purpose of the p
4af0: 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 74 6f  ointer map is to
4b00: 20 66 61 63 69 6c 69 74 79 20 6d 6f 76 69 6e 67   facility moving
4b10: 20 70 61 67 65 73 20 66 72 6f 6d 20 6f 6e 65 0a   pages from one.
4b20: 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  ** position in t
4b30: 68 65 20 66 69 6c 65 20 74 6f 20 61 6e 6f 74 68  he file to anoth
4b40: 65 72 20 61 73 20 70 61 72 74 20 6f 66 20 61 75  er as part of au
4b50: 74 6f 76 61 63 75 75 6d 2e 20 20 57 68 65 6e 20  tovacuum.  When 
4b60: 61 20 70 61 67 65 0a 2a 2a 20 69 73 20 6d 6f 76  a page.** is mov
4b70: 65 64 2c 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ed, the pointer 
4b80: 69 6e 20 69 74 73 20 70 61 72 65 6e 74 20 6d 75  in its parent mu
4b90: 73 74 20 62 65 20 75 70 64 61 74 65 64 20 74 6f  st be updated to
4ba0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
4bb0: 20 6e 65 77 20 6c 6f 63 61 74 69 6f 6e 2e 20 20   new location.  
4bc0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
4bd0: 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74  is used to locat
4be0: 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
4bf0: 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 0a 2a 2a  e quickly..**.**
4c00: 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
4c10: 3a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70  : The database p
4c20: 61 67 65 20 69 73 20 61 20 72 6f 6f 74 2d 70 61  age is a root-pa
4c30: 67 65 2e 20 54 68 65 20 70 61 67 65 2d 6e 75 6d  ge. The page-num
4c40: 62 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ber is not.**   
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
4c60: 73 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  sed in this case
4c70: 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 46  ..**.** PTRMAP_F
4c80: 52 45 45 50 41 47 45 3a 20 54 68 65 20 64 61 74  REEPAGE: The dat
4c90: 61 62 61 73 65 20 70 61 67 65 20 69 73 20 61 6e  abase page is an
4ca0: 20 75 6e 75 73 65 64 20 28 66 72 65 65 29 20 70   unused (free) p
4cb0: 61 67 65 2e 20 54 68 65 20 70 61 67 65 2d 6e 75  age. The page-nu
4cc0: 6d 62 65 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  mber .**        
4cd0: 20 20 20 20 20 20 20 20 20 20 69 73 20 6e 6f 74            is not
4ce0: 20 75 73 65 64 20 69 6e 20 74 68 69 73 20 63 61   used in this ca
4cf0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  se..**.** PTRMAP
4d00: 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 54 68 65 20  _OVERFLOW1: The 
4d10: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73  database page is
4d20: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
4d30: 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a  in a list of .**
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d50: 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
4d60: 73 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  s. The page numb
4d70: 65 72 20 69 64 65 6e 74 69 66 69 65 73 20 74 68  er identifies th
4d80: 65 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 20  e page that.**  
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
4db0: 6c 6c 20 77 69 74 68 20 61 20 70 6f 69 6e 74 65  ll with a pointe
4dc0: 72 20 74 6f 20 74 68 69 73 20 6f 76 65 72 66 6c  r to this overfl
4dd0: 6f 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  ow page..**.** P
4de0: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
4df0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70 61   The database pa
4e00: 67 65 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  ge is the second
4e10: 20 6f 72 20 6c 61 74 65 72 20 70 61 67 65 20 69   or later page i
4e20: 6e 20 61 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20  n a list of.**  
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e40: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
4e50: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
4e60: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
4e70: 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20  previous.**     
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
4e90: 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
4ea0: 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a  ow page list..**
4eb0: 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
4ec0: 3a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70  : The database p
4ed0: 61 67 65 20 69 73 20 61 20 6e 6f 6e 2d 72 6f 6f  age is a non-roo
4ee0: 74 20 62 74 72 65 65 20 70 61 67 65 2e 20 54 68  t btree page. Th
4ef0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a  e page number.**
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4f10: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 61  dentifies the pa
4f20: 72 65 6e 74 20 70 61 67 65 20 69 6e 20 74 68 65  rent page in the
4f30: 20 62 74 72 65 65 2e 0a 2a 2f 0a 23 64 65 66 69   btree..*/.#defi
4f40: 6e 65 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  ne PTRMAP_ROOTPA
4f50: 47 45 20 31 0a 23 64 65 66 69 6e 65 20 50 54 52  GE 1.#define PTR
4f60: 4d 41 50 5f 46 52 45 45 50 41 47 45 20 32 0a 23  MAP_FREEPAGE 2.#
4f70: 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 4f 56  define PTRMAP_OV
4f80: 45 52 46 4c 4f 57 31 20 33 0a 23 64 65 66 69 6e  ERFLOW1 3.#defin
4f90: 65 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  e PTRMAP_OVERFLO
4fa0: 57 32 20 34 0a 23 64 65 66 69 6e 65 20 50 54 52  W2 4.#define PTR
4fb0: 4d 41 50 5f 42 54 52 45 45 20 35 0a 0a 2f 2a 0a  MAP_BTREE 5../*.
4fc0: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
4fd0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
4fe0: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
4ff0: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
5000: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
5010: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
5020: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
5030: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
5040: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
5050: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
5060: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
5070: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
5080: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
5090: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
50a0: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
50b0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
50c0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
50d0: 50 75 74 28 42 74 72 65 65 20 2a 70 42 74 2c 20  Put(Btree *pBt, 
50e0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
50f0: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29  pe, Pgno parent)
5100: 7b 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  {.  u8 *pPtrmap;
5110: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
5120: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
5130: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
5140: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
5150: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
5160: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
5170: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
5180: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
5190: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ge */.  int rc;.
51a0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
51b0: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
51c0: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
51d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
51e0: 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 69  CORRUPT;.  }.  i
51f0: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
5200: 50 41 47 45 4e 4f 28 70 42 74 2d 3e 75 73 61 62  PAGENO(pBt->usab
5210: 6c 65 53 69 7a 65 2c 20 6b 65 79 29 3b 0a 20 20  leSize, key);.  
5220: 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
5230: 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61 67 65  r_get(pBt->pPage
5240: 72 2c 20 69 50 74 72 6d 61 70 2c 20 28 76 6f 69  r, iPtrmap, (voi
5250: 64 20 2a 2a 29 26 70 50 74 72 6d 61 70 29 3b 0a  d **)&pPtrmap);.
5260: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5270: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
5280: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  n rc;.  }.  offs
5290: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
52a0: 46 46 53 45 54 28 70 42 74 2d 3e 75 73 61 62 6c  FFSET(pBt->usabl
52b0: 65 53 69 7a 65 2c 20 6b 65 79 29 3b 0a 0a 20 20  eSize, key);..  
52c0: 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d  if( eType!=pPtrm
52d0: 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65  ap[offset] || ge
52e0: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
52f0: 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65  offset+1])!=pare
5300: 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28  nt ){.    TRACE(
5310: 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a  ("PTRMAP_UPDATE:
5320: 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c   %d->(%d,%d)\n",
5330: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
5340: 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ent));.    rc = 
5350: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
5360: 74 65 28 70 50 74 72 6d 61 70 29 3b 0a 20 20 20  te(pPtrmap);.   
5370: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5380: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
5390: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
53a0: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
53b0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
53c0: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
53d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
53e0: 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
53f0: 28 70 50 74 72 6d 61 70 29 3b 0a 20 20 72 65 74  (pPtrmap);.  ret
5400: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5410: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
5420: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
5430: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
5440: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
5450: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
5460: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
5470: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
5480: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
5490: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
54a0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
54b0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
54c0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
54d0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
54e0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
54f0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
5500: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
5510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5520: 70 74 72 6d 61 70 47 65 74 28 42 74 72 65 65 20  ptrmapGet(Btree 
5530: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
5540: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
5550: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20   *pPgno){.  int 
5560: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
5570: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
5580: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
5590: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
55a0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
55b0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
55c0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
55d0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
55e0: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
55f0: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
5600: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
5610: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2d  RMAP_PAGENO(pBt-
5620: 3e 75 73 61 62 6c 65 53 69 7a 65 2c 20 6b 65 79  >usableSize, key
5630: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
5640: 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e  3pager_get(pBt->
5650: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
5660: 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 74 72 6d   (void **)&pPtrm
5670: 61 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  ap);.  if( rc!=0
5680: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
5690: 63 3b 0a 20 20 7d 0a 0a 20 20 6f 66 66 73 65 74  c;.  }..  offset
56a0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
56b0: 53 45 54 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  SET(pBt->usableS
56c0: 69 7a 65 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  ize, key);.  if(
56d0: 20 70 45 54 79 70 65 20 29 20 2a 70 45 54 79 70   pEType ) *pETyp
56e0: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
56f0: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
5700: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
5710: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
5720: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
5730: 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
5740: 70 50 74 72 6d 61 70 29 3b 0a 20 20 69 66 28 20  pPtrmap);.  if( 
5750: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
5760: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
5770: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
5780: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5790: 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
57a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
57b0: 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  OVACUUM */../*.*
57c0: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
57d0: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
57e0: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
57f0: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
5800: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
5810: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
5820: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
5830: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
5840: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
5850: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
5860: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5870: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
5880: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
5890: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
58a0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
58b0: 74 69 63 20 75 38 20 2a 66 69 6e 64 43 65 6c 6c  tic u8 *findCell
58c0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
58d0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75   int iCell){.  u
58e0: 38 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  8 *data = pPage-
58f0: 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74  >aData;.  assert
5900: 28 20 69 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20  ( iCell>=0 );.  
5910: 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3c 67 65  assert( iCell<ge
5920: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
5930: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
5940: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 61  ) );.  return da
5950: 74 61 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ta + get2byte(&d
5960: 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
5970: 66 66 73 65 74 2b 32 2a 69 43 65 6c 6c 5d 29 3b  ffset+2*iCell]);
5980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  .}../*.** This a
5990: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
59a0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
59b0: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
59c0: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
59d0: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
59e0: 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65  flow cells.  See
59f0: 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69   insert.*/.stati
5a00: 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c  c u8 *findOverfl
5a10: 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  owCell(MemPage *
5a20: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
5a30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
5a40: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
5a50: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
5a60: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
5a70: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
5a80: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
5a90: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
5aa0: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
5ab0: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
5ac0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
5ad0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
5ae0: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
5af0: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
5b00: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
5b10: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
5b20: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
5b30: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
5b40: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
5b50: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
5b60: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
5b70: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
5b80: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
5b90: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
5ba0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
5bb0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 70 61 72  s function.  par
5bc0: 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61  seCell() takes a
5bd0: 20 63 65 6c 6c 20 69 6e 64 65 78 0a 2a 2a 20 61   cell index.** a
5be0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
5bf0: 75 6d 65 6e 74 20 61 6e 64 20 70 61 72 73 65 43  ument and parseC
5c00: 65 6c 6c 50 74 72 28 29 20 74 61 6b 65 73 20 61  ellPtr() takes a
5c10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
5c20: 2a 2a 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63  ** body of the c
5c30: 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e  ell as its secon
5c40: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
5c50: 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65  tatic void parse
5c60: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
5c70: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
5c80: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
5c90: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
5ca0: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5cc0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
5cd0: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
5ce0: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
5cf0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
5d00: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
5d10: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20  */.){.  int n;  
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d30: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
5d40: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
5d50: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
5d60: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
5d70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5d80: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
5d90: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 70 49 6e  ayload */..  pIn
5da0: 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c  fo->pCell = pCel
5db0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  l;.  assert( pPa
5dc0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
5dd0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
5de0: 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68  .  n = pPage->ch
5df0: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73  ildPtrSize;.  as
5e00: 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61  sert( n==4-4*pPa
5e10: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66  ge->leaf );.  if
5e20: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
5e30: 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   ){.    n += get
5e40: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
5e50: 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b 0a  n], &nPayload);.
5e60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61    }else{.    nPa
5e70: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  yload = 0;.  }. 
5e80: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
5e90: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20  &pCell[n], (u64 
5ea0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
5eb0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65  .  pInfo->nHeade
5ec0: 72 20 3d 20 6e 3b 0a 20 20 70 49 6e 66 6f 2d 3e  r = n;.  pInfo->
5ed0: 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64  nData = nPayload
5ee0: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
5ef0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50  intKey ){.    nP
5f00: 61 79 6c 6f 61 64 20 2b 3d 20 70 49 6e 66 6f 2d  ayload += pInfo-
5f10: 3e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  >nKey;.  }.  if(
5f20: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
5f30: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
5f40: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
5f50: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
5f60: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
5f70: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
5f80: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
5f90: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
5fa0: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
5fb0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
5fc0: 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
5fd0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
5fe0: 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65  ze of cell conte
5ff0: 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  nt in bytes */. 
6000: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
6010: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
6020: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
6030: 77 20 3d 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65  w = 0;.    nSize
6040: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b   = nPayload + n;
6050: 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34  .    if( nSize<4
6060: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
6070: 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  = 4;        /* M
6080: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
6090: 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20   is 4 */.    }. 
60a0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
60b0: 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65  = nSize;.  }else
60c0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
60d0: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
60e0: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
60f0: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
6100: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  e, we have.    *
6110: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
6120: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
6130: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
6140: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
6150: 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  .    ** overflow
6160: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
6170: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
6180: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
6190: 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a  of unused.    **
61a0: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
61b0: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
61c0: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
61d0: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
61e0: 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74  ge.    ** in bet
61f0: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
6200: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20  d maxLocal..    
6210: 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e  **.    ** Warnin
6220: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
6230: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
6240: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
6250: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20  uted in any.    
6260: 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75  ** way will resu
6270: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  lt in an incompa
6280: 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61  tible file forma
6290: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
62a0: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
62b0: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
62c0: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
62d0: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
62e0: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
62f0: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
6300: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
6310: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
6320: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
6330: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
6340: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
6350: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
6360: 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  .    minLocal = 
6370: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
6380: 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  .    maxLocal = 
6390: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
63a0: 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  .    surplus = m
63b0: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c  inLocal + (nPayl
63c0: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
63d0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
63e0: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
63f0: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
6400: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
6410: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
6420: 20 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20 20 20   = surplus;.    
6430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e  }else{.      pIn
6440: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e  fo->nLocal = min
6450: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
6460: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
6470: 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  w = pInfo->nLoca
6480: 6c 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f  l + n;.    pInfo
6490: 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d  ->nSize = pInfo-
64a0: 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a  >iOverflow + 4;.
64b0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
64c0: 64 20 70 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  d parseCell(.  M
64d0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
64e0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
64f0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
6500: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
6510: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
6520: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
6530: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
6540: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
6550: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
6560: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
6570: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
6580: 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28  .  parseCellPtr(
6590: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
65a0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70  pPage, iCell), p
65b0: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
65c0: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
65d0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
65e0: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
65f0: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
6600: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
6610: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
6620: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
6630: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
6640: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
6650: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
6660: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
6670: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
6680: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
6690: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
66a0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
66b0: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
66c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c  .static int cell
66d0: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
66e0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
66f0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
6700: 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  ;.  parseCell(pP
6710: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e 66  age, iCell, &inf
6720: 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66  o);.  return inf
6730: 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69  o.nSize;.}.#endi
6740: 66 0a 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c  f.static int cel
6750: 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65  lSizePtr(MemPage
6760: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
6770: 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  ll){.  CellInfo 
6780: 69 6e 66 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c  info;.  parseCel
6790: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
67a0: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74  l, &info);.  ret
67b0: 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  urn info.nSize;.
67c0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
67d0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
67e0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
67f0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
6800: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
6810: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
6820: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
6830: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
6840: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
6850: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
6860: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
6870: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
6880: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
6890: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
68a0: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
68b0: 29 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 29  ){.  if( pCell )
68c0: 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
68d0: 6e 66 6f 3b 0a 20 20 20 20 70 61 72 73 65 43 65  nfo;.    parseCe
68e0: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
68f0: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
6900: 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  if( (info.nData+
6910: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
6920: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66  :info.nKey))>inf
6930: 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
6940: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
6950: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
6960: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
6970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 74 72        return ptr
6980: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
6990: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
69a0: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
69b0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  ->pgno);.    }. 
69c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
69d0: 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49  TE_OK;.}./*.** I
69e0: 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  f the cell with 
69f0: 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70  index iCell on p
6a00: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
6a10: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
6a20: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
6a30: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
6a40: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
6a50: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
6a60: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
6a70: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
6a80: 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  t ptrmapPutOvfl(
6a90: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
6aa0: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38  int iCell){.  u8
6ab0: 20 2a 70 43 65 6c 6c 3b 0a 20 20 70 43 65 6c 6c   *pCell;.  pCell
6ac0: 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
6ad0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
6ae0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d  );.  return ptrm
6af0: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
6b00: 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65  ge, pCell);.}.#e
6b10: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  ndif.../*.** Do 
6b20: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
6b30: 6f 6e 20 61 20 70 61 67 65 2e 20 20 54 68 72 6f  on a page.  Thro
6b40: 77 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  w an exception i
6b50: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 0a 2a 2a  f anything is.**
6b60: 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a   not right..**.*
6b70: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6b80: 73 20 75 73 65 64 20 66 6f 72 20 69 6e 74 65 72  s used for inter
6b90: 6e 61 6c 20 65 72 72 6f 72 20 63 68 65 63 6b 69  nal error checki
6ba0: 6e 67 20 6f 6e 6c 79 2e 20 20 49 74 20 69 73 20  ng only.  It is 
6bb0: 6f 6d 69 74 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omitted.** from 
6bc0: 6d 6f 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a  most builds..*/.
6bd0: 23 69 66 20 64 65 66 69 6e 65 64 28 42 54 52 45  #if defined(BTRE
6be0: 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65 66  E_DEBUG) && !def
6bf0: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
6c00: 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  0.static void _p
6c10: 61 67 65 49 6e 74 65 67 72 69 74 79 28 4d 65 6d  ageIntegrity(Mem
6c20: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
6c30: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
6c40: 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 69 6e    u8 *data;.  in
6c50: 74 20 69 2c 20 6a 2c 20 69 64 78 2c 20 63 2c 20  t i, j, idx, c, 
6c60: 70 63 2c 20 68 64 72 2c 20 6e 46 72 65 65 3b 0a  pc, hdr, nFree;.
6c70: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
6c80: 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 63  ;.  int nCell, c
6c90: 65 6c 6c 4c 69 6d 69 74 3b 0a 20 20 75 38 20 2a  ellLimit;.  u8 *
6ca0: 75 73 65 64 3b 0a 0a 20 20 75 73 65 64 20 3d 20  used;..  used = 
6cb0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
6cc0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
6cd0: 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 75  eSize );.  if( u
6ce0: 73 65 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  sed==0 ) return;
6cf0: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
6d00: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
6d10: 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  leSize;.  assert
6d20: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d  ( pPage->aData==
6d30: 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  &((unsigned char
6d40: 2a 29 70 50 61 67 65 29 5b 2d 70 50 61 67 65 2d  *)pPage)[-pPage-
6d50: 3e 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65 64 5d  >pBt->psAligned]
6d60: 20 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67   );.  hdr = pPag
6d70: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
6d80: 61 73 73 65 72 74 28 20 68 64 72 3d 3d 28 70 50  assert( hdr==(pP
6d90: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
6da0: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
6db0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
6dc0: 3d 3d 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  ==sqlite3pager_p
6dd0: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
6de0: 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 63 20 3d  >aData) );.  c =
6df0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 68 64   pPage->aData[hd
6e00: 72 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  r];.  if( pPage-
6e10: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
6e20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
6e30: 61 66 20 3d 3d 20 28 28 63 20 26 20 50 54 46 5f  af == ((c & PTF_
6e40: 4c 45 41 46 29 21 3d 30 29 20 29 3b 0a 20 20 20  LEAF)!=0) );.   
6e50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6e60: 7a 65 72 6f 44 61 74 61 20 3d 3d 20 28 28 63 20  zeroData == ((c 
6e70: 26 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21  & PTF_ZERODATA)!
6e80: 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
6e90: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  t( pPage->leafDa
6ea0: 74 61 20 3d 3d 20 28 28 63 20 26 20 50 54 46 5f  ta == ((c & PTF_
6eb0: 4c 45 41 46 44 41 54 41 29 21 3d 30 29 20 29 3b  LEAFDATA)!=0) );
6ec0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
6ed0: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 3d 20 28 28  ge->intKey == ((
6ee0: 63 20 26 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c  c & (PTF_INTKEY|
6ef0: 50 54 46 5f 4c 45 41 46 44 41 54 41 29 29 21 3d  PTF_LEAFDATA))!=
6f00: 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
6f10: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
6f20: 20 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20   ==.            
6f30: 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61   !(pPage->zeroDa
6f40: 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c  ta || (!pPage->l
6f50: 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65  eaf && pPage->le
6f60: 61 66 44 61 74 61 29 29 20 29 3b 0a 20 20 20 20  afData)) );.    
6f70: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
6f80: 65 6c 6c 4f 66 66 73 65 74 3d 3d 70 50 61 67 65  ellOffset==pPage
6f90: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 31 32 2d 34  ->hdrOffset+12-4
6fa0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
6fb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
6fc0: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
6fd0: 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
6fe0: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 7d  a[hdr+3]) );.  }
6ff0: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
7000: 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 73 65 74  >aData;.  memset
7010: 28 75 73 65 64 2c 20 30 2c 20 75 73 61 62 6c 65  (used, 0, usable
7020: 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Size);.  for(i=0
7030: 3b 20 69 3c 68 64 72 2b 31 30 2d 70 50 61 67 65  ; i<hdr+10-pPage
7040: 2d 3e 6c 65 61 66 2a 34 3b 20 69 2b 2b 29 20 75  ->leaf*4; i++) u
7050: 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 6e 46  sed[i] = 1;.  nF
7060: 72 65 65 20 3d 20 30 3b 0a 20 20 70 63 20 3d 20  ree = 0;.  pc = 
7070: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
7080: 64 72 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28  dr+1]);.  while(
7090: 20 70 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 73   pc ){.    int s
70a0: 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
70b0: 20 70 63 3e 30 20 26 26 20 70 63 3c 75 73 61 62   pc>0 && pc<usab
70c0: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
70d0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
70e0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
70f0: 20 20 61 73 73 65 72 74 28 20 70 63 2b 73 69 7a    assert( pc+siz
7100: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e<=usableSize );
7110: 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69  .    nFree += si
7120: 7a 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 63  ze;.    for(i=pc
7130: 3b 20 69 3c 70 63 2b 73 69 7a 65 3b 20 69 2b 2b  ; i<pc+size; i++
7140: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
7150: 20 75 73 65 64 5b 69 5d 3d 3d 30 20 29 3b 0a 20   used[i]==0 );. 
7160: 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20 31       used[i] = 1
7170: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 63 20 3d  ;.    }.    pc =
7180: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7190: 70 63 5d 29 3b 0a 20 20 7d 0a 20 20 69 64 78 20  pc]);.  }.  idx 
71a0: 3d 20 30 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67  = 0;.  nCell = g
71b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
71c0: 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c 4c 69 6d  r+3]);.  cellLim
71d0: 69 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  it = get2byte(&d
71e0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61  ata[hdr+5]);.  a
71f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
7200: 49 6e 69 74 3d 3d 30 20 0a 20 20 20 20 20 20 20  Init==0 .       
7210: 20 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 46 72 65    || pPage->nFre
7220: 65 3d 3d 6e 46 72 65 65 2b 64 61 74 61 5b 68 64  e==nFree+data[hd
7230: 72 2b 37 5d 2b 63 65 6c 6c 4c 69 6d 69 74 2d 28  r+7]+cellLimit-(
7240: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65  cellOffset+2*nCe
7250: 6c 6c 29 20 29 3b 0a 20 20 63 65 6c 6c 4f 66 66  ll) );.  cellOff
7260: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
7270: 6c 4f 66 66 73 65 74 3b 0a 20 20 66 6f 72 28 69  lOffset;.  for(i
7280: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
7290: 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  ){.    int size;
72a0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
72b0: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
72c0: 73 65 74 2b 32 2a 69 5d 29 3b 0a 20 20 20 20 61  set+2*i]);.    a
72d0: 73 73 65 72 74 28 20 70 63 3e 30 20 26 26 20 70  ssert( pc>0 && p
72e0: 63 3c 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  c<usableSize-4 )
72f0: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c  ;.    size = cel
7300: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61  lSize(pPage, &da
7310: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 61 73 73  ta[pc]);.    ass
7320: 65 72 74 28 20 70 63 2b 73 69 7a 65 3c 3d 75 73  ert( pc+size<=us
7330: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
7340: 66 6f 72 28 6a 3d 70 63 3b 20 6a 3c 70 63 2b 73  for(j=pc; j<pc+s
7350: 69 7a 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ize; j++){.     
7360: 20 61 73 73 65 72 74 28 20 75 73 65 64 5b 6a 5d   assert( used[j]
7370: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 75 73 65  ==0 );.      use
7380: 64 5b 6a 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  d[j] = 1;.    }.
7390: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 63 65 6c 6c    }.  for(i=cell
73a0: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 20  Offset+2*nCell; 
73b0: 69 3c 63 65 6c 6c 69 6d 69 74 3b 20 69 2b 2b 29  i<cellimit; i++)
73c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 75 73  {.    assert( us
73d0: 65 64 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  ed[i]==0 );.    
73e0: 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d  used[i] = 1;.  }
73f0: 0a 20 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  .  nFree = 0;.  
7400: 66 6f 72 28 69 3d 30 3b 20 69 3c 75 73 61 62 6c  for(i=0; i<usabl
7410: 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  eSize; i++){.   
7420: 20 61 73 73 65 72 74 28 20 75 73 65 64 5b 69 5d   assert( used[i]
7430: 3c 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 75  <=1 );.    if( u
7440: 73 65 64 5b 69 5d 3d 3d 30 20 29 20 6e 46 72 65  sed[i]==0 ) nFre
7450: 65 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  e++;.  }.  asser
7460: 74 28 20 6e 46 72 65 65 3d 3d 64 61 74 61 5b 68  t( nFree==data[h
7470: 64 72 2b 37 5d 20 29 3b 0a 20 20 73 71 6c 69 74  dr+7] );.  sqlit
7480: 65 46 72 65 65 28 75 73 65 64 29 3b 0a 7d 0a 23  eFree(used);.}.#
7490: 64 65 66 69 6e 65 20 70 61 67 65 49 6e 74 65 67  define pageInteg
74a0: 72 69 74 79 28 58 29 20 5f 70 61 67 65 49 6e 74  rity(X) _pageInt
74b0: 65 67 72 69 74 79 28 58 29 0a 23 65 6c 73 65 0a  egrity(X).#else.
74c0: 23 20 64 65 66 69 6e 65 20 70 61 67 65 49 6e 74  # define pageInt
74d0: 65 67 72 69 74 79 28 58 29 0a 23 65 6e 64 69 66  egrity(X).#endif
74e0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
74f0: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
7500: 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72  n.  All Cells ar
7510: 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
7520: 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  * beginning of t
7530: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
7540: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
7550: 6c 6c 65 63 74 65 64 20 0a 2a 2a 20 69 6e 74 6f  llected .** into
7560: 20 6f 6e 65 20 62 69 67 20 46 72 65 65 42 6c 6b   one big FreeBlk
7570: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
7580: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
7590: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
75a0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
75b0: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75d0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
75e0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
75f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7600: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
7610: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
7620: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7640: 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
7650: 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c   byte after cell
7660: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
7670: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7690: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
76a0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
76b0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
76c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
76d0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
76e0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
76f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7700: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
7710: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
7720: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
7730: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
7740: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
7750: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
7760: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  array */.  int b
7770: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
7780: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7790: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
77a0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
77b0: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
77c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
77d0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
77e0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
77f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
7800: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
7810: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
7820: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
7830: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
7840: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
7850: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
7860: 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65  ert( sqlite3page
7870: 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70 50  r_iswriteable(pP
7880: 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20  age->aData) );. 
7890: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
78a0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
78b0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
78c0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
78d0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
78e0: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
78f0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
7900: 3d 3d 30 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ==0 );.  temp = 
7910: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
7920: 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
7930: 7a 65 20 29 3b 0a 20 20 69 66 28 20 74 65 6d 70  ze );.  if( temp
7940: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
7950: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64 61 74  ITE_NOMEM;.  dat
7960: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
7970: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
7980: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
7990: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
79a0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
79b0: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
79c0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
79d0: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
79e0: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
79f0: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
7a00: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
7a10: 6c 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d 20  leSize;.  brk = 
7a20: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
7a30: 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
7a40: 28 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64 61  (&temp[brk], &da
7a50: 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  ta[brk], usableS
7a60: 69 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62 72  ize - brk);.  br
7a70: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
7a80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
7a90: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
7aa0: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
7ab0: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
7ac0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
7ad0: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
7ae0: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
7af0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
7b00: 70 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73 65  pAddr);.    asse
7b10: 72 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70 42  rt( pc<pPage->pB
7b20: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
7b30: 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c  .    size = cell
7b40: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
7b50: 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 62  temp[pc]);.    b
7b60: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
7b70: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72 6b  memcpy(&data[brk
7b80: 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69  ], &temp[pc], si
7b90: 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  ze);.    put2byt
7ba0: 65 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a 20  e(pAddr, brk);. 
7bb0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72 6b   }.  assert( brk
7bc0: 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  >=cellOffset+2*n
7bd0: 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79  Cell );.  put2by
7be0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
7bf0: 20 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64   brk);.  data[hd
7c00: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
7c10: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
7c20: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
7c30: 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66    addr = cellOff
7c40: 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d  set+2*nCell;.  m
7c50: 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72  emset(&data[addr
7c60: 5d 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29 3b  ], 0, brk-addr);
7c70: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 65  .  sqliteFree(te
7c80: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  mp);.  return SQ
7c90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
7ca0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
7cb0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
7cc0: 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  on a page..**.**
7cd0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
7ce0: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
7cf0: 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72  ata[] of the fir
7d00: 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
7d10: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
7d20: 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69 66  . Or return 0 if
7d30: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e   there is not en
7d40: 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70 61  ough free.** spa
7d50: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ce on the page t
7d60: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 61 6c  o satisfy the al
7d70: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73 74  location request
7d80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
7d90: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79  age contains nBy
7da0: 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61 63  tes of free spac
7db0: 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  e but does not c
7dc0: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73  ontain.** nBytes
7dd0: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 66   of contiguous f
7de0: 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20  ree space, then 
7df0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75 74  this routine aut
7e00: 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61  omatically.** ca
7e10: 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74 50  lls defragementP
7e20: 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69  age() to consoli
7e30: 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73 70  date all free sp
7e40: 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61  ace before .** a
7e50: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e 65  llocating the ne
7e60: 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74  w chunk..*/.stat
7e70: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
7e80: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
7e90: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  age, int nByte){
7ea0: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63 2c  .  int addr, pc,
7eb0: 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65   hdr;.  int size
7ec0: 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20  ;.  int nFrag;. 
7ed0: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20   int top;.  int 
7ee0: 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c  nCell;.  int cel
7ef0: 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67  lOffset;.  unsig
7f00: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
7f10: 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67    .  data = pPag
7f20: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65  e->aData;.  asse
7f30: 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65 72  rt( sqlite3pager
7f40: 5f 69 73 77 72 69 74 65 61 62 6c 65 28 64 61 74  _iswriteable(dat
7f50: 61 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  a) );.  assert( 
7f60: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
7f70: 69 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e 42  if( nByte<4 ) nB
7f80: 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 70  yte = 4;.  if( p
7f90: 50 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74  Page->nFree<nByt
7fa0: 65 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  e || pPage->nOve
7fb0: 72 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72 6e  rflow>0 ) return
7fc0: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72   0;.  pPage->nFr
7fd0: 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68  ee -= nByte;.  h
7fe0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
7ff0: 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20  ffset;..  nFrag 
8000: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
8010: 20 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b   if( nFrag<60 ){
8020: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
8030: 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  he freelist look
8040: 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62  ing for a slot b
8050: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
8060: 69 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  isfy the.    ** 
8070: 73 70 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a  space request. *
8080: 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64 72  /.    addr = hdr
8090: 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  +1;.    while( (
80a0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
80b0: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
80c0: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65  .      size = ge
80d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
80e0: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2]);.      if( s
80f0: 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20  ize>=nByte ){.  
8100: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e        if( size<n
8110: 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20  Byte+4 ){.      
8120: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
8130: 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63  [addr], &data[pc
8140: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 2);.         
8150: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e   data[hdr+7] = n
8160: 46 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42  Frag + size - nB
8170: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  yte;.          r
8180: 65 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20  eturn pc;.      
8190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
81a0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
81b0: 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42  a[pc+2], size-nB
81c0: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  yte);.          
81d0: 72 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65  return pc + size
81e0: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
81f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8200: 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20    addr = pc;.   
8210: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
8220: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
8230: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
8240: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
8250: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
8260: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
8270: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f  ntent area..  */
8280: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
8290: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
82a0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  .  nCell = get2b
82b0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
82c0: 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  );.  cellOffset 
82d0: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
82e0: 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  set;.  if( nFrag
82f0: 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73  >=60 || cellOffs
8300: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74  et + 2*nCell > t
8310: 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20  op - nByte ){.  
8320: 20 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e 74    if( defragment
8330: 50 61 67 65 28 70 50 61 67 65 29 20 29 20 72 65  Page(pPage) ) re
8340: 74 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20  turn 0;.    top 
8350: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
8360: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20  [hdr+5]);.  }.  
8370: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
8380: 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73  assert( cellOffs
8390: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20  et + 2*nCell <= 
83a0: 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74  top );.  put2byt
83b0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
83c0: 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74  top);.  return t
83d0: 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  op;.}../*.** Ret
83e0: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
83f0: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
8400: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
8410: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
8420: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
8430: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
8440: 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74  age->aDisk[start
8450: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
8460: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
8470: 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a  s "size" bytes..
8480: 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68  **.** Most of th
8490: 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73  e effort here is
84a0: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61   involved in coa
84b0: 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a  lesing adjacent.
84c0: 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69  ** free blocks i
84d0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67  nto a single big
84e0: 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a   free block..*/.
84f0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
8500: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
8510: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
8520: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
8530: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
8540: 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  hdr;.  unsigned 
8550: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
8560: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
8570: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
8580: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8590: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
85a0: 77 72 69 74 65 61 62 6c 65 28 64 61 74 61 29 20  writeable(data) 
85b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
85c0: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
85d0: 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
85e0: 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73  eaf?0:4) );.  as
85f0: 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73  sert( (start + s
8600: 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74  ize)<=pPage->pBt
8610: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
8620: 20 20 69 66 28 20 73 69 7a 65 3c 34 20 29 20 73    if( size<4 ) s
8630: 69 7a 65 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20 41  ize = 4;..  /* A
8640: 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63  dd the space bac
8650: 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  k into the linke
8660: 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  d list of freebl
8670: 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20  ocks */.  hdr = 
8680: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
8690: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
86a0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
86b0: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
86c0: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
86d0: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
86e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
86f0: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
8700: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
8710: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8720: 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20  begin>addr );.  
8730: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
8740: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
8750: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
8760: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
8770: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 62 65  );.  assert( pbe
8780: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
8790: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
87a0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
87b0: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
87c0: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
87d0: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
87e0: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
87f0: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
8800: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73  Page->nFree += s
8810: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65  ize;..  /* Coale
8820: 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65  sce adjacent fre
8830: 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64  e blocks */.  ad
8840: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8850: 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69  ffset + 1;.  whi
8860: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
8870: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
8880: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e  r]))>0 ){.    in
8890: 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a  t pnext, psize;.
88a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
88b0: 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61  in>addr );.    a
88c0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
88d0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
88e0: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70  eSize-4 );.    p
88f0: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
8900: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a  &data[pbegin]);.
8910: 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32      psize = get2
8920: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
8930: 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  n+2]);.    if( p
8940: 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20  begin + psize + 
8950: 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e  3 >= pnext && pn
8960: 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ext>0 ){.      i
8970: 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20  nt frag = pnext 
8980: 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29  - (pbegin+psize)
8990: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
89a0: 66 72 61 67 3c 3d 64 61 74 61 5b 70 50 61 67 65  frag<=data[pPage
89b0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 29  ->hdrOffset+7] )
89c0: 3b 0a 20 20 20 20 20 20 64 61 74 61 5b 70 50 61  ;.      data[pPa
89d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d  ge->hdrOffset+7]
89e0: 20 2d 3d 20 66 72 61 67 3b 0a 20 20 20 20 20 20   -= frag;.      
89f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
8a00: 62 65 67 69 6e 5d 2c 20 67 65 74 32 62 79 74 65  begin], get2byte
8a10: 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b  (&data[pnext]));
8a20: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
8a30: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c  &data[pbegin+2],
8a40: 20 70 6e 65 78 74 2b 67 65 74 32 62 79 74 65 28   pnext+get2byte(
8a50: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d  &data[pnext+2])-
8a60: 70 62 65 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c  pbegin);.    }el
8a70: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  se{.      addr =
8a80: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20   pbegin;.    }. 
8a90: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
8aa0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
8ab0: 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  a begins with a 
8ac0: 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76  freeblock, remov
8ad0: 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64  e it. */.  if( d
8ae0: 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61  ata[hdr+1]==data
8af0: 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b  [hdr+5] && data[
8b00: 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+2]==data[hdr
8b10: 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  +6] ){.    int t
8b20: 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d  op;.    pbegin =
8b30: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8b40: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d  hdr+1]);.    mem
8b50: 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  cpy(&data[hdr+1]
8b60: 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  , &data[pbegin],
8b70: 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   2);.    top = g
8b80: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
8b90: 72 2b 35 5d 29 3b 0a 20 20 20 20 70 75 74 32 62  r+5]);.    put2b
8ba0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
8bb0: 2c 20 74 6f 70 20 2b 20 67 65 74 32 62 79 74 65  , top + get2byte
8bc0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
8bd0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
8be0: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
8bf0: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
8c00: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
8c10: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
8c20: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
8c30: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
8c40: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
8c50: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
8c60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
8c70: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
8c80: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
8c90: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 72 65  lagByte){.  Btre
8ca0: 65 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  e *pBt;     /* A
8cb0: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
8cc0: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
8cd0: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
8ce0: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
8cf0: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
8d00: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ;.  pPage->intKe
8d10: 79 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20  y = (flagByte & 
8d20: 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
8d30: 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20  LEAFDATA))!=0;. 
8d40: 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61   pPage->zeroData
8d50: 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50   = (flagByte & P
8d60: 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b  TF_ZERODATA)!=0;
8d70: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
8d80: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
8d90: 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61  _LEAF)!=0;.  pPa
8da0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
8db0: 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61   = 4*(pPage->lea
8dc0: 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70  f==0);.  pBt = p
8dd0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
8de0: 20 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f   flagByte & PTF_
8df0: 4c 45 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20  LEAFDATA ){.    
8e00: 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
8e10: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
8e20: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
8e30: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
8e40: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
8e50: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
8e60: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d  else{.    pPage-
8e70: 3e 6c 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20  >leafData = 0;. 
8e80: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
8e90: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
8ea0: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
8eb0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
8ec0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70  inLocal;.  }.  p
8ed0: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
8ee0: 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74  !(pPage->zeroDat
8ef0: 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65  a || (!pPage->le
8f00: 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61  af && pPage->lea
8f10: 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  fData));.}../*.*
8f20: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
8f30: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
8f40: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
8f50: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  k block..**.** T
8f60: 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d  he pParent param
8f70: 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 70  eter must be a p
8f80: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
8f90: 6d 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69  mPage which.** i
8fa0: 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  s the parent of 
8fb0: 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 69  the page being i
8fc0: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
8fd0: 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54   root of a.** BT
8fe0: 72 65 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e  ree has no paren
8ff0: 74 20 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61  t and so for tha
9000: 74 20 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d  t page, pParent=
9010: 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  =NULL..**.** Ret
9020: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
9030: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
9040: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
9050: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
9060: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
9070: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
9080: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
9090: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
90a0: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
90b0: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
90c0: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
90d0: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
90e0: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
90f0: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
9100: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
9110: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
9120: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
9130: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
9140: 74 20 69 6e 69 74 50 61 67 65 28 0a 20 20 4d 65  t initPage(.  Me
9150: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9160: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
9170: 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   to be initializ
9180: 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ed */.  MemPage 
9190: 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20 20 2f  *pParent       /
91a0: 2a 20 54 68 65 20 70 61 72 65 6e 74 2e 20 20 4d  * The parent.  M
91b0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
91c0: 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  ){.  int pc;    
91d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
91e0: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
91f0: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
9200: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aData[] */.  int
9210: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
9220: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
9230: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
9240: 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64  eader */.  u8 *d
9250: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
9260: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
9270: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 72 65  >aData */.  Btre
9280: 65 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  e *pBt;        /
9290: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
92a0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
92b0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
92c0: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
92d0: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
92e0: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  each page */.  i
92f0: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
9300: 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d    /* Offset from
9310: 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74   start of page t
9320: 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  o first cell poi
9330: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  nter */.  int nF
9340: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
9350: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
9360: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
9370: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  ge */.  int top;
9380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
9390: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
93a0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
93b0: 61 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50  a */..  pBt = pP
93c0: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  age->pBt;.  asse
93d0: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
93e0: 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d  assert( pParent=
93f0: 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70  =0 || pParent->p
9400: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73 73  Bt==pBt );.  ass
9410: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
9420: 3d 3d 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  ==sqlite3pager_p
9430: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
9440: 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 61 73 73  >aData) );.  ass
9450: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
9460: 61 20 3d 3d 20 26 28 28 75 6e 73 69 67 6e 65 64  a == &((unsigned
9470: 20 63 68 61 72 2a 29 70 50 61 67 65 29 5b 2d 70   char*)pPage)[-p
9480: 42 74 2d 3e 70 73 41 6c 69 67 6e 65 64 5d 20 29  Bt->psAligned] )
9490: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
94a0: 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74 20  Parent!=pParent 
94b0: 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72 65  && (pPage->pPare
94c0: 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  nt!=0 || pPage->
94d0: 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f  isInit) ){.    /
94e0: 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70 61 67  * The parent pag
94f0: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 63  e should never c
9500: 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74 68 65  hange unless the
9510: 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
9520: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
9530: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 2f  QLITE_CORRUPT; /
9540: 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a  * bkpt-CORRUPT *
9550: 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  /.  }.  if( pPag
9560: 65 2d 3e 69 73 49 6e 69 74 20 29 20 72 65 74 75  e->isInit ) retu
9570: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
9580: 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
9590: 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74  nt==0 && pParent
95a0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  !=0 ){.    pPage
95b0: 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72  ->pParent = pPar
95c0: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
95d0: 70 61 67 65 72 5f 72 65 66 28 70 50 61 72 65 6e  pager_ref(pParen
95e0: 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d 0a 20  t->aData);.  }. 
95f0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
9600: 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
9610: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
9620: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
9630: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 3b  age, data[hdr]);
9640: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
9650: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
9660: 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
9670: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
9680: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
9690: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
96a0: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
96b0: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
96c0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 74  pPage->leaf;.  t
96d0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
96e0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 70  ata[hdr+5]);.  p
96f0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
9700: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9710: 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67  +3]);.  if( pPag
9720: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
9730: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
9740: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
9750: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
9760: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
9770: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
9780: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9790: 43 4f 52 52 55 50 54 3b 20 2f 2a 20 62 6b 70 74  CORRUPT; /* bkpt
97a0: 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 7d 0a  -CORRUPT */.  }.
97b0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
97c0: 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74  ll==0 && pParent
97d0: 21 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  !=0 && pParent->
97e0: 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 2f  pgno!=1 ){.    /
97f0: 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d 75 73 74  * All pages must
9800: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
9810: 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65 70 74 20  ne cell, except 
9820: 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73 20 2a  for root pages *
9830: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
9840: 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 2f 2a 20  ITE_CORRUPT; /* 
9850: 62 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a  bkpt-CORRUPT */.
9860: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
9870: 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
9880: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
9890: 67 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74  ge */.  pc = get
98a0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
98b0: 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64  1]);.  nFree = d
98c0: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70  ata[hdr+7] + top
98d0: 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b   - (cellOffset +
98e0: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29   2*pPage->nCell)
98f0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20  ;.  while( pc>0 
9900: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 2c  ){.    int next,
9910: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70   size;.    if( p
9920: 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  c>usableSize-4 )
9930: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  {.      /* Free 
9940: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
9950: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 72   page */.      r
9960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9970: 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43  RUPT;  /* bkpt-C
9980: 4f 52 52 55 50 54 20 2a 2f 0a 20 20 20 20 7d 0a  ORRUPT */.    }.
9990: 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
99a0: 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
99b0: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
99c0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
99d0: 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30  ;.    if( next>0
99e0: 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a   && next<=pc+siz
99f0: 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  e+3 ){.      /* 
9a00: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
9a10: 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e 67   be in accending
9a20: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
9a30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9a40: 52 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d  RRUPT;  /* bkpt-
9a50: 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 20 20 7d  CORRUPT */.    }
9a60: 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69  .    nFree += si
9a70: 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65 78  ze;.    pc = nex
9a80: 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  t;.  }.  pPage->
9a90: 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20  nFree = nFree;. 
9aa0: 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62   if( nFree>=usab
9ab0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  leSize ){.    /*
9ac0: 20 46 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e   Free space cann
9ad0: 6f 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20  ot exceed total 
9ae0: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  page size */.   
9af0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9b00: 4f 52 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74  ORRUPT;  /* bkpt
9b10: 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 7d 0a  -CORRUPT */.  }.
9b20: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
9b30: 20 3d 20 31 3b 0a 20 20 70 61 67 65 49 6e 74 65   = 1;.  pageInte
9b40: 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20 20  grity(pPage);.  
9b50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9b60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
9b70: 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20  p a raw page so 
9b80: 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69  that it looks li
9b90: 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61  ke a database pa
9ba0: 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f  ge holding.** no
9bb0: 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
9bc0: 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67  tic void zeroPag
9bd0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
9be0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
9bf0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
9c00: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
9c10: 74 61 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ta;.  Btree *pBt
9c20: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
9c30: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
9c40: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
9c50: 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  nt first;..  ass
9c60: 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65  ert( sqlite3page
9c70: 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 64 61 74  r_pagenumber(dat
9c80: 61 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  a)==pPage->pgno 
9c90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26 64 61  );.  assert( &da
9ca0: 74 61 5b 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65  ta[pBt->psAligne
9cb0: 64 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65 64 20  d] == (unsigned 
9cc0: 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a 20  char*)pPage );. 
9cd0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ce0: 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c  pager_iswriteabl
9cf0: 65 28 64 61 74 61 29 20 29 3b 0a 20 20 6d 65 6d  e(data) );.  mem
9d00: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
9d10: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
9d20: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64 61 74  ze - hdr);.  dat
9d30: 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a  a[hdr] = flags;.
9d40: 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20    first = hdr + 
9d50: 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54  8 + 4*((flags&PT
9d60: 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d  F_LEAF)==0);.  m
9d70: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
9d80: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
9d90: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
9da0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
9db0: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
9dc0: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
9dd0: 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75  ->nFree = pBt->u
9de0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
9df0: 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  t;.  decodeFlags
9e00: 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  (pPage, flags);.
9e10: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
9e20: 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67  et = hdr;.  pPag
9e30: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
9e40: 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e  first;.  pPage->
9e50: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
9e60: 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
9e70: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e   = 0;.  pPage->n
9e80: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
9e90: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
9ea0: 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70   pageIntegrity(p
9eb0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
9ec0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
9ed0: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
9ee0: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
9ef0: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
9f00: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
9f10: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
9f20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
9f30: 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 42 74  tPage(Btree *pBt
9f40: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d  , Pgno pgno, Mem
9f50: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 29 7b 0a  Page **ppPage){.
9f60: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
9f70: 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
9f80: 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
9f90: 67 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ge;.  rc = sqlit
9fa0: 65 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d  e3pager_get(pBt-
9fb0: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
9fc0: 76 6f 69 64 2a 2a 29 26 61 44 61 74 61 29 3b 0a  void**)&aData);.
9fd0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9fe0: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20  n rc;.  pPage = 
9ff0: 28 4d 65 6d 50 61 67 65 2a 29 26 61 44 61 74 61  (MemPage*)&aData
a000: 5b 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65 64 5d  [pBt->psAligned]
a010: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
a020: 20 3d 20 61 44 61 74 61 3b 0a 20 20 70 50 61 67   = aData;.  pPag
a030: 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
a040: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
a050: 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  no;.  pPage->hdr
a060: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
a070: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
a080: 30 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70  0;.  *ppPage = p
a090: 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
a0a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a0b0: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
a0c0: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
a0d0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20   initialize it. 
a0e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
a0f0: 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65   is just a conve
a100: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
a110: 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63  round separate c
a120: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 67 65 74 50 61  alls to.** getPa
a130: 67 65 28 29 20 61 6e 64 20 69 6e 69 74 50 61 67  ge() and initPag
a140: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
a150: 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
a160: 65 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 2c  e(.  Btree *pBt,
a170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a180: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
a190: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
a1a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a1b0: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
a1c0: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
a1d0: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
a1e0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
a1f0: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
a200: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
a210: 72 65 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65  rent     /* Pare
a220: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nt of the page *
a230: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
a240: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a   if( pgno==0 ){.
a250: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a260: 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f 2a 20 62  E_CORRUPT;  /* b
a270: 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20  kpt-CORRUPT */. 
a280: 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67   }.  rc = getPag
a290: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
a2a0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
a2b0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70  SQLITE_OK && (*p
a2c0: 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
a2d0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 6e  0 ){.    rc = in
a2e0: 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c 20  itPage(*ppPage, 
a2f0: 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  pParent);.  }.  
a300: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
a310: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
a320: 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
a330: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
a340: 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
a350: 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 67 65 74  r.** call to get
a360: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
a370: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
a380: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
a390: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  {.  if( pPage ){
a3a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
a3b0: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
a3c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a3d0: 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pBt );.    asser
a3e0: 74 28 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61  t( &pPage->aData
a3f0: 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 73 41  [pPage->pBt->psA
a400: 6c 69 67 6e 65 64 5d 3d 3d 28 75 6e 73 69 67 6e  ligned]==(unsign
a410: 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 20 29  ed char*)pPage )
a420: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  ;.    sqlite3pag
a430: 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 2d 3e  er_unref(pPage->
a440: 61 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  aData);.  }.}../
a450: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a460: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
a470: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
a480: 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 0a  ount for a page.
a490: 2a 2a 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ** reaches zero.
a4a0: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 75 6e 72    We need to unr
a4b0: 65 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70  ef the pParent p
a4c0: 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68 61 74  ointer when that
a4d0: 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a  .** happens..*/.
a4e0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
a4f0: 44 65 73 74 72 75 63 74 6f 72 28 76 6f 69 64 20  Destructor(void 
a500: 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65  *pData, int page
a510: 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Size){.  MemPage
a520: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
a530: 67 65 2a 29 26 28 28 63 68 61 72 2a 29 70 44 61  ge*)&((char*)pDa
a540: 74 61 29 5b 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  ta)[FORCE_ALIGNM
a550: 45 4e 54 28 70 61 67 65 53 69 7a 65 29 5d 3b 0a  ENT(pageSize)];.
a560: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
a570: 72 65 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50  rent ){.    MemP
a580: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70  age *pParent = p
a590: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
a5a0: 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
a5b0: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  t = 0;.    relea
a5c0: 73 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b  sePage(pParent);
a5d0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73  .  }.  pPage->is
a5e0: 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Init = 0;.}../*.
a5f0: 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
a600: 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
a610: 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
a620: 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
a630: 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
a640: 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
a650: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
a660: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
a670: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
a680: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
a690: 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
a6a0: 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
a6b0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a6c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
a6d0: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
a6e0: 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
a6f0: 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
a700: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
a710: 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
a720: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
a730: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
a740: 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
a750: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
a760: 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65   pageSize){.  Me
a770: 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
a780: 4d 65 6d 50 61 67 65 2a 29 26 28 28 63 68 61 72  MemPage*)&((char
a790: 2a 29 70 44 61 74 61 29 5b 46 4f 52 43 45 5f 41  *)pData)[FORCE_A
a7a0: 4c 49 47 4e 4d 45 4e 54 28 70 61 67 65 53 69 7a  LIGNMENT(pageSiz
a7b0: 65 29 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  e)];.  if( pPage
a7c0: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
a7d0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
a7e0: 30 3b 0a 20 20 20 20 69 6e 69 74 50 61 67 65 28  0;.    initPage(
a7f0: 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50  pPage, pPage->pP
a800: 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  arent);.  }.}../
a810: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
a820: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
a830: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
a840: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
a850: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
a860: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
a870: 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74  ULL.** a new dat
a880: 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e  abase with a ran
a890: 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61  dom name is crea
a8a0: 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f  ted.  This rando
a8b0: 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74  mly named.** dat
a8c0: 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
a8d0: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  be deleted when 
a8e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
a8f0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
a900: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
a910: 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  eeOpen(.  const 
a920: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
a930: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
a940: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
a950: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
a960: 61 73 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ase */.  Btree *
a970: 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
a980: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
a990: 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
a9a0: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
a9b0: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
a9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
a9d0: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 72  ions */.){.  Btr
a9e0: 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 72  ee *pBt;.  int r
a9f0: 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76  c;.  int nReserv
aa00: 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  e;.  unsigned ch
aa10: 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
aa20: 5d 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  ];..  /*.  ** Th
aa30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
aa40: 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68  rts make sure th
aa50: 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73  at structures us
aa60: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
aa70: 61 72 65 0a 20 20 2a 2a 20 74 68 65 20 72 69 67  are.  ** the rig
aa80: 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
aa90: 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
aaa0: 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
aab0: 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 2a 2a  that result.  **
aac0: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
aad0: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
aae0: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 2a  rchitecture..  *
aaf0: 2f 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  /.  assert( size
ab00: 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20  of(i64)==8 );.  
ab10: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
ab20: 36 34 29 3d 3d 38 20 29 3b 0a 20 20 61 73 73 65  64)==8 );.  asse
ab30: 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
ab40: 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
ab50: 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
ab60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
ab70: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
ab80: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
ab90: 70 74 72 29 3d 3d 73 69 7a 65 6f 66 28 63 68 61  ptr)==sizeof(cha
aba0: 72 2a 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  r*) );.  assert(
abb0: 20 73 69 7a 65 6f 66 28 75 70 74 72 29 3d 3d 73   sizeof(uptr)==s
abc0: 69 7a 65 6f 66 28 70 74 72 29 20 29 3b 0a 0a 20  izeof(ptr) );.. 
abd0: 20 70 42 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pBt = sqliteMal
abe0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  loc( sizeof(*pBt
abf0: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 3d 3d  ) );.  if( pBt==
ac00: 30 20 29 7b 0a 20 20 20 20 2a 70 70 42 74 72 65  0 ){.    *ppBtre
ac10: 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  e = 0;.    retur
ac20: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ac30: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
ac40: 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 26 70 42  e3pager_open(&pB
ac50: 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
ac60: 6e 61 6d 65 2c 20 45 58 54 52 41 5f 53 49 5a 45  name, EXTRA_SIZE
ac70: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
ac80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ac90: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50  .    if( pBt->pP
aca0: 61 67 65 72 20 29 20 73 71 6c 69 74 65 33 70 61  ager ) sqlite3pa
acb0: 67 65 72 5f 63 6c 6f 73 65 28 70 42 74 2d 3e 70  ger_close(pBt->p
acc0: 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  Pager);.    sqli
acd0: 74 65 46 72 65 65 28 70 42 74 29 3b 0a 20 20 20  teFree(pBt);.   
ace0: 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
acf0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
ad00: 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  }.  sqlite3pager
ad10: 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28  _set_destructor(
ad20: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
ad30: 65 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  eDestructor);.  
ad40: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
ad50: 5f 72 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70  _reiniter(pBt->p
ad60: 50 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69  Pager, pageReini
ad70: 74 29 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73  t);.  pBt->pCurs
ad80: 6f 72 20 3d 20 30 3b 0a 20 20 70 42 74 2d 3e 70  or = 0;.  pBt->p
ad90: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 70 42 74  Page1 = 0;.  pBt
ada0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c  ->readOnly = sql
adb0: 69 74 65 33 70 61 67 65 72 5f 69 73 72 65 61 64  ite3pager_isread
adc0: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
add0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  );.  sqlite3page
ade0: 72 5f 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65  r_read_fileheade
adf0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73  r(pBt->pPager, s
ae00: 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
ae10: 2c 20 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  , zDbHeader);.  
ae20: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
ae30: 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61  get2byte(&zDbHea
ae40: 64 65 72 5b 31 36 5d 29 3b 0a 20 20 69 66 28 20  der[16]);.  if( 
ae50: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
ae60: 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
ae70: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
ae80: 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 70  GE_SIZE ){.    p
ae90: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53  Bt->pageSize = S
aea0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
aeb0: 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 70 42 74  GE_SIZE;.    pBt
aec0: 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d  ->maxEmbedFrac =
aed0: 20 36 34 3b 20 20 20 2f 2a 20 32 35 25 20 2a 2f   64;   /* 25% */
aee0: 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62  .    pBt->minEmb
aef0: 65 64 46 72 61 63 20 3d 20 33 32 3b 20 20 20 2f  edFrac = 32;   /
af00: 2a 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20 20 70  * 12.5% */.    p
af10: 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20  Bt->minLeafFrac 
af20: 3d 20 33 32 3b 20 20 20 20 2f 2a 20 31 32 2e 35  = 32;    /* 12.5
af30: 25 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  % */.#ifndef SQL
af40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
af50: 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  UUM.    /* If th
af60: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
af70: 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
af80: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
af90: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
afa0: 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 73 65      ** do not se
afb0: 74 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  t the auto-vacuu
afc0: 6d 20 66 6c 61 67 2c 20 65 76 65 6e 20 69 66 20  m flag, even if 
afd0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
afe0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2a 2a  UTOVACUUM.    **
aff0: 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
b000: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
b010: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
b020: 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
b030: 66 69 6e 65 64 2c 0a 20 20 20 20 2a 2a 20 74 68  fined,.    ** th
b040: 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
b050: 20 6a 75 73 74 20 61 20 72 65 67 75 6c 61 72 20   just a regular 
b060: 66 69 6c 65 2d 6e 61 6d 65 2e 20 52 65 73 70 65  file-name. Respe
b070: 63 74 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  ct the auto-vacu
b080: 75 6d 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  um.    ** defaul
b090: 74 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  t in this case..
b0a0: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
b0b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
b0c0: 59 44 42 0a 20 20 20 20 69 66 28 20 7a 46 69 6c  YDB.    if( zFil
b0d0: 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
b0e0: 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
b0f0: 72 79 3a 22 29 20 29 7b 0a 23 65 6c 73 65 0a 20  ry:") ){.#else. 
b100: 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
b110: 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   ){.#endif.     
b120: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
b130: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
b140: 54 5f 41 55 54 4f 56 41 43 55 55 4d 3b 0a 20 20  T_AUTOVACUUM;.  
b150: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e    }.#endif.    n
b160: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 7d  Reserve = 0;.  }
b170: 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 65 72  else{.    nReser
b180: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
b190: 30 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78  0];.    pBt->max
b1a0: 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48  EmbedFrac = zDbH
b1b0: 65 61 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20 70  eader[21];.    p
b1c0: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
b1d0: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 32 5d   = zDbHeader[22]
b1e0: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  ;.    pBt->minLe
b1f0: 61 66 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64  afFrac = zDbHead
b200: 65 72 5b 32 33 5d 3b 0a 20 20 20 20 70 42 74 2d  er[23];.    pBt-
b210: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
b220: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
b230: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
b240: 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
b250: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
b260: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
b270: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 4*4])?1:0);.#
b280: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 42 74 2d  endif.  }.  pBt-
b290: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
b2a0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
b2b0: 65 73 65 72 76 65 3b 0a 20 20 70 42 74 2d 3e 70  eserve;.  pBt->p
b2c0: 73 41 6c 69 67 6e 65 64 20 3d 20 46 4f 52 43 45  sAligned = FORCE
b2d0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42 74 2d 3e  _ALIGNMENT(pBt->
b2e0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 73 71 6c  pageSize);.  sql
b2f0: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61  ite3pager_set_pa
b300: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
b310: 65 72 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  er, pBt->pageSiz
b320: 65 29 3b 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  e);.  *ppBtree =
b330: 20 70 42 74 3b 0a 20 20 72 65 74 75 72 6e 20 53   pBt;.  return S
b340: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b350: 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e  ** Close an open
b360: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e   database and in
b370: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72  validate all cur
b380: 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sors..*/.int sql
b390: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42  ite3BtreeClose(B
b3a0: 74 72 65 65 20 2a 70 42 74 29 7b 0a 20 20 77 68  tree *pBt){.  wh
b3b0: 69 6c 65 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ile( pBt->pCurso
b3c0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
b3d0: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
b3e0: 28 70 42 74 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pBt->pCursor);.
b3f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67    }.  sqlite3pag
b400: 65 72 5f 63 6c 6f 73 65 28 70 42 74 2d 3e 70 50  er_close(pBt->pP
b410: 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 46  ager);.  sqliteF
b420: 72 65 65 28 70 42 74 29 3b 0a 20 20 72 65 74 75  ree(pBt);.  retu
b430: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b440: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
b450: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 63  e busy handler c
b460: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
b470: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b480: 42 74 72 65 65 53 65 74 42 75 73 79 48 61 6e 64  BtreeSetBusyHand
b490: 6c 65 72 28 42 74 72 65 65 20 2a 70 42 74 2c 20  ler(Btree *pBt, 
b4a0: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 48 61  BusyHandler *pHa
b4b0: 6e 64 6c 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  ndler){.  sqlite
b4c0: 33 70 61 67 65 72 5f 73 65 74 5f 62 75 73 79 68  3pager_set_busyh
b4d0: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
b4e0: 65 72 2c 20 70 48 61 6e 64 6c 65 72 29 3b 0a 20  er, pHandler);. 
b4f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b500: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
b510: 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
b520: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
b530: 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
b540: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
b550: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
b560: 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
b570: 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
b580: 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
b590: 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
b5a0: 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
b5b0: 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
b5c0: 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
b5d0: 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
b5e0: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
b5f0: 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
b600: 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
b610: 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
b620: 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
b630: 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
b640: 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
b650: 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
b660: 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
b670: 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
b680: 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
b690: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
b6a0: 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
b6b0: 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
b6c0: 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
b6d0: 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
b6e0: 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
b6f0: 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
b700: 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
b710: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
b720: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
b730: 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
b740: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
b750: 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
b760: 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
b770: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
b780: 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
b790: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
b7a0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
b7b0: 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
b7c0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
b7d0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
b7e0: 65 65 20 2a 70 42 74 2c 20 69 6e 74 20 6d 78 50  ee *pBt, int mxP
b7f0: 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 70  age){.  sqlite3p
b800: 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69  ager_set_cachesi
b810: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
b820: 6d 78 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  mxPage);.  retur
b830: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b840: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
b850: 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
b860: 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
b870: 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
b880: 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
b890: 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
b8a0: 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
b8b0: 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
b8c0: 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
b8d0: 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
b8e0: 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
b8f0: 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
b900: 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
b910: 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
b920: 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
b930: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
b940: 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
b950: 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
b960: 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
b970: 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
b980: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
b990: 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
b9a0: 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
b9b0: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
b9c0: 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
b9d0: 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
b9e0: 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
b9f0: 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
ba00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ba10: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
ba20: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
ba30: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42  SetSafetyLevel(B
ba40: 74 72 65 65 20 2a 70 42 74 2c 20 69 6e 74 20 6c  tree *pBt, int l
ba50: 65 76 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  evel){.  sqlite3
ba60: 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79  pager_set_safety
ba70: 5f 6c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  _level(pBt->pPag
ba80: 65 72 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 72 65  er, level);.  re
ba90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
baa0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
bab0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bac0: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
bad0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
bae0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
baf0: 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  )./*.** Change t
bb00: 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
bb10: 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
bb20: 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
bb30: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
bb40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
bb50: 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
bb60: 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
bb70: 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
bb80: 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
bb90: 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
bba0: 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
bbb0: 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
bbc0: 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
bbd0: 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
bbe0: 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
bbf0: 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
bc00: 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
bc10: 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
bc20: 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
bc30: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
bc40: 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
bc50: 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
bc60: 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
bc70: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
bc80: 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
bc90: 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
bca0: 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
bcb0: 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
bcc0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
bcd0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
bce0: 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
bcf0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
bd00: 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
bd10: 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
bd20: 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
bd30: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
bd40: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
bd50: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
bd60: 7a 65 28 42 74 72 65 65 20 2a 70 42 74 2c 20 69  ze(Btree *pBt, i
bd70: 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
bd80: 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 66   nReserve){.  if
bd90: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
bda0: 69 78 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  ixed ){.    retu
bdb0: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
bdc0: 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  LY;.  }.  if( nR
bdd0: 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20  eserve<0 ){.    
bde0: 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e  nReserve = pBt->
bdf0: 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
be00: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a  usableSize;.  }.
be10: 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
be20: 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
be30: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
be40: 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
be50: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
be60: 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
be70: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
be80: 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
be90: 20 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65 64 20   pBt->psAligned 
bea0: 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  = FORCE_ALIGNMEN
beb0: 54 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  T(pageSize);.   
bec0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
bed0: 74 5f 70 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  t_pagesize(pBt->
bee0: 70 50 61 67 65 72 2c 20 70 61 67 65 53 69 7a 65  pPager, pageSize
bef0: 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73  );.  }.  pBt->us
bf00: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
bf10: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
bf20: 72 76 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  rve;.  return SQ
bf30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
bf40: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
bf50: 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
bf60: 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
bf70: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
bf80: 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
bf90: 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42  Bt){.  return pB
bfa0: 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69  t->pageSize;.}.i
bfb0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
bfc0: 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
bfd0: 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pBt){.  return 
bfe0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
bff0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
c000: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
c010: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c020: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
c030: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
c040: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
c050: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
c060: 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
c070: 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
c080: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
c090: 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
c0a0: 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
c0b0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
c0c0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
c0d0: 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
c0e0: 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
c0f0: 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
c100: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
c110: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
c120: 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
c130: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
c140: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
c150: 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
c160: 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
c170: 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
c180: 75 75 6d 28 42 74 72 65 65 20 2a 70 42 74 2c 20  uum(Btree *pBt, 
c190: 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
c1a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
c1b0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
c1c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
c1d0: 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
c1e0: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
c1f0: 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 72  zeFixed ){.    r
c200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
c210: 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 70 42 74  DONLY;.  }.  pBt
c220: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
c230: 61 75 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b  autoVacuum?1:0);
c240: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c250: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  _OK;.#endif.}../
c260: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c270: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
c280: 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
c290: 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
c2a0: 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
c2b0: 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
c2c0: 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
c2d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c2e0: 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
c2f0: 42 74 72 65 65 20 2a 70 42 74 29 7b 0a 23 69 66  Btree *pBt){.#if
c300: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c310: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
c320: 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72  urn 0;.#else.  r
c330: 65 74 75 72 6e 20 70 42 74 2d 3e 61 75 74 6f 56  eturn pBt->autoV
c340: 61 63 75 75 6d 3b 0a 23 65 6e 64 69 66 0a 7d 0a  acuum;.#endif.}.
c350: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65  ../*.** Get a re
c360: 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65  ference to pPage
c370: 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
c380: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69  e file.  This wi
c390: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69  ll.** also acqui
c3a0: 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e  re a readlock on
c3b0: 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   that file..**.*
c3c0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
c3d0: 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
c3e0: 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ss.  If the file
c3f0: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c   is not a.** wel
c400: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
c410: 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c  e file, then SQL
c420: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
c430: 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49  eturned..** SQLI
c440: 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
c450: 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62  ned if the datab
c460: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20  ase is locked.  
c470: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
c480: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77  is returned if w
c490: 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
c4a0: 6f 72 79 2e 20 20 53 51 4c 49 54 45 5f 50 52 4f  ory.  SQLITE_PRO
c4b0: 54 4f 43 4f 4c 20 69 73 20 72 65 74 75 72 6e 65  TOCOL is returne
c4c0: 64 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  d.** if there is
c4d0: 20 61 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f   a locking proto
c4e0: 63 6f 6c 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a  col violation..*
c4f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
c500: 6b 42 74 72 65 65 28 42 74 72 65 65 20 2a 70 42  kBtree(Btree *pB
c510: 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
c520: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
c530: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67  .  if( pBt->pPag
c540: 65 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e1 ) return SQLI
c550: 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 67 65  TE_OK;.  rc = ge
c560: 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
c570: 50 61 67 65 31 29 3b 0a 20 20 69 66 28 20 72 63  Page1);.  if( rc
c580: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
c590: 74 75 72 6e 20 72 63 3b 0a 20 20 0a 0a 20 20 2f  turn rc;.  ..  /
c5a0: 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
c5b0: 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
c5c0: 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
c5d0: 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
c5e0: 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
c5f0: 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
c600: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  .  rc = SQLITE_N
c610: 4f 54 41 44 42 3b 0a 20 20 69 66 28 20 73 71 6c  OTADB;.  if( sql
c620: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
c630: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
c640: 3e 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 61  >0 ){.    u8 *pa
c650: 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
c660: 61 74 61 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ata;.    if( mem
c670: 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
c680: 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
c690: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
c6a0: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
c6b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
c6c0: 61 67 65 31 5b 31 38 5d 3e 31 20 7c 7c 20 70 61  age1[18]>1 || pa
c6d0: 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
c6e0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
c6f0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
c700: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
c710: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  ze = get2byte(&p
c720: 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 70  age1[16]);.    p
c730: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
c740: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
c750: 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
c760: 69 66 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  if( pBt->usableS
c770: 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20  ize<500 ){.     
c780: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
c790: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
c7a0: 20 20 20 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65     pBt->psAligne
c7b0: 64 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  d = FORCE_ALIGNM
c7c0: 45 4e 54 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  ENT(pBt->pageSiz
c7d0: 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78  e);.    pBt->max
c7e0: 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67 65  EmbedFrac = page
c7f0: 31 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d 3e  1[21];.    pBt->
c800: 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 70  minEmbedFrac = p
c810: 61 67 65 31 5b 32 32 5d 3b 0a 20 20 20 20 70 42  age1[22];.    pB
c820: 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d  t->minLeafFrac =
c830: 20 70 61 67 65 31 5b 32 33 5d 3b 0a 23 69 66 6e   page1[23];.#ifn
c840: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c850: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
c860: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
c870: 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
c880: 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
c890: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
c8a0: 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
c8b0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
c8c0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
c8d0: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
c8e0: 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
c8f0: 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
c900: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
c910: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
c920: 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
c930: 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
c940: 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
c950: 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
c960: 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
c970: 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
c980: 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
c990: 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
c9a0: 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
c9b0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
c9c0: 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
c9d0: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
c9e0: 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
c9f0: 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
ca00: 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
ca10: 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
ca20: 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
ca30: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
ca40: 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
ca50: 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
ca60: 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64  e poiner, a head
ca70: 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
ca80: 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
ca90: 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
caa0: 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
cab0: 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
cac0: 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
cad0: 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
cae0: 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
caf0: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70  t->maxLocal = (p
cb00: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
cb10: 32 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64  2)*pBt->maxEmbed
cb20: 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20  Frac/255 - 23;. 
cb30: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
cb40: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
cb50: 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45 6d  e-12)*pBt->minEm
cb60: 62 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33  bedFrac/255 - 23
cb70: 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
cb80: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
cb90: 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e  ze - 35;.  pBt->
cba0: 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e  minLeaf = (pBt->
cbb0: 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70  usableSize-12)*p
cbc0: 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 2f  Bt->minLeafFrac/
cbd0: 32 35 35 20 2d 20 32 33 3b 0a 20 20 69 66 28 20  255 - 23;.  if( 
cbe0: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42  pBt->minLocal>pB
cbf0: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20 70  t->maxLocal || p
cc00: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20 29  Bt->maxLocal<0 )
cc10: 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31  {.    goto page1
cc20: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
cc30: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
cc40: 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
cc50: 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
cc60: 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
cc70: 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
cc80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cc90: 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
cca0: 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
ccb0: 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
ccc0: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
ccd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cce0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
ccf0: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
cd00: 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
cd10: 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
cd20: 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
cd30: 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
cd40: 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
cd50: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
cd60: 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
cd70: 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
cd80: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
cd90: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
cda0: 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
cdb0: 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
cdc0: 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
cdd0: 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
cde0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
cdf0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
ce00: 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  sors, this routi
ce10: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
ce20: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
ce30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
ce40: 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
ce50: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
ce60: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
ce70: 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
ce80: 66 55 6e 75 73 65 64 28 42 74 72 65 65 20 2a 70  fUnused(Btree *p
ce90: 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
cea0: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
ceb0: 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75 72  ONE && pBt->pCur
cec0: 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70  sor==0 && pBt->p
ced0: 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
cee0: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  if( pBt->pPage1-
cef0: 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20  >aData==0 ){.   
cf00: 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
cf10: 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  e = pBt->pPage1;
cf20: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44  .      pPage->aD
cf30: 61 74 61 20 3d 20 26 28 28 63 68 61 72 2a 29 70  ata = &((char*)p
cf40: 50 61 67 65 29 5b 2d 70 42 74 2d 3e 70 73 41 6c  Page)[-pBt->psAl
cf50: 69 67 6e 65 64 5d 3b 0a 20 20 20 20 20 20 70 50  igned];.      pP
cf60: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
cf70: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e        pPage->pgn
cf80: 6f 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  o = 1;.    }.   
cf90: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74   releasePage(pBt
cfa0: 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70  ->pPage1);.    p
cfb0: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
cfc0: 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20      pBt->inStmt 
cfd0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
cfe0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 64  * Create a new d
cff0: 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
d000: 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
d010: 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  t page of the.**
d020: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
d030: 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
d040: 28 42 74 72 65 65 20 2a 70 42 74 29 7b 0a 20 20  (Btree *pBt){.  
d050: 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
d060: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
d070: 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ata;.  int rc;. 
d080: 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65   if( sqlite3page
d090: 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  r_pagecount(pBt-
d0a0: 3e 70 50 61 67 65 72 29 3e 30 20 29 20 72 65 74  >pPager)>0 ) ret
d0b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d0c0: 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
d0d0: 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
d0e0: 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
d0f0: 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
d100: 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
d110: 5f 77 72 69 74 65 28 64 61 74 61 29 3b 0a 20 20  _write(data);.  
d120: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
d130: 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
d140: 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
d150: 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
d160: 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
d170: 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
d180: 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
d190: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31  put2byte(&data[1
d1a0: 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  6], pBt->pageSiz
d1b0: 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  e);.  data[18] =
d1c0: 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
d1d0: 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d   1;.  data[20] =
d1e0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
d1f0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
d200: 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 70  ;.  data[21] = p
d210: 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63  Bt->maxEmbedFrac
d220: 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 70  ;.  data[22] = p
d230: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
d240: 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 70  ;.  data[23] = p
d250: 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 3b  Bt->minLeafFrac;
d260: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
d270: 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
d280: 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
d290: 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
d2a0: 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
d2b0: 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65  A );.  pBt->page
d2c0: 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23  SizeFixed = 1;.#
d2d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d2e0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
d2f0: 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
d300: 75 75 6d 20 29 7b 0a 20 20 20 20 70 75 74 34 62  uum ){.    put4b
d310: 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
d320: 2a 34 5d 2c 20 31 29 3b 0a 20 20 7d 0a 23 65 6e  *4], 1);.  }.#en
d330: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
d340: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d350: 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
d360: 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
d370: 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
d380: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
d390: 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
d3a0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
d3b0: 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
d3c0: 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
d3d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
d3e0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
d3f0: 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
d400: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
d410: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
d420: 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
d430: 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
d440: 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
d450: 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
d460: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
d470: 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
d480: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
d490: 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 20 74   be.** upgrade t
d4a0: 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
d4b0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
d4c0: 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
d4d0: 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
d4e0: 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
d4f0: 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
d500: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
d510: 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
d520: 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
d530: 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
d540: 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
d550: 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
d560: 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
d570: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
d580: 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
d590: 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
d5a0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
d5b0: 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
d5c0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
d5d0: 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
d5e0: 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
d5f0: 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
d600: 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
d610: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
d620: 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
d630: 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
d640: 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
d650: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
d660: 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
d670: 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
d680: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
d690: 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
d6a0: 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 66 6c  ().**.** If wrfl
d6b0: 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
d6c0: 20 6e 4d 61 73 74 65 72 20 73 70 65 63 69 66 69   nMaster specifi
d6d0: 65 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c  es the maximum l
d6e0: 65 6e 67 74 68 20 6f 66 0a 2a 2a 20 61 20 6d 61  ength of.** a ma
d6f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d700: 65 20 6e 61 6d 65 20 73 75 70 70 6c 69 65 64 20  e name supplied 
d710: 6c 61 74 65 72 20 76 69 61 20 73 71 6c 69 74 65  later via sqlite
d720: 33 42 74 72 65 65 53 79 6e 63 28 29 2e 0a 2a 2a  3BtreeSync()..**
d730: 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74   This is so that
d740: 20 61 70 70 72 6f 70 72 69 61 74 65 20 73 70 61   appropriate spa
d750: 63 65 20 63 61 6e 20 62 65 20 61 6c 6c 6f 63 61  ce can be alloca
d760: 74 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ted in the journ
d770: 61 6c 20 66 69 6c 65 0a 2a 2a 20 77 68 65 6e 20  al file.** when 
d780: 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 2e 0a  it is created...
d790: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
d7a0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
d7b0: 72 65 65 20 2a 70 42 74 2c 20 69 6e 74 20 77 72  ree *pBt, int wr
d7c0: 66 6c 61 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  flag){.  int rc 
d7d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
d7e0: 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
d7f0: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
d800: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
d810: 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
d820: 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
d830: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
d840: 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
d850: 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
d860: 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
d870: 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
d880: 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
d890: 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
d8a0: 7c 20 0a 20 20 20 20 20 20 28 70 42 74 2d 3e 69  | .      (pBt->i
d8b0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
d8c0: 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
d8d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d8e0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
d8f0: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
d900: 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
d910: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
d920: 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20  EADONLY;.  }..  
d930: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  if( pBt->pPage1=
d940: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c  =0 ){.    rc = l
d950: 6f 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20  ockBtree(pBt);. 
d960: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
d970: 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
d980: 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  g ){.    rc = sq
d990: 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e  lite3pager_begin
d9a0: 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  (pBt->pPage1->aD
d9b0: 61 74 61 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a  ata, wrflag>1);.
d9c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d9d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
d9e0: 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
d9f0: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
da00: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
da10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 42 74 2d  E_OK ){.    pBt-
da20: 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
da30: 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
da40: 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
da50: 69 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74  if( wrflag ) pBt
da60: 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
da70: 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 6c 6f 63  }else{.    unloc
da80: 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
da90: 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
daa0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
dab0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
dac0: 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
dad0: 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
dae0: 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
daf0: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
db00: 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
db10: 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
db20: 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
db30: 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
db40: 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
db50: 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
db60: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
db70: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
db80: 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
db90: 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
dba0: 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
dbb0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dbe0: 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
dbf0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
dc20: 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
dc30: 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
dc40: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
dc50: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
dc60: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
dc70: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74   */.  Btree *pBt
dc80: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
dc90: 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20   int isInitOrig 
dca0: 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
dcb0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
dcc0: 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 69  Page->pgno;..  i
dcd0: 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
dce0: 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  );.  nCell = pPa
dcf0: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
dd00: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
dd10: 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
dd20: 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
dd30: 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72  Page, i);..    r
dd40: 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
dd50: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
dd60: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
dd70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
dd80: 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c     goto set_chil
dd90: 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
dda0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70     }..    if( !p
ddb0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
ddc0: 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
ddd0: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
dde0: 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ell);.      rc =
ddf0: 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
de00: 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
de10: 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
de20: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
de30: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
de40: 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
de50: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
de60: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
de70: 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
de80: 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
de90: 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
dea0: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
deb0: 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20  set+8]);.    rc 
dec0: 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
ded0: 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
dee0: 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b  AP_BTREE, pgno);
def0: 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f  .  }..set_child_
df00: 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70  ptrmaps_out:.  p
df10: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
df20: 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74  sInitOrig;.  ret
df30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
df40: 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
df50: 61 67 65 2c 20 77 68 69 63 68 20 69 73 20 67 75  age, which is gu
df60: 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61  arenteed to be a
df70: 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74   btree page, not
df80: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
df90: 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  page, is a point
dfa0: 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
dfb0: 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f  . Modify this po
dfc0: 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74  inter so that it
dfd0: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54   points to.** iT
dfe0: 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79  o. Parameter eTy
dff0: 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  pe describes the
e000: 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72   type of pointer
e010: 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c   to be modified,
e020: 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a   as .** follows:
e030: 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54  .**.** PTRMAP_BT
e040: 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69  REE:     pPage i
e050: 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
e060: 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
e070: 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a  ts at a child .*
e080: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
e090: 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67      page of pPag
e0a0: 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
e0b0: 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65  OVERFLOW1: pPage
e0c0: 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
e0d0: 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
e0e0: 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66  ints at an overf
e0f0: 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  low.**          
e100: 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f           page po
e110: 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20  inted to by one 
e120: 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
e130: 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
e140: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70  MAP_OVERFLOW2: p
e150: 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
e160: 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  low-page. The po
e170: 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
e180: 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20  the next.**     
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
e1a0: 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
e1b0: 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
e1c0: 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67  ic int modifyPag
e1d0: 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65  ePointer(MemPage
e1e0: 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46   *pPage, Pgno iF
e1f0: 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75  rom, Pgno iTo, u
e200: 38 20 65 54 79 70 65 29 7b 0a 20 20 69 66 28 20  8 eType){.  if( 
e210: 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
e220: 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
e230: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
e240: 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
e250: 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
e260: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
e270: 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
e280: 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
e290: 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
e2a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
e2b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
e2c0: 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
e2d0: 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
e2e0: 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
e2f0: 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67    int isInitOrig
e300: 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
e310: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
e320: 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20   int nCell;..   
e330: 20 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c   initPage(pPage,
e340: 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d   0);.    nCell =
e350: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
e360: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e370: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
e380: 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
e390: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
e3a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
e3b0: 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
e3c0: 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
e3d0: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
e3e0: 20 20 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50        parseCellP
e3f0: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
e400: 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
e410: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
e420: 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
e430: 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34   if( iFrom==get4
e440: 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
e450: 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a  .iOverflow]) ){.
e460: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
e470: 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
e480: 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
e490: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
e4a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
e4b0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
e4c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e4d0: 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
e4e0: 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
e4f0: 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
e500: 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
e510: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
e520: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e530: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
e540: 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
e550: 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
e560: 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
e570: 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
e580: 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
e590: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
e5a0: 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
e5b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e5c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
e5d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
e5e0: 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
e5f0: 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
e600: 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a  ffset+8], iTo);.
e610: 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
e620: 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
e630: 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74  tOrig;.  }.  ret
e640: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e650: 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
e660: 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
e670: 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20  page pDbPage to 
e680: 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61  location iFreePa
e690: 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ge in the .** da
e6a0: 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50  tabase. The pDbP
e6b0: 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65  age reference re
e6c0: 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a  mains valid..*/.
e6d0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
e6e0: 61 74 65 50 61 67 65 28 0a 20 20 42 74 72 65 65  atePage(.  Btree
e6f0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
e700: 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
e710: 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
e720: 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
e730: 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
e740: 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e760: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
e770: 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
e780: 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
e790: 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
e7a0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
e7b0: 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
e7c0: 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
e7d0: 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
e7e0: 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
e7f0: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
e800: 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
e810: 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
e820: 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
e830: 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
e840: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
e850: 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
e860: 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
e870: 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
e880: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
e890: 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
e8a0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
e8b0: 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
e8c0: 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
e8d0: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
e8e0: 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
e8f0: 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
e900: 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
e910: 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
e920: 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
e930: 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
e940: 27 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  's current locat
e950: 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
e960: 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
e970: 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
e980: 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
e990: 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
e9a0: 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
e9b0: 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
e9c0: 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
e9d0: 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
e9e0: 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
e9f0: 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65  qlite3pager_move
ea00: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
ea10: 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 46 72  Page->aData, iFr
ea20: 65 65 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  eePage);.  if( r
ea30: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ea40: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ea50: 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
ea60: 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
ea70: 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
ea80: 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
ea90: 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
eaa0: 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
eab0: 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
eac0: 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
ead0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
eae0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
eaf0: 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
eb00: 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
eb10: 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
eb20: 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
eb30: 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
eb40: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
eb50: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
eb60: 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
eb70: 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
eb80: 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
eb90: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
eba0: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
ebb0: 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
ebc0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
ebd0: 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
ebe0: 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
ebf0: 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
ec00: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
ec10: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
ec20: 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
ec30: 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
ec40: 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
ec50: 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
ec60: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
ec70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ec80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ec90: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
eca0: 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
ecb0: 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
ecc0: 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
ecd0: 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
ece0: 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
ecf0: 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
ed00: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
ed10: 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29  LOW2, iFreePage)
ed20: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
ed30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ed40: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ed50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ed60: 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
ed70: 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
ed80: 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
ed90: 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
eda0: 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
edb0: 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
edc0: 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
edd0: 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
ede0: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
edf0: 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
ee00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
ee10: 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
ee20: 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67  GE ){.    rc = g
ee30: 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
ee40: 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 29  Page, &pPtrPage)
ee50: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
ee60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ee70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ee80: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
ee90: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
eea0: 74 72 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  trPage->aData);.
eeb0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
eec0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
eed0: 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
eee0: 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
eef0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
ef00: 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
ef10: 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
ef20: 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
ef30: 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
ef40: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
ef50: 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
ef60: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ef70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
ef80: 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
ef90: 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
efa0: 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  trPage);.    }. 
efb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
efc0: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
efd0: 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
efe0: 65 64 20 62 79 20 61 75 74 6f 56 61 63 75 75 6d  ed by autoVacuum
eff0: 43 6f 6d 6d 69 74 28 29 2e 20 2a 2f 0a 73 74 61  Commit(). */.sta
f000: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
f010: 50 61 67 65 28 42 74 72 65 65 20 2a 2c 20 4d 65  Page(Btree *, Me
f020: 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
f030: 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
f040: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f050: 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
f060: 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
f070: 5f 63 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74  _commit when a t
f080: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
f090: 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e   commited for an
f0a0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
f0b0: 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
f0c0: 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
f0d0: 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 42 74  ommit(Btree *pBt
f0e0: 2c 20 50 67 6e 6f 20 2a 6e 54 72 75 6e 63 29 7b  , Pgno *nTrunc){
f0f0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
f100: 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
f110: 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
f120: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
f130: 20 70 61 67 65 73 20 72 65 6d 61 69 6e 69 6e 67   pages remaining
f140: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
f150: 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 74 72  t. */.  int nPtr
f160: 4d 61 70 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  Map;      /* Num
f170: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d  ber of pointer-m
f180: 61 70 20 70 61 67 65 73 20 64 65 61 6c 6c 6f 63  ap pages dealloc
f190: 61 74 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  ated */.  Pgno o
f1a0: 72 69 67 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67  rigSize;  /* Pag
f1b0: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
f1c0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
f1d0: 6f 20 66 69 6e 53 69 7a 65 3b 20 20 20 2f 2a 20  o finSize;   /* 
f1e0: 50 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  Pages in the dat
f1f0: 61 62 61 73 65 20 66 69 6c 65 20 61 66 74 65 72  abase file after
f200: 20 74 72 75 6e 63 61 74 69 6f 6e 20 2a 2f 0a 20   truncation */. 
f210: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
f220: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
f230: 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 3b  e */.  u8 eType;
f240: 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42  .  int pgsz = pB
f250: 74 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 2f 2a  t->pageSize;  /*
f260: 20 50 61 67 65 20 73 69 7a 65 20 66 6f 72 20 74   Page size for t
f270: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
f280: 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 3b 20    Pgno iDbPage; 
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f2a0: 54 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  The database pag
f2b0: 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 4d  e to move */.  M
f2c0: 65 6d 50 61 67 65 20 2a 70 44 62 4d 65 6d 50 61  emPage *pDbMemPa
f2d0: 67 65 20 3d 20 30 3b 20 20 20 2f 2a 20 22 22 20  ge = 0;   /* "" 
f2e0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
f2f0: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
f300: 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
f310: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
f320: 74 65 72 20 74 6f 20 69 44 62 50 61 67 65 20 2a  ter to iDbPage *
f330: 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
f340: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge;            /
f350: 2a 20 54 68 65 20 66 72 65 65 2d 6c 69 73 74 20  * The free-list 
f360: 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 69 44 62  page to move iDb
f370: 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 4d 65 6d  Page to */.  Mem
f380: 50 61 67 65 20 2a 70 46 72 65 65 4d 65 6d 50 61  Page *pFreeMemPa
f390: 67 65 20 3d 20 30 3b 20 2f 2a 20 22 22 20 2a 2f  ge = 0; /* "" */
f3a0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
f3b0: 0a 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 2a 73  .  int nRef = *s
f3c0: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74  qlite3pager_stat
f3d0: 73 28 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69  s(pPager);.#endi
f3e0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  f..  assert( pBt
f3f0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
f400: 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
f410: 41 47 45 28 70 67 73 7a 2c 20 73 71 6c 69 74 65  AGE(pgsz, sqlite
f420: 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
f430: 28 70 50 61 67 65 72 29 29 20 29 7b 0a 20 20 20  (pPager)) ){.   
f440: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
f450: 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  ORRUPT;.  }..  /
f460: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
f470: 20 6d 61 6e 79 20 66 72 65 65 2d 70 61 67 65 73   many free-pages
f480: 20 61 72 65 20 69 6e 20 74 68 65 20 64 61 74 61   are in the data
f490: 62 61 73 65 2e 20 49 66 20 74 68 65 72 65 20 61  base. If there a
f4a0: 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 20  re no.  ** free 
f4b0: 70 61 67 65 73 2c 20 74 68 65 6e 20 61 75 74 6f  pages, then auto
f4c0: 2d 76 61 63 75 75 6d 20 69 73 20 61 20 6e 6f 2d  -vacuum is a no-
f4d0: 6f 70 2e 0a 20 20 2a 2f 0a 20 20 6e 46 72 65 65  op..  */.  nFree
f4e0: 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
f4f0: 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
f500: 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20  ata[36]);.  if( 
f510: 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a  nFreeList==0 ){.
f520: 20 20 20 20 2a 6e 54 72 75 6e 63 20 3d 20 30 3b      *nTrunc = 0;
f530: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f540: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 6f 72  TE_OK;.  }..  or
f550: 69 67 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  igSize = sqlite3
f560: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
f570: 70 50 61 67 65 72 29 3b 0a 20 20 6e 50 74 72 4d  pPager);.  nPtrM
f580: 61 70 20 3d 20 28 6e 46 72 65 65 4c 69 73 74 2d  ap = (nFreeList-
f590: 6f 72 69 67 53 69 7a 65 2b 50 54 52 4d 41 50 5f  origSize+PTRMAP_
f5a0: 50 41 47 45 4e 4f 28 70 67 73 7a 2c 20 6f 72 69  PAGENO(pgsz, ori
f5b0: 67 53 69 7a 65 29 2b 70 67 73 7a 2f 35 29 2f 28  gSize)+pgsz/5)/(
f5c0: 70 67 73 7a 2f 35 29 3b 0a 20 20 66 69 6e 53 69  pgsz/5);.  finSi
f5d0: 7a 65 20 3d 20 6f 72 69 67 53 69 7a 65 20 2d 20  ze = origSize - 
f5e0: 6e 46 72 65 65 4c 69 73 74 20 2d 20 6e 50 74 72  nFreeList - nPtr
f5f0: 4d 61 70 3b 0a 20 20 69 66 28 20 6f 72 69 67 53  Map;.  if( origS
f600: 69 7a 65 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  ize>PENDING_BYTE
f610: 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 66 69  _PAGE(pBt) && fi
f620: 6e 53 69 7a 65 3c 3d 50 45 4e 44 49 4e 47 5f 42  nSize<=PENDING_B
f630: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
f640: 0a 20 20 20 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a  .    finSize--;.
f650: 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
f660: 53 50 41 47 45 28 70 42 74 2d 3e 75 73 61 62 6c  SPAGE(pBt->usabl
f670: 65 53 69 7a 65 2c 20 66 69 6e 53 69 7a 65 29 20  eSize, finSize) 
f680: 29 7b 0a 20 20 20 20 20 20 66 69 6e 53 69 7a 65  ){.      finSize
f690: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
f6a0: 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
f6b0: 55 4d 3a 20 42 65 67 69 6e 20 28 64 62 20 73 69  UM: Begin (db si
f6c0: 7a 65 20 25 64 2d 3e 25 64 29 5c 6e 22 2c 20 6f  ze %d->%d)\n", o
f6d0: 72 69 67 53 69 7a 65 2c 20 66 69 6e 53 69 7a 65  rigSize, finSize
f6e0: 29 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62  ));..  /* Variab
f6f0: 6c 65 20 27 66 69 6e 53 69 7a 65 27 20 77 69 6c  le 'finSize' wil
f700: 6c 20 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66  l be the size of
f710: 20 74 68 65 20 66 69 6c 65 20 69 6e 20 70 61 67   the file in pag
f720: 65 73 20 61 66 74 65 72 0a 20 20 2a 2a 20 74 68  es after.  ** th
f730: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 68 61  e auto-vacuum ha
f740: 73 20 63 6f 6d 70 6c 65 74 65 64 20 28 74 68 65  s completed (the
f750: 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 73 69   current file si
f760: 7a 65 20 6d 69 6e 75 73 20 74 68 65 20 6e 75 6d  ze minus the num
f770: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65  ber.  ** of page
f780: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  s on the free li
f790: 73 74 29 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67  st). Loop throug
f7a0: 68 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  h the pages that
f7b0: 20 6c 69 65 20 62 65 79 6f 6e 64 0a 20 20 2a 2a   lie beyond.  **
f7c0: 20 74 68 69 73 20 6d 61 72 6b 2c 20 61 6e 64 20   this mark, and 
f7d0: 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  if they are not 
f7e0: 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20 66  already on the f
f7f0: 72 65 65 20 6c 69 73 74 2c 20 6d 6f 76 65 20 74  ree list, move t
f800: 68 65 6d 0a 20 20 2a 2a 20 74 6f 20 61 20 66 72  hem.  ** to a fr
f810: 65 65 20 70 61 67 65 20 65 61 72 6c 69 65 72 20  ee page earlier 
f820: 69 6e 20 74 68 65 20 66 69 6c 65 20 28 73 6f 6d  in the file (som
f830: 65 77 68 65 72 65 20 62 65 66 6f 72 65 20 66 69  ewhere before fi
f840: 6e 53 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 66  nSize)..  */.  f
f850: 6f 72 28 20 69 44 62 50 61 67 65 3d 66 69 6e 53  or( iDbPage=finS
f860: 69 7a 65 2b 31 3b 20 69 44 62 50 61 67 65 3c 3d  ize+1; iDbPage<=
f870: 6f 72 69 67 53 69 7a 65 3b 20 69 44 62 50 61 67  origSize; iDbPag
f880: 65 2b 2b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  e++ ){.    /* If
f890: 20 69 44 62 50 61 67 65 20 69 73 20 61 20 70 6f   iDbPage is a po
f8a0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 2c 20  inter map page, 
f8b0: 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
f8c0: 79 74 65 20 70 61 67 65 2c 20 73 6b 69 70 20 69  yte page, skip i
f8d0: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 50 54  t. */.    if( PT
f8e0: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 67 73 7a  RMAP_ISPAGE(pgsz
f8f0: 2c 20 69 44 62 50 61 67 65 29 20 7c 7c 20 69 44  , iDbPage) || iD
f900: 62 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  bPage==PENDING_B
f910: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
f920: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
f930: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
f940: 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
f950: 69 44 62 50 61 67 65 2c 20 26 65 54 79 70 65 2c  iDbPage, &eType,
f960: 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
f970: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f980: 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76 61  OK ) goto autova
f990: 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 61 73  cuum_out;.    as
f9a0: 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
f9b0: 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
f9c0: 0a 20 20 20 20 2f 2a 20 49 66 20 69 44 62 50 61  .    /* If iDbPa
f9d0: 67 65 20 69 73 20 66 72 65 65 2c 20 64 6f 20 6e  ge is free, do n
f9e0: 6f 74 20 73 77 61 70 20 69 74 2e 20 20 2a 2f 0a  ot swap it.  */.
f9f0: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
fa00: 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
fa10: 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
fa20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
fa30: 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 69 44   getPage(pBt, iD
fa40: 62 50 61 67 65 2c 20 26 70 44 62 4d 65 6d 50 61  bPage, &pDbMemPa
fa50: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
fa60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
fa70: 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74  o autovacuum_out
fa80: 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74  ;..    /* Find t
fa90: 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
faa0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 74 68  the free-list th
fab0: 61 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  at is not alread
fac0: 79 20 61 74 20 74 68 65 20 65 6e 64 20 0a 20 20  y at the end .  
fad0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
fae0: 2e 20 41 20 70 61 67 65 20 63 61 6e 20 62 65 20  . A page can be 
faf0: 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
fb00: 72 65 65 20 6c 69 73 74 20 75 73 69 6e 67 20 74  ree list using t
fb10: 68 65 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63  he .    ** alloc
fb20: 61 74 65 50 61 67 65 28 29 20 72 6f 75 74 69 6e  atePage() routin
fb30: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  e..    */.    do
fb40: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 65  {.      if( pFre
fb50: 65 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  eMemPage ){.    
fb60: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
fb70: 70 46 72 65 65 4d 65 6d 50 61 67 65 29 3b 0a 20  pFreeMemPage);. 
fb80: 20 20 20 20 20 20 20 70 46 72 65 65 4d 65 6d 50         pFreeMemP
fb90: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  age = 0;.      }
fba0: 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
fbb0: 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 26 70  catePage(pBt, &p
fbc0: 46 72 65 65 4d 65 6d 50 61 67 65 2c 20 26 69 46  FreeMemPage, &iF
fbd0: 72 65 65 50 61 67 65 2c 20 30 2c 20 30 29 3b 0a  reePage, 0, 0);.
fbe0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
fbf0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fc00: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
fc10: 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20 20 20 20  DbMemPage);.    
fc20: 20 20 20 20 67 6f 74 6f 20 61 75 74 6f 76 61 63      goto autovac
fc30: 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  uum_out;.      }
fc40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
fc50: 46 72 65 65 50 61 67 65 3c 3d 6f 72 69 67 53 69  FreePage<=origSi
fc60: 7a 65 20 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ze );.    }while
fc70: 28 20 69 46 72 65 65 50 61 67 65 3e 66 69 6e 53  ( iFreePage>finS
fc80: 69 7a 65 20 29 3b 0a 20 20 20 20 72 65 6c 65 61  ize );.    relea
fc90: 73 65 50 61 67 65 28 70 46 72 65 65 4d 65 6d 50  sePage(pFreeMemP
fca0: 61 67 65 29 3b 0a 20 20 20 20 70 46 72 65 65 4d  age);.    pFreeM
fcb0: 65 6d 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20  emPage = 0;..   
fcc0: 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
fcd0: 67 65 28 70 42 74 2c 20 70 44 62 4d 65 6d 50 61  ge(pBt, pDbMemPa
fce0: 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
fcf0: 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 29 3b  age, iFreePage);
fd00: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
fd10: 28 70 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20 20  (pDbMemPage);.  
fd20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
fd30: 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76  _OK ) goto autov
fd40: 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  acuum_out;.  }..
fd50: 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
fd60: 66 72 65 65 2d 6c 69 73 74 20 68 61 73 20 62 65  free-list has be
fd70: 65 6e 20 73 77 61 70 70 65 64 20 74 6f 20 74 68  en swapped to th
fd80: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
fd90: 65 2e 20 53 6f 0a 20 20 2a 2a 20 74 72 75 6e 63  e. So.  ** trunc
fda0: 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
fdb0: 20 66 69 6c 65 20 74 6f 20 66 69 6e 53 69 7a 65   file to finSize
fdc0: 20 70 61 67 65 73 20 61 6e 64 20 63 6f 6e 73 69   pages and consi
fdd0: 64 65 72 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  der the.  ** fre
fde0: 65 2d 6c 69 73 74 20 65 6d 70 74 79 2e 0a 20 20  e-list empty..  
fdf0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
fe00: 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 42 74  3pager_write(pBt
fe10: 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
fe20: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
fe30: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74  TE_OK ) goto aut
fe40: 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 70  ovacuum_out;.  p
fe50: 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
fe60: 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
fe70: 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
fe80: 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
fe90: 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 69  ata[36], 0);.  i
fea0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
feb0: 20 29 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75   ) goto autovacu
fec0: 75 6d 5f 6f 75 74 3b 0a 20 20 2a 6e 54 72 75 6e  um_out;.  *nTrun
fed0: 63 20 3d 20 66 69 6e 53 69 7a 65 3b 0a 0a 61 75  c = finSize;..au
fee0: 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3a 0a 20 20  tovacuum_out:.  
fef0: 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 2a 73  assert( nRef==*s
ff00: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74  qlite3pager_stat
ff10: 73 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69  s(pPager) );.  i
ff20: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ff30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70   ){.    sqlite3p
ff40: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
ff50: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
ff60: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
ff70: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
ff80: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
ff90: 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
ffa0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
ffb0: 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
ffc0: 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
ffd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ffe0: 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
fff0: 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
10000 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
10010 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
10020 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
10030 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
10040 28 42 74 72 65 65 20 2a 70 42 74 29 7b 0a 20 20  (Btree *pBt){.  
10050 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10060 4f 4b 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  OK;.  if( pBt->i
10070 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
10080 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ITE ){.    rc = 
10090 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
100a0 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  mit(pBt->pPager)
100b0 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 54  ;.  }.  pBt->inT
100c0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
100d0 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  E;.  pBt->inStmt
100e0 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74   = 0;.  unlockBt
100f0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
10100 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10110 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
10120 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
10130 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74  e number of writ
10140 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  e-cursors open o
10150 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54  n this handle. T
10160 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
10170 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
10180 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
10190 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
101a0 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
101b0 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
101c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
101d0 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
101e0 74 72 65 65 20 2a 70 42 74 29 7b 0a 20 20 42 74  tree *pBt){.  Bt
101f0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
10200 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
10210 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
10220 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
10230 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
10240 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61   if( pCur->wrFla
10250 67 20 29 20 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72  g ) r++;.  }.  r
10260 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
10270 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
10280 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  _TEST./*.** Prin
10290 74 20 64 65 62 75 67 67 69 6e 67 20 69 6e 66 6f  t debugging info
102a0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c  rmation about al
102b0 6c 20 63 75 72 73 6f 72 73 20 74 6f 20 73 74 61  l cursors to sta
102c0 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 0a 2a 2f  ndard output..*/
102d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
102e0 65 65 43 75 72 73 6f 72 4c 69 73 74 28 42 74 72  eeCursorList(Btr
102f0 65 65 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ee *pBt){.  BtCu
10300 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 66 6f  rsor *pCur;.  fo
10310 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
10320 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
10330 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
10340 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
10350 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
10360 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20      char *zMode 
10370 3d 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3f  = pCur->wrFlag ?
10380 20 22 72 77 22 20 3a 20 22 72 6f 22 3b 0a 20 20   "rw" : "ro";.  
10390 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
103a0 69 6e 74 66 28 22 43 55 52 53 4f 52 20 25 70 20  intf("CURSOR %p 
103b0 72 6f 6f 74 65 64 20 61 74 20 25 34 64 28 25 73  rooted at %4d(%s
103c0 29 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20 25  ) currently at %
103d0 64 2e 25 64 25 73 5c 6e 22 2c 0a 20 20 20 20 20  d.%d%s\n",.     
103e0 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 67    pCur, pCur->pg
103f0 6e 6f 52 6f 6f 74 2c 20 7a 4d 6f 64 65 2c 0a 20  noRoot, zMode,. 
10400 20 20 20 20 20 20 70 50 61 67 65 20 3f 20 70 50        pPage ? pP
10410 61 67 65 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 70  age->pgno : 0, p
10420 43 75 72 2d 3e 69 64 78 2c 0a 20 20 20 20 20 20  Cur->idx,.      
10430 20 70 43 75 72 2d 3e 69 73 56 61 6c 69 64 20 3f   pCur->isValid ?
10440 20 22 22 20 3a 20 22 20 65 6f 66 22 0a 20 20 20   "" : " eof".   
10450 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   );.  }.}.#endif
10460 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
10470 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
10480 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41   in progress.  A
10490 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  ll cursors will 
104a0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20  be.** invalided 
104b0 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
104c0 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  n.  Any attempt 
104d0 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a  to use a cursor.
104e0 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  ** that was open
104f0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
10500 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74  g of this operat
10510 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a  ion will result.
10520 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  ** in an error..
10530 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
10540 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
10550 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
10560 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
10570 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
10580 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
10590 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
105a0 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
105b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
105c0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
105d0 65 65 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ee *pBt){.  int 
105e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
105f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
10600 31 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  1;.  if( pBt->in
10610 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
10620 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  TE ){.    rc = s
10630 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
10640 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
10650 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  );.    /* The ro
10660 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
10670 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
10680 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
10690 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
106a0 6c 6c 20 67 65 74 50 61 67 65 28 29 20 6f 6e 20  ll getPage() on 
106b0 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
106c0 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 31  make sure pPage1
106d0 2d 3e 61 44 61 74 61 20 69 73 0a 20 20 20 20 2a  ->aData is.    *
106e0 2a 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  * set correctly.
106f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 50   */.    if( getP
10700 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
10710 67 65 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ge1)==SQLITE_OK 
10720 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
10730 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
10740 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
10750 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
10760 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 7d  s(pBt)==0 );.  }
10770 0a 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 20  .  pBt->inTrans 
10780 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
10790 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
107a0 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
107b0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72  Unused(pBt);.  r
107c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
107d0 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
107e0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
107f0 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61  ion.  The subtra
10800 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20  nsaction can.** 
10810 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
10820 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
10830 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
10840 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75  nsaction..** You
10850 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
10860 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
10870 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
10880 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
10890 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
108a0 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
108b0 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20  atically if the 
108c0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
108d0 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  .** commits or r
108e0 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
108f0 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61   Only one subtra
10900 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  nsaction may be 
10910 61 63 74 69 76 65 20 61 74 20 61 20 74 69 6d 65  active at a time
10920 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  .  It is an erro
10930 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73  r to try.** to s
10940 74 61 72 74 20 61 20 6e 65 77 20 73 75 62 74 72  tart a new subtr
10950 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f  ansaction if ano
10960 74 68 65 72 20 73 75 62 74 72 61 6e 73 61 63 74  ther subtransact
10970 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
10980 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61  ctive..**.** Sta
10990 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
109a0 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
109b0 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
109c0 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
109d0 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
109e0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
109f0 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
10a00 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
10a10 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
10a20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
10a30 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
10a40 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
10a50 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
10a60 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
10a70 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
10a80 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
10a90 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
10aa0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
10ab0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
10ac0 74 6d 74 28 42 74 72 65 65 20 2a 70 42 74 29 7b  tmt(Btree *pBt){
10ad0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
10ae0 20 28 70 42 74 2d 3e 69 6e 54 72 61 6e 73 21 3d   (pBt->inTrans!=
10af0 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20  TRANS_WRITE) || 
10b00 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20  pBt->inStmt ){. 
10b10 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
10b20 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
10b30 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
10b40 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
10b50 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
10b60 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ly ? SQLITE_OK :
10b70 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
10b80 6d 74 5f 62 65 67 69 6e 28 70 42 74 2d 3e 70 50  mt_begin(pBt->pP
10b90 61 67 65 72 29 3b 0a 20 20 70 42 74 2d 3e 69 6e  ager);.  pBt->in
10ba0 53 74 6d 74 20 3d 20 31 3b 0a 20 20 72 65 74 75  Stmt = 1;.  retu
10bb0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
10bc0 20 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74   Commit the stat
10bd0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
10be0 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
10bf0 20 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e   progress.  If n
10c00 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74  o.** subtransact
10c10 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74  ion is active, t
10c20 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
10c30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10c40 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74  reeCommitStmt(Bt
10c50 72 65 65 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  ree *pBt){.  int
10c60 20 72 63 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e   rc;.  if( pBt->
10c70 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e  inStmt && !pBt->
10c80 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
10c90 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
10ca0 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 42  r_stmt_commit(pB
10cb0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  t->pPager);.  }e
10cc0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
10cd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
10ce0 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
10cf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10d00 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
10d10 68 65 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  he active statem
10d20 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
10d30 6f 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62 74 72  on.  If no subtr
10d40 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
10d50 61 63 74 69 76 65 20 74 68 69 73 20 72 6f 75 74  active this rout
10d60 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
10d70 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72  **.** All cursor
10d80 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69  s will be invali
10d90 64 61 74 65 64 20 62 79 20 74 68 69 73 20 6f 70  dated by this op
10da0 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
10db0 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20  tempt.** to use 
10dc0 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 77 61  a cursor that wa
10dd0 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
10de0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
10df0 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c  operation.** wil
10e00 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65  l result in an e
10e10 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rror..*/.int sql
10e20 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
10e30 6b 53 74 6d 74 28 42 74 72 65 65 20 2a 70 42 74  kStmt(Btree *pBt
10e40 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
10e50 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 3d 3d  f( pBt->inStmt==
10e60 30 20 7c 7c 20 70 42 74 2d 3e 72 65 61 64 4f 6e  0 || pBt->readOn
10e70 6c 79 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ly ) return SQLI
10e80 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71  TE_OK;.  rc = sq
10e90 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
10ea0 72 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  rollback(pBt->pP
10eb0 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
10ec0 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
10ed0 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20  rs(pBt)==0 );.  
10ee0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
10ef0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10f00 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 6b  ./*.** Default k
10f10 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ey comparison fu
10f20 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 75 73 65  nction to be use
10f30 64 20 69 66 20 6e 6f 20 63 6f 6d 70 61 72 69 73  d if no comparis
10f40 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  on function.** i
10f50 73 20 73 70 65 63 69 66 69 65 64 20 6f 6e 20 74  s specified on t
10f60 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
10f70 75 72 73 6f 72 28 29 20 63 61 6c 6c 2e 0a 2a 2f  ursor() call..*/
10f80 0a 73 74 61 74 69 63 20 69 6e 74 20 64 66 6c 74  .static int dflt
10f90 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20  Compare(.  void 
10fa0 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20  *NotUsed,       
10fb0 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20 64 61        /* User da
10fc0 74 61 20 69 73 20 6e 6f 74 20 75 73 65 64 20 2a  ta is not used *
10fd0 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 63 6f 6e 73  /.  int n1, cons
10fe0 74 20 76 6f 69 64 20 2a 70 31 2c 20 20 20 20 2f  t void *p1,    /
10ff0 2a 20 46 69 72 73 74 20 6b 65 79 20 74 6f 20 63  * First key to c
11000 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ompare */.  int 
11010 6e 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  n2, const void *
11020 70 32 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  p2     /* Second
11030 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
11040 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20  */.){.  int c;. 
11050 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2c 20   c = memcmp(p1, 
11060 70 32 2c 20 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a  p2, n1<n2 ? n1 :
11070 20 6e 32 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30   n2);.  if( c==0
11080 20 29 7b 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d   ){.    c = n1 -
11090 20 6e 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   n2;.  }.  retur
110a0 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n c;.}../*.** Cr
110b0 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
110c0 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
110d0 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
110e0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
110f0 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66  ble.  The act of
11100 20 61 63 71 75 69 72 69 6e 67 20 61 20 63 75 72   acquiring a cur
11110 73 6f 72 20 67 65 74 73 20 61 20 72 65 61 64 20  sor gets a read 
11120 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  lock on .** the 
11130 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
11140 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
11150 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
11160 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
11170 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
11180 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
11190 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
111a0 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
111b0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
111c0 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
111d0 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
111e0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
111f0 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
11200 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
11210 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
11220 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
11230 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
11240 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
11250 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
11260 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
11270 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
11280 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
11290 3a 20 20 4e 6f 20 6f 74 68 65 72 20 63 75 72 73  :  No other curs
112a0 6f 72 73 20 6d 61 79 20 62 65 20 6f 70 65 6e 20  ors may be open 
112b0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
112c0 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
112d0 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
112e0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
112f0 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
11300 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
11310 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
11320 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
11330 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
11340 0a 2a 2a 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e  .**.** Condition
11350 20 32 20 77 61 72 72 61 6e 74 73 20 66 75 72 74   2 warrants furt
11360 68 65 72 20 64 69 73 63 75 73 73 69 6f 6e 2e 20  her discussion. 
11370 20 49 66 20 61 6e 79 20 63 75 72 73 6f 72 20 69   If any cursor i
11380 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 61  s opened.** on a
11390 20 74 61 62 6c 65 20 77 69 74 68 20 77 72 46 6c   table with wrFl
113a0 61 67 3d 3d 30 2c 20 74 68 61 74 20 70 72 65 76  ag==0, that prev
113b0 65 6e 74 73 20 61 6c 6c 20 6f 74 68 65 72 20 63  ents all other c
113c0 75 72 73 6f 72 73 20 66 72 6f 6d 0a 2a 2a 20 77  ursors from.** w
113d0 72 69 74 69 6e 67 20 74 6f 20 74 68 61 74 20 74  riting to that t
113e0 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61  able.  This is a
113f0 20 6b 69 6e 64 20 6f 66 20 22 72 65 61 64 2d 6c   kind of "read-l
11400 6f 63 6b 22 2e 20 20 57 68 65 6e 20 61 20 63 75  ock".  When a cu
11410 72 73 6f 72 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  rsor.** is opene
11420 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  d with wrFlag==0
11430 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
11440 64 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  d that the table
11450 20 77 69 6c 6c 20 6e 6f 74 0a 2a 2a 20 63 68 61   will not.** cha
11460 6e 67 65 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  nge as long as t
11470 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
11480 6e 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  n.  This allows 
11490 74 68 65 20 63 75 72 73 6f 72 20 74 6f 0a 2a 2a  the cursor to.**
114a0 20 64 6f 20 61 20 73 65 71 75 65 6e 74 69 61 6c   do a sequential
114b0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 74 61 62   scan of the tab
114c0 6c 65 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  le without havin
114d0 67 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  g to worry about
114e0 0a 2a 2a 20 65 6e 74 72 69 65 73 20 62 65 69 6e  .** entries bein
114f0 67 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65  g inserted or de
11500 6c 65 74 65 64 20 64 75 72 69 6e 67 20 74 68 65  leted during the
11510 20 73 63 61 6e 2e 20 20 43 75 72 73 6f 72 73 20   scan.  Cursors 
11520 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 6f 70 65  should.** be ope
11530 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
11540 3d 30 20 6f 6e 6c 79 20 69 66 20 74 68 69 73 20  =0 only if this 
11550 72 65 61 64 2d 6c 6f 63 6b 20 70 72 6f 70 65 72  read-lock proper
11560 74 79 20 69 73 20 6e 65 65 64 65 64 2e 0a 2a 2a  ty is needed..**
11570 20 54 68 61 74 20 69 73 20 74 6f 20 73 61 79 2c   That is to say,
11580 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 20   cursors should 
11590 62 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  be opened with w
115a0 72 46 6c 61 67 3d 3d 30 20 6f 6e 6c 79 20 69 66  rFlag==0 only if
115b0 20 74 68 65 79 0a 2a 2a 20 69 6e 74 65 6e 64 20   they.** intend 
115c0 74 6f 20 75 73 65 20 74 68 65 20 73 71 6c 69 74  to use the sqlit
115d0 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 73 79  e3BtreeNext() sy
115e0 73 74 65 6d 20 63 61 6c 6c 2e 20 20 41 6c 6c 20  stem call.  All 
115f0 6f 74 68 65 72 20 63 75 72 73 6f 72 73 0a 2a 2a  other cursors.**
11600 20 73 68 6f 75 6c 64 20 62 65 20 6f 70 65 6e 65   should be opene
11610 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
11620 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 6e 65   even if they ne
11630 76 65 72 20 72 65 61 6c 6c 79 20 69 6e 74 65 6e  ver really inten
11640 64 0a 2a 2a 20 74 6f 20 77 72 69 74 65 2e 0a 2a  d.** to write..*
11650 2a 20 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  * .** No checkin
11660 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
11670 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
11680 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
11690 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
116a0 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
116b0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
116c0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
116d0 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
116e0 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
116f0 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ly..**.** The co
11700 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
11710 6e 20 6d 75 73 74 20 62 65 20 6c 6f 67 69 63 61  n must be logica
11720 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 6f 72  lly the same for
11730 20 65 76 65 72 79 20 63 75 72 73 6f 72 0a 2a 2a   every cursor.**
11740 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
11750 20 74 61 62 6c 65 2e 20 20 43 68 61 6e 67 69 6e   table.  Changin
11760 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  g the comparison
11770 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
11780 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 69 6e 63 6f  esult.** in inco
11790 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 73  rrect operations
117a0 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72  .  If the compar
117b0 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  ison function is
117c0 20 4e 55 4c 4c 2c 20 61 0a 2a 2a 20 64 65 66 61   NULL, a.** defa
117d0 75 6c 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  ult comparison f
117e0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 2e  unction is used.
117f0 20 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e    The comparison
11800 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
11810 61 6c 77 61 79 73 20 69 67 6e 6f 72 65 64 20 66  always ignored f
11820 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
11830 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11840 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
11850 74 72 65 65 20 2a 70 42 74 2c 20 20 20 20 20 20  tree *pBt,      
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11880 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
11890 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
118c0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
118d0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
118e0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11900 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
11910 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
11920 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43  ly */.  int (*xC
11930 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  mp)(void*,int,co
11940 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
11950 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4b  nst void*), /* K
11960 65 79 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ey Comparison fu
11970 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  nc */.  void *pA
11980 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
119b0 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
119c0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 2a 70  /.  BtCursor **p
119d0 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
11a00 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
11a10 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
11a20 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2a 70  sor *pCur;..  *p
11a30 70 43 75 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  pCur = 0;.  if( 
11a40 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66  wrFlag ){.    if
11a50 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
11a60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11a70 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
11a80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
11a90 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 42  heckReadLocks(pB
11aa0 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b  t, iTable, 0) ){
11ab0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
11ac0 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
11ad0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74   }.  }.  if( pBt
11ae0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20  ->pPage1==0 ){. 
11af0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65     rc = lockBtre
11b00 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  e(pBt);.    if( 
11b10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11b20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
11b30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
11b40 75 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ur = sqliteMallo
11b50 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 43  cRaw( sizeof(*pC
11b60 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
11b70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  r==0 ){.    rc =
11b80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11b90 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63     goto create_c
11ba0 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b  ursor_exception;
11bb0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e  .  }.  pCur->pgn
11bc0 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
11bd0 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62  able;.  if( iTab
11be0 6c 65 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33  le==1 && sqlite3
11bf0 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
11c00 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20  pBt->pPager)==0 
11c10 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11c20 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 70 43  TE_EMPTY;.    pC
11c30 75 72 2d 3e 70 50 61 67 65 20 3d 20 30 3b 0a 20  ur->pPage = 0;. 
11c40 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63     goto create_c
11c50 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b  ursor_exception;
11c60 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 50 61  .  }.  pCur->pPa
11c70 67 65 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20  ge = 0;  /* For 
11c80 65 78 69 74 2d 68 61 6e 64 6c 65 72 2c 20 69 6e  exit-handler, in
11c90 20 63 61 73 65 20 67 65 74 41 6e 64 49 6e 69 74   case getAndInit
11ca0 50 61 67 65 28 29 20 66 61 69 6c 73 2e 20 2a 2f  Page() fails. */
11cb0 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
11cc0 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72  itPage(pBt, pCur
11cd0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
11ce0 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  r->pPage, 0);.  
11cf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11d00 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72  K ){.    goto cr
11d10 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
11d20 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43 75  ption;.  }.  pCu
11d30 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43  r->xCompare = xC
11d40 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74  mp ? xCmp : dflt
11d50 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d  Compare;.  pCur-
11d60 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  >pArg = pArg;.  
11d70 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
11d80 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
11d90 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72  = wrFlag;.  pCur
11da0 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 6d 65 6d  ->idx = 0;.  mem
11db0 73 65 74 28 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  set(&pCur->info,
11dc0 20 30 2c 20 73 69 7a 65 6f 66 28 70 43 75 72 2d   0, sizeof(pCur-
11dd0 3e 69 6e 66 6f 29 29 3b 0a 20 20 70 43 75 72 2d  >info));.  pCur-
11de0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
11df0 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
11e00 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
11e10 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
11e20 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
11e30 20 70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30   pCur->pPrev = 0
11e40 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  ;.  pBt->pCursor
11e50 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
11e60 3e 69 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  >isValid = 0;.  
11e70 2a 70 70 43 75 72 20 3d 20 70 43 75 72 3b 0a 20  *ppCur = pCur;. 
11e80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11e90 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73 6f  K;..create_curso
11ea0 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 69  r_exception:.  i
11eb0 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 72  f( pCur ){.    r
11ec0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
11ed0 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c  >pPage);.    sql
11ee0 69 74 65 46 72 65 65 28 70 43 75 72 29 3b 0a 20  iteFree(pCur);. 
11ef0 20 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65   }.  unlockBtree
11f00 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
11f10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
11f20 69 66 20 30 20 20 2f 2a 20 4e 6f 74 20 55 73 65  if 0  /* Not Use
11f30 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  d */./*.** Chang
11f40 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
11f50 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
11f60 6e 63 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  nction used by a
11f70 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64   cursor..*/.void
11f80 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
11f90 43 6f 6d 70 61 72 65 28 0a 20 20 42 74 43 75 72  Compare(.  BtCur
11fa0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f  sor *pCur,     /
11fb0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
11fc0 77 68 6f 73 65 20 63 6f 6d 70 61 72 69 73 6f 6e  whose comparison
11fd0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 68 61   function is cha
11fe0 6e 67 65 64 20 2a 2f 0a 20 20 69 6e 74 28 2a 78  nged */.  int(*x
11ff0 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  Cmp)(void*,int,c
12000 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
12010 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20  onst void*), /* 
12020 4e 65 77 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  New comparison f
12030 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  unc */.  void *p
12040 41 72 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Arg          /* 
12050 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
12060 6f 20 78 43 6d 70 28 29 20 2a 2f 0a 29 7b 0a 20  o xCmp() */.){. 
12070 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20   pCur->xCompare 
12080 3d 20 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20  = xCmp ? xCmp : 
12090 64 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70  dfltCompare;.  p
120a0 43 75 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67  Cur->pArg = pArg
120b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
120c0 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
120d0 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
120e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
120f0 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
12100 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
12110 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
12120 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
12130 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
12140 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
12150 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
12160 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
12170 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
12180 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50   ){.    pCur->pP
12190 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
121a0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  r->pNext;.  }els
121b0 65 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72  e{.    pBt->pCur
121c0 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
121d0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  t;.  }.  if( pCu
121e0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
121f0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
12200 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
12210 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
12220 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
12230 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
12240 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
12250 73 71 6c 69 74 65 46 72 65 65 28 70 43 75 72 29  sqliteFree(pCur)
12260 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12270 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
12280 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ake a temporary 
12290 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e  cursor by fillin
122a0 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20  g in the fields 
122b0 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20  of pTempCur..** 
122c0 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75  The temporary cu
122d0 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74  rsor is not on t
122e0 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66  he cursor list f
122f0 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f  or the Btree..*/
12300 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74  .static void get
12310 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
12320 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72  sor *pCur, BtCur
12330 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a  sor *pTempCur){.
12340 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75    memcpy(pTempCu
12350 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28  r, pCur, sizeof(
12360 2a 70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70  *pCur));.  pTemp
12370 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Cur->pNext = 0;.
12380 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65    pTempCur->pPre
12390 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65  v = 0;.  if( pTe
123a0 6d 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a  mpCur->pPage ){.
123b0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
123c0 5f 72 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70  _ref(pTempCur->p
123d0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
123e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
123f0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
12400 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73  rsor such as was
12410 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65   made by the Cre
12420 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73  ateTemporaryCurs
12430 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  or().** function
12440 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
12450 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 54 65  c void releaseTe
12460 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
12470 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
12480 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20  pCur->pPage ){. 
12490 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
124a0 75 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67  unref(pCur->pPag
124b0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d 0a 7d  e->aData);.  }.}
124c0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
124d0 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  e the BtCursor.i
124e0 6e 66 6f 20 66 69 65 6c 64 20 6f 66 20 74 68 65  nfo field of the
124f0 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 69 73   given cursor is
12500 20 76 61 6c 69 64 2e 0a 2a 2a 20 49 66 20 69 74   valid..** If it
12510 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
12520 76 61 6c 69 64 2c 20 63 61 6c 6c 20 70 61 72 73  valid, call pars
12530 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
12540 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
12550 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
12560 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
12570 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
12580 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
12590 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
125a0 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
125b0 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
125c0 20 70 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f   parseCell()..*/
125d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74  .static void get
125e0 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
125f0 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
12600 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
12610 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 72 73 65  ==0 ){.    parse
12620 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
12630 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43  , pCur->idx, &pC
12640 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c  ur->info);.  }el
12650 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  se{.#ifndef NDEB
12660 55 47 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  UG.    CellInfo 
12670 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  info;.    memset
12680 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
12690 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 70 61  f(info));.    pa
126a0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
126b0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
126c0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
126d0 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f  rt( memcmp(&info
126e0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
126f0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
12700 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
12710 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
12720 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
12730 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
12740 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
12750 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
12760 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
12770 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
12780 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
12790 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
127a0 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
127b0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
127c0 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
127d0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
127e0 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
127f0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
12800 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
12810 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
12820 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
12830 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  n the key..*/.in
12840 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
12850 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
12860 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
12870 29 7b 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e  ){.  if( !pCur->
12880 69 73 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 2a  isValid ){.    *
12890 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  pSize = 0;.  }el
128a0 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49  se{.    getCellI
128b0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a  nfo(pCur);.    *
128c0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
128d0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72  fo.nKey;.  }.  r
128e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
128f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
12900 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
12910 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
12920 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
12930 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
12940 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
12950 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  to.  Always retu
12960 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
12970 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
12980 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68  possible.  If th
12990 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
129a0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
129b0 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72  nting to an entr
129c0 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70  y (which can hap
129d0 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  pen, for example
129e0 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  , if.** the data
129f0 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74  base is empty) t
12a00 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65  hen *pSize is se
12a10 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  t to 0..*/.int s
12a20 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
12a30 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
12a40 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
12a50 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 69 73  .  if( !pCur->is
12a60 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 2f 2a 20  Valid ){.    /* 
12a70 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  Not pointing at 
12a80 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20  a valid entry - 
12a90 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e  set *pSize to 0.
12aa0 20 2a 2f 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d   */.    *pSize =
12ab0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
12ac0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
12ad0 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d  r);.    *pSize =
12ae0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
12af0 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  a;.  }.  return 
12b00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12b10 0a 2a 2a 20 52 65 61 64 20 70 61 79 6c 6f 61 64  .** Read payload
12b20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
12b30 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
12b40 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
12b50 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20   is.** pointing 
12b60 74 6f 2e 20 20 42 65 67 69 6e 20 72 65 61 64 69  to.  Begin readi
12b70 6e 67 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61  ng the payload a
12b80 74 20 22 6f 66 66 73 65 74 22 20 61 6e 64 20 72  t "offset" and r
12b90 65 61 64 0a 2a 2a 20 61 20 74 6f 74 61 6c 20 6f  ead.** a total o
12ba0 66 20 22 61 6d 74 22 20 62 79 74 65 73 2e 20 20  f "amt" bytes.  
12bb0 50 75 74 20 74 68 65 20 72 65 73 75 6c 74 20 69  Put the result i
12bc0 6e 20 7a 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  n zBuf..**.** Th
12bd0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
12be0 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69  not make a disti
12bf0 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b  nction between k
12c00 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20  ey and data..** 
12c10 49 74 20 6a 75 73 74 20 72 65 61 64 73 20 62 79  It just reads by
12c20 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79  tes from the pay
12c30 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74 61  load area.  Data
12c40 20 6d 69 67 68 74 20 61 70 70 65 61 72 0a 2a 2a   might appear.**
12c50 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67   on the main pag
12c60 65 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  e or be scattere
12c70 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
12c80 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
12c90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12ca0 67 65 74 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  getPayload(.  Bt
12cb0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
12cc0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
12cd0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
12ce0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
12cf0 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 20 20 20   int offset,    
12d00 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
12d10 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
12d20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
12d30 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
12d40 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
12d50 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
12d60 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
12d70 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
12d80 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
12d90 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
12da0 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20  .  int skipKey  
12db0 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
12dc0 74 20 62 65 67 69 6e 73 20 61 74 20 64 61 74 61  t begins at data
12dd0 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65   if this is true
12de0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
12df0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
12e00 3b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67  ;.  Pgno nextPag
12e10 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  e;.  int rc;.  M
12e20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
12e30 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69   Btree *pBt;.  i
12e40 6e 74 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 75  nt ovflSize;.  u
12e50 33 32 20 6e 4b 65 79 3b 0a 0a 20 20 61 73 73 65  32 nKey;..  asse
12e60 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
12e70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b  Cur->pPage!=0 );
12e80 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
12e90 3e 69 73 56 61 6c 69 64 20 29 3b 0a 20 20 70 42  >isValid );.  pB
12ea0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
12eb0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
12ec0 50 61 67 65 3b 0a 20 20 70 61 67 65 49 6e 74 65  Page;.  pageInte
12ed0 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20 20  grity(pPage);.  
12ee0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
12ef0 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
12f00 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
12f10 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
12f20 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
12f30 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
12f40 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cell;.  aPayload
12f50 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   += pCur->info.n
12f60 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50  Header;.  if( pP
12f70 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
12f80 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     nKey = 0;.  }
12f90 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  else{.    nKey =
12fa0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
12fb0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
12fc0 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 69  offset>=0 );.  i
12fd0 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
12fe0 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79    offset += nKey
12ff0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73  ;.  }.  if( offs
13000 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
13010 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29  ur->info.nData )
13020 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13030 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
13040 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
13050 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
13060 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
13070 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
13080 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
13090 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
130a0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
130b0 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
130c0 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
130d0 42 75 66 2c 20 26 61 50 61 79 6c 6f 61 64 5b 6f  Buf, &aPayload[o
130e0 66 66 73 65 74 5d 2c 20 61 29 3b 0a 20 20 20 20  ffset], a);.    
130f0 69 66 28 20 61 3d 3d 61 6d 74 20 29 7b 0a 20 20  if( a==amt ){.  
13100 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13110 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
13120 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
13130 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
13140 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
13150 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
13160 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
13170 6c 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c 53 69 7a  l;.  }.  ovflSiz
13180 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
13190 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66 28 20 61  ize - 4;.  if( a
131a0 6d 74 3e 30 20 29 7b 0a 20 20 20 20 6e 65 78 74  mt>0 ){.    next
131b0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
131c0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
131d0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 20  info.nLocal]);. 
131e0 20 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20     while( amt>0 
131f0 26 26 20 6e 65 78 74 50 61 67 65 20 29 7b 0a 20  && nextPage ){. 
13200 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13210 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e  3pager_get(pBt->
13220 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
13230 2c 20 28 76 6f 69 64 2a 2a 29 26 61 50 61 79 6c  , (void**)&aPayl
13240 6f 61 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oad);.      if( 
13250 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
13260 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13270 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 50 61    }.      nextPa
13280 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
13290 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 69  ayload);.      i
132a0 66 28 20 6f 66 66 73 65 74 3c 6f 76 66 6c 53 69  f( offset<ovflSi
132b0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ze ){.        in
132c0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
132d0 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
132e0 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
132f0 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
13300 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
13310 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13320 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
13330 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
13340 2b 34 5d 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  +4], a);.       
13350 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
13360 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
13370 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
13380 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13390 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
133a0 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
133b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
133c0 70 61 67 65 72 5f 75 6e 72 65 66 28 61 50 61 79  pager_unref(aPay
133d0 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  load);.    }.  }
133e0 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ..  if( amt>0 ){
133f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13400 54 45 5f 43 4f 52 52 55 50 54 3b 20 2f 2a 20 62  TE_CORRUPT; /* b
13410 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20  kpt-CORRUPT */. 
13420 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
13430 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13440 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
13450 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
13460 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
13470 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
13480 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
13490 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
134a0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
134b0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
134c0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
134d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
134e0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
134f0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
13500 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
13510 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
13520 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
13530 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
13540 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
13550 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
13560 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
13570 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
13580 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
13590 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
135a0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
135b0 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  uf){.  assert( p
135c0 43 75 72 2d 3e 69 73 56 61 6c 69 64 20 29 3b 0a  Cur->isValid );.
135d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
135e0 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  pPage!=0 );.  as
135f0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
13600 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  e->intKey==0 );.
13610 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
13620 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
13630 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  idx<pCur->pPage-
13640 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
13650 72 6e 20 67 65 74 50 61 79 6c 6f 61 64 28 70 43  rn getPayload(pC
13660 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
13670 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
13680 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  )pBuf, 0);.}../*
13690 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
136a0 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
136b0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
136c0 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
136d0 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
136e0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
136f0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
13700 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
13710 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
13720 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
13730 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
13740 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
13750 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
13760 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
13770 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
13780 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
13790 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
137a0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
137b0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
137c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
137d0 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
137e0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
137f0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
13800 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
13810 65 72 74 28 20 70 43 75 72 2d 3e 69 73 56 61 6c  ert( pCur->isVal
13820 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
13830 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
13840 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
13850 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
13860 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67  ->idx<pCur->pPag
13870 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65  e->nCell );.  re
13880 74 75 72 6e 20 67 65 74 50 61 79 6c 6f 61 64 28  turn getPayload(
13890 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
138a0 74 2c 20 70 42 75 66 2c 20 31 29 3b 0a 7d 0a 0a  t, pBuf, 1);.}..
138b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
138c0 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
138d0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
138e0 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
138f0 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
13900 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
13910 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
13920 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
13930 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
13940 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d   key if skipKey=
13950 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73  =0 and it points
13960 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
13970 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20  g of data if.** 
13980 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65  skipKey==1.  The
13990 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
139a0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65   of available ke
139b0 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
139c0 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  n.** into *pAmt.
139d0 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
139e0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
139f0 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
13a00 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f  be.** a valid po
13a10 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
13a20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
13a30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
13a40 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
13a50 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
13a60 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
13a70 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
13a80 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
13a90 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
13aa0 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
13ab0 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
13ac0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
13ad0 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
13ae0 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
13af0 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
13b00 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
13b10 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
13b20 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
13b30 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
13b40 67 65 73 2c 20 74 68 65 6e 20 67 65 74 50 61 79  ges, then getPay
13b50 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
13b60 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
13b70 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  y.** the key/dat
13b80 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
13b90 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
13ba0 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
13bb0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
13bc0 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
13bd0 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
13be0 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
13bf0 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
13c00 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
13c10 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
13c20 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
13c30 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
13c40 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
13c50 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
13c60 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
13c70 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61  ed char *fetchPa
13c80 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
13c90 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
13ca0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
13cb0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
13cc0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
13cd0 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20  *pAmt,          
13ce0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
13cf0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
13d00 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
13d10 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20    int skipKey   
13d20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62         /* read b
13d30 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61  eginning at data
13d40 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65   if this is true
13d50 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
13d60 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
13d70 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
13d80 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ge;.  Btree *pBt
13d90 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
13da0 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61  int nLocal;..  a
13db0 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
13dc0 26 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30  & pCur->pPage!=0
13dd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
13de0 75 72 2d 3e 69 73 56 61 6c 69 64 20 29 3b 0a 20  ur->isValid );. 
13df0 20 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74   pBt = pCur->pBt
13e00 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
13e10 2d 3e 70 50 61 67 65 3b 0a 20 20 70 61 67 65 49  ->pPage;.  pageI
13e20 6e 74 65 67 72 69 74 79 28 70 50 61 67 65 29 3b  ntegrity(pPage);
13e30 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
13e40 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
13e50 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
13e60 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
13e70 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
13e80 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
13e90 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
13ea0 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
13eb0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
13ec0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
13ed0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
13ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
13ef0 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
13f00 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
13f10 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
13f20 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
13f30 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
13f40 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
13f50 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
13f60 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
13f70 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
13f80 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e      if( nLocal>n
13f90 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f  Key ){.      nLo
13fa0 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  cal = nKey;.    
13fb0 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  }.  }.  *pAmt = 
13fc0 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
13fd0 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f   aPayload;.}.../
13fe0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
13ff0 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
14000 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
14010 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
14020 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
14030 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
14040 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
14050 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
14060 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
14070 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
14080 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
14090 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
140a0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
140b0 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
140c0 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
140d0 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
140e0 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
140f0 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
14100 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
14110 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
14120 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
14130 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
14140 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
14150 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
14160 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
14170 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
14180 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
14190 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
141a0 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
141b0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
141c0 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
141d0 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f  return (const vo
141e0 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
141f0 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b  (pCur, pAmt, 0);
14200 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
14210 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
14220 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
14230 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
14240 0a 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74  .  return (const
14250 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
14260 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
14270 31 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  1);.}.../*.** Mo
14280 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
14290 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
142a0 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
142b0 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
142c0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
142d0 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
142e0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
142f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14300 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
14310 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
14320 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  newPgno){.  int 
14330 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
14340 4e 65 77 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  NewPage;.  MemPa
14350 67 65 20 2a 70 4f 6c 64 50 61 67 65 3b 0a 20 20  ge *pOldPage;.  
14360 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 43 75  Btree *pBt = pCu
14370 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
14380 74 28 20 70 43 75 72 2d 3e 69 73 56 61 6c 69 64  t( pCur->isValid
14390 20 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   );.  rc = getAn
143a0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
143b0 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
143c0 65 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  e, pCur->pPage);
143d0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
143e0 72 6e 20 72 63 3b 0a 20 20 70 61 67 65 49 6e 74  rn rc;.  pageInt
143f0 65 67 72 69 74 79 28 70 4e 65 77 50 61 67 65 29  egrity(pNewPage)
14400 3b 0a 20 20 70 4e 65 77 50 61 67 65 2d 3e 69 64  ;.  pNewPage->id
14410 78 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e  xParent = pCur->
14420 69 64 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20  idx;.  pOldPage 
14430 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
14440 20 70 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53 68   pOldPage->idxSh
14450 69 66 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  ift = 0;.  relea
14460 73 65 50 61 67 65 28 70 4f 6c 64 50 61 67 65 29  sePage(pOldPage)
14470 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20  ;.  pCur->pPage 
14480 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
14490 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70  ur->idx = 0;.  p
144a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
144b0 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50  = 0;.  if( pNewP
144c0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a  age->nCell<1 ){.
144d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
144e0 45 5f 43 4f 52 52 55 50 54 3b 20 2f 2a 20 62 6b  E_CORRUPT; /* bk
144f0 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20  pt-CORRUPT */.  
14500 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
14510 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
14520 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
14530 65 20 70 61 67 65 20 69 73 20 74 68 65 20 76 69  e page is the vi
14540 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 69 74  rtual root of it
14550 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  s table..**.** T
14560 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
14570 70 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74  page is the root
14580 20 70 61 67 65 20 66 6f 72 20 6d 6f 73 74 20 74   page for most t
14590 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a 2a 20 66  ables.  But.** f
145a0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  or the table roo
145b0 74 65 64 20 6f 6e 20 70 61 67 65 20 31 2c 20 73  ted on page 1, s
145c0 6f 6d 65 74 69 6d 65 20 74 68 65 20 72 65 61 6c  ometime the real
145d0 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
145e0 20 65 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f   empty except fo
145f0 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
14600 74 65 72 2e 20 20 49 6e 20 73 75 63 68 20 63 61  ter.  In such ca
14610 73 65 73 20 74 68 65 0a 2a 2a 20 76 69 72 74 75  ses the.** virtu
14620 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
14630 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74 68  the page that th
14640 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20  e right-pointer 
14650 6f 66 20 70 61 67 65 0a 2a 2a 20 31 20 69 73 20  of page.** 1 is 
14660 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a  pointing to..*/.
14670 73 74 61 74 69 63 20 69 6e 74 20 69 73 52 6f 6f  static int isRoo
14680 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
14690 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
146a0 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67   *pParent = pPag
146b0 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66  e->pParent;.  if
146c0 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 72  ( pParent==0 ) r
146d0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
146e0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29  Parent->pgno>1 )
146f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
14700 20 67 65 74 32 62 79 74 65 28 26 70 50 61 72 65   get2byte(&pPare
14710 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
14720 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  t->hdrOffset+3])
14730 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
14740 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
14750 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
14760 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
14770 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
14780 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
14790 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
147a0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
147b0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
147c0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
147d0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
147e0 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
147f0 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
14800 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
14810 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
14820 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
14830 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
14840 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
14850 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
14860 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
14870 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
14880 75 72 29 7b 0a 20 20 50 67 6e 6f 20 6f 6c 64 50  ur){.  Pgno oldP
14890 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  gno;.  MemPage *
148a0 70 50 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61  pParent;.  MemPa
148b0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  ge *pPage;.  int
148c0 20 69 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61   idxParent;..  a
148d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 73 56  ssert( pCur->isV
148e0 61 6c 69 64 20 29 3b 0a 20 20 70 50 61 67 65 20  alid );.  pPage 
148f0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
14900 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21 3d   assert( pPage!=
14910 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  0 );.  assert( !
14920 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  isRootPage(pPage
14930 29 20 29 3b 0a 20 20 70 61 67 65 49 6e 74 65 67  ) );.  pageInteg
14940 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20 20 70  rity(pPage);.  p
14950 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
14960 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72  pParent;.  asser
14970 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29 3b  t( pParent!=0 );
14980 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79  .  pageIntegrity
14990 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 64 78  (pParent);.  idx
149a0 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
149b0 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c  idxParent;.  sql
149c0 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 70 50  ite3pager_ref(pP
149d0 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20  arent->aData);. 
149e0 20 6f 6c 64 50 67 6e 6f 20 3d 20 70 50 61 67 65   oldPgno = pPage
149f0 2d 3e 70 67 6e 6f 3b 0a 20 20 72 65 6c 65 61 73  ->pgno;.  releas
14a00 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
14a10 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50  pCur->pPage = pP
14a20 61 72 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69  arent;.  pCur->i
14a30 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
14a40 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
14a50 2d 3e 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b  ->idxShift==0 );
14a60 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69  .  pCur->idx = i
14a70 64 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  dxParent;.}../*.
14a80 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
14a90 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  or to the root p
14aa0 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  age.*/.static in
14ab0 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43  t moveToRoot(BtC
14ac0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
14ad0 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
14ae0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 72 65    int rc;.  Btre
14af0 65 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  e *pBt = pCur->p
14b00 42 74 3b 0a 0a 20 20 72 63 20 3d 20 67 65 74 41  Bt;..  rc = getA
14b10 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
14b20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
14b30 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 69 66  &pRoot, 0);.  if
14b40 28 20 72 63 20 29 7b 0a 20 20 20 20 70 43 75 72  ( rc ){.    pCur
14b50 2d 3e 69 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20  ->isValid = 0;. 
14b60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14b70 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
14b80 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
14b90 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70 52  pageIntegrity(pR
14ba0 6f 6f 74 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50  oot);.  pCur->pP
14bb0 61 67 65 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 70  age = pRoot;.  p
14bc0 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20  Cur->idx = 0;.  
14bd0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
14be0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f   = 0;.  if( pRoo
14bf0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21  t->nCell==0 && !
14c00 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
14c10 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
14c20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f  .    assert( pRo
14c30 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20  ot->pgno==1 );. 
14c40 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
14c50 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
14c60 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
14c70 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73  fset+8]);.    as
14c80 73 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20  sert( subpage>0 
14c90 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 73 56  );.    pCur->isV
14ca0 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 72 63  alid = 1;.    rc
14cb0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
14cc0 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20  Cur, subpage);. 
14cd0 20 7d 0a 20 20 70 43 75 72 2d 3e 69 73 56 61 6c   }.  pCur->isVal
14ce0 69 64 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  id = pCur->pPage
14cf0 2d 3e 6e 43 65 6c 6c 3e 30 3b 0a 20 20 72 65 74  ->nCell>0;.  ret
14d00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14d10 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
14d20 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
14d30 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
14d40 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
14d50 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
14d60 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
14d70 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61  pointing..*/.sta
14d80 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
14d90 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
14da0 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
14db0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
14dc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
14dd0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
14de0 2d 3e 69 73 56 61 6c 69 64 20 29 3b 0a 20 20 77  ->isValid );.  w
14df0 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
14e00 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
14e10 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
14e20 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
14e30 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
14e40 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
14e50 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
14e60 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
14e70 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20  pCur->idx));.   
14e80 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
14e90 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
14ea0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
14eb0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74  rn rc;.  }.  ret
14ec0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14ed0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
14ee0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
14ef0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
14f00 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
14f10 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
14f20 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
14f30 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
14f40 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
14f50 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
14f60 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
14f70 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
14f80 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
14f90 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
14fa0 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
14fb0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
14fc0 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
14fd0 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
14fe0 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
14ff0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
15000 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
15010 65 20 2a 70 61 67 65 2a 2e 0a 2a 2f 0a 73 74 61  e *page*..*/.sta
15020 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
15030 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
15040 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
15050 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pgno;.  int rc;.
15060 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
15070 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
15080 72 2d 3e 69 73 56 61 6c 69 64 20 29 3b 0a 20 20  r->isValid );.  
15090 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d  while( !(pPage =
150a0 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
150b0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
150c0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
150d0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
150e0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
150f0 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70     pCur->idx = p
15100 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
15110 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
15120 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
15130 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
15140 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
15150 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
15160 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 70 43 75  nCell - 1;.  pCu
15170 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
15180 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
15190 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
151a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
151b0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
151c0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
151d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
151e0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
151f0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
15200 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
15210 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
15220 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
15230 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
15240 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
15250 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
15260 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
15270 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
15280 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
15290 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65   rc;.  rc = move
152a0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
152b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
152c0 72 63 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  rc;.  if( pCur->
152d0 69 73 56 61 6c 69 64 3d 3d 30 20 29 7b 0a 20 20  isValid==0 ){.  
152e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
152f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
15300 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  );.    *pRes = 1
15310 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15320 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
15330 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
15340 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
15350 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 63 20  *pRes = 0;.  rc 
15360 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
15370 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
15380 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
15390 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
153a0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
153b0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
153c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
153d0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
153e0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
153f0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
15400 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
15410 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
15420 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
15430 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
15440 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
15450 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
15460 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
15470 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
15480 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
15490 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
154a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
154b0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 56 61    if( pCur->isVa
154c0 6c 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  lid==0 ){.    as
154d0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
154e0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
154f0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
15500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15510 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
15520 28 20 70 43 75 72 2d 3e 69 73 56 61 6c 69 64 20  ( pCur->isValid 
15530 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
15540 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
15550 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
15560 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15570 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
15580 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
15590 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
155a0 65 61 72 20 70 4b 65 79 2f 6e 4b 65 79 2e 0a 2a  ear pKey/nKey..*
155b0 2a 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65  * Return a succe
155c0 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
155d0 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
155e0 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
155f0 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
15600 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69  d.  pKey is.** i
15610 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 6f 74 68  gnored.  For oth
15620 65 72 20 74 61 62 6c 65 73 2c 20 6e 4b 65 79 20  er tables, nKey 
15630 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
15640 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 0a 2a   bytes of data.*
15650 2a 20 69 6e 20 6e 4b 65 79 2e 20 20 54 68 65 20  * in nKey.  The 
15660 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
15670 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 77 68  ion specified wh
15680 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  en the cursor wa
15690 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 69 73 20  s.** created is 
156a0 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
156b0 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  keys..**.** If a
156c0 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
156d0 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
156e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
156f0 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
15700 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
15710 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
15720 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
15730 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
15740 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
15750 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
15760 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
15770 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
15780 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
15790 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  y..**.** The res
157a0 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  ult of comparing
157b0 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
157c0 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
157d0 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69   the.** cursor i
157e0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52  s written to *pR
157f0 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c  es if pRes!=NULL
15800 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
15810 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20  f.** this value 
15820 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
15830 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
15840 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
15850 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
15860 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
15870 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
15880 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
15890 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69  r than pKey or i
158a0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
158b0 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
158c0 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
158d0 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
158e0 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
158f0 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
15900 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
15910 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
15920 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
15930 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
15940 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15950 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
15960 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  hes pKey..**.** 
15970 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
15980 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
15990 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
159a0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159c0 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
159d0 20 70 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71   pKey..*/.int sq
159e0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
159f0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
15a00 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
15a10 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 69 6e 74  y, i64 nKey, int
15a20 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
15a30 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  c;.  rc = moveTo
15a40 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
15a50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
15a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
15a70 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
15a80 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
15a90 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
15aa0 28 20 70 43 75 72 2d 3e 69 73 56 61 6c 69 64 3d  ( pCur->isValid=
15ab0 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  =0 ){.    *pRes 
15ac0 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
15ad0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
15ae0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
15af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15b00 0a 20 20 7d 0a 20 20 20 66 6f 72 28 3b 3b 29 7b  .  }.   for(;;){
15b10 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
15b20 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  r;.    Pgno chld
15b30 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
15b40 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
15b50 50 61 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20  Page;.    int c 
15b60 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72  = -1;  /* pRes r
15b70 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69  eturn if table i
15b80 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20  s empty must be 
15b90 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20  -1 */.    lwr = 
15ba0 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61  0;.    upr = pPa
15bb0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
15bc0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74   if( !pPage->int
15bd0 4b 65 79 20 26 26 20 70 4b 65 79 3d 3d 30 20 29  Key && pKey==0 )
15be0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15bf0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
15c00 20 20 20 7d 0a 20 20 20 20 70 61 67 65 49 6e 74     }.    pageInt
15c10 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20  egrity(pPage);. 
15c20 20 20 20 77 68 69 6c 65 28 20 6c 77 72 3c 3d 75     while( lwr<=u
15c30 70 72 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  pr ){.      void
15c40 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
15c50 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
15c60 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20        pCur->idx 
15c70 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20  = (lwr+upr)/2;. 
15c80 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
15c90 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  nSize = 0;.     
15ca0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
15cb0 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
15cc0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  lKey);.      if(
15cd0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
15ce0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  {.        if( nC
15cf0 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20  ellKey<nKey ){. 
15d00 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b           c = -1;
15d10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
15d20 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79  f( nCellKey>nKey
15d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
15d40 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = +1;.        }e
15d50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
15d60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
15d70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15d80 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62       int availab
15d90 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  le;.        pCel
15da0 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66  lKey = (void *)f
15db0 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
15dc0 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29  , &available, 0)
15dd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 76  ;.        if( av
15de0 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65  ailable>=nCellKe
15df0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
15e00 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72   = pCur->xCompar
15e10 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43  e(pCur->pArg, nC
15e20 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
15e30 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  , nKey, pKey);. 
15e40 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15e50 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
15e60 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
15e70 61 77 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  aw( nCellKey );.
15e80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
15e90 65 6c 6c 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  ellKey==0 ) retu
15ea0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
15eb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
15ec0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
15ed0 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65  pCur, 0, nCellKe
15ee0 79 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c  y, (void *)pCell
15ef0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
15f00 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61  c = pCur->xCompa
15f10 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e  re(pCur->pArg, n
15f20 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
15f30 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  y, nKey, pKey);.
15f40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15f50 46 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  Free(pCellKey);.
15f60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
15f70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
15f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15f90 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
15fa0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
15fb0 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26  age->leafData &&
15fc0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
15fd0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
15fe0 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20 20   pCur->idx;.    
15ff0 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20        upr = lwr 
16000 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  - 1;.          b
16010 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
16020 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
16030 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20  f( pRes ) *pRes 
16040 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
16050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16060 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16070 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30   }.      if( c<0
16080 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20   ){.        lwr 
16090 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20  = pCur->idx+1;. 
160a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
160b0 20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d 3e      upr = pCur->
160c0 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  idx-1;.      }. 
160d0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
160e0 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20   lwr==upr+1 );. 
160f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
16100 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
16110 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
16120 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
16130 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
16140 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
16150 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
16160 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
16170 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
16180 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
16190 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
161a0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
161b0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
161c0 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
161d0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64    }.    if( chld
161e0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  Pg==0 ){.      a
161f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
16200 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
16210 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
16220 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ell );.      if(
16230 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20   pRes ) *pRes = 
16240 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
16250 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
16260 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  .    pCur->idx =
16270 20 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e   lwr;.    pCur->
16280 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
16290 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
162a0 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50  hild(pCur, chldP
162b0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
162c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
162d0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  c;.    }.  }.  /
162e0 2a 20 4e 4f 54 20 52 45 41 43 48 45 44 20 2a 2f  * NOT REACHED */
162f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16300 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
16310 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
16320 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
16330 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
16340 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
16350 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
16360 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
16370 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
16380 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
16390 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
163a0 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
163b0 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
163c0 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
163d0 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
163e0 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
163f0 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
16400 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
16410 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
16420 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
16430 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  {.  return pCur-
16440 3e 69 73 56 61 6c 69 64 3d 3d 30 3b 0a 7d 0a 0a  >isValid==0;.}..
16450 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
16460 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
16470 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
16480 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
16490 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
164a0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
164b0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
164c0 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
164d0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
164e0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
164f0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
16500 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
16510 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
16520 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
16530 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16540 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
16550 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
16560 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
16570 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
16580 43 75 72 2d 3e 70 50 61 67 65 3b 0a 0a 20 20 61  Cur->pPage;..  a
16590 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
165a0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73  ;.  if( pCur->is
165b0 56 61 6c 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Valid==0 ){.    
165c0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
165d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
165e0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
165f0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
16600 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
16610 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
16620 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78   );..  pCur->idx
16630 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ++;.  pCur->info
16640 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66  .nSize = 0;.  if
16650 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
16660 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
16670 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
16680 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
16690 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
166a0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
166b0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
166c0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
166d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
166e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
166f0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
16700 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
16710 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
16720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16730 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
16740 20 69 66 28 20 69 73 52 6f 6f 74 50 61 67 65 28   if( isRootPage(
16750 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  pPage) ){.      
16760 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
16770 20 20 20 20 20 70 43 75 72 2d 3e 69 73 56 61 6c       pCur->isVal
16780 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  id = 0;.        
16790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
167a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
167b0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
167c0 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
167d0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
167e0 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
167f0 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  >idx>=pPage->nCe
16800 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  ll );.    *pRes 
16810 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
16820 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 7b 0a  ge->leafData ){.
16830 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16840 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
16850 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
16860 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
16870 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
16880 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16890 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
168a0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
168b0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
168c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
168d0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
168e0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65  most(pCur);.  re
168f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16900 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
16910 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
16920 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
16930 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
16940 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
16950 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
16960 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
16970 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
16980 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
16990 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
169a0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
169b0 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
169c0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
169d0 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
169e0 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
169f0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
16a00 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
16a10 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
16a20 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f    int rc;.  Pgno
16a30 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65   pgno;.  MemPage
16a40 20 2a 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70   *pPage;.  if( p
16a50 43 75 72 2d 3e 69 73 56 61 6c 69 64 3d 3d 30 20  Cur->isValid==0 
16a60 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
16a70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
16a80 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
16a90 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
16aa0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
16ab0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
16ac0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
16ad0 64 78 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  dx>=0 );.  if( !
16ae0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
16af0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
16b00 74 65 28 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  te( findCell(pPa
16b10 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 29  ge, pCur->idx) )
16b20 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
16b30 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
16b40 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
16b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16b60 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
16b70 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
16b80 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
16b90 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a  pCur->idx==0 ){.
16ba0 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 6f 74        if( isRoot
16bb0 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20  Page(pPage) ){. 
16bc0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 73 56         pCur->isV
16bd0 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  alid = 0;.      
16be0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
16bf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16c00 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
16c10 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
16c20 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
16c30 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
16c40 67 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ge;.    }.    pC
16c50 75 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70  ur->idx--;.    p
16c60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
16c70 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
16c80 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20  ge->leafData && 
16c90 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
16ca0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16cb0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
16cc0 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
16cd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
16ce0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16cf0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20    }.  }.  *pRes 
16d00 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
16d10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
16d20 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
16d30 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
16d40 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
16d50 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
16d60 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
16d70 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
16d80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
16d90 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65  te().** has alre
16da0 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
16db0 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  on the new page.
16dc0 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  )  The new page 
16dd0 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e  has also.** been
16de0 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20   referenced and 
16df0 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
16e00 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ine is responsib
16e10 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a  le for calling.*
16e20 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  * sqlite3pager_u
16e30 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
16e40 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
16e50 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
16e60 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
16e70 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
16e80 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
16e90 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
16ea0 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
16eb0 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
16ec0 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
16ed0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
16ee0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
16ef0 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
16f00 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
16f10 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61   on *ppPage if a
16f20 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
16f30 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
16f40 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d  e "nearby" param
16f50 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
16f60 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65  hen a (feeble) e
16f70 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
16f80 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61   .** locate a pa
16f90 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  ge close to the 
16fa0 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61  page number "nea
16fb0 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20  rby".  This can 
16fc0 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a  be used in an.**
16fd0 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70   attempt to keep
16fe0 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63   related pages c
16ff0 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68  lose to each oth
17000 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
17010 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63  se file,.** whic
17020 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61  h in turn can ma
17030 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ke database acce
17040 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ss faster..**.**
17050 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20   If the "exact" 
17060 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
17070 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65   0, and the page
17080 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65  -number nearby e
17090 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65  xists .** anywhe
170a0 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
170b0 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
170c0 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65  guarenteed to be
170d0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
170e0 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ** is only used 
170f0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  by auto-vacuum d
17100 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c  atabases when al
17110 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74  locating a new t
17120 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
17130 69 6e 74 20 61 6c 6c 6f 63 61 74 65 50 61 67 65  int allocatePage
17140 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 2c 20  (.  Btree *pBt, 
17150 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
17160 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50  age, .  Pgno *pP
17170 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61  gno, .  Pgno nea
17180 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a  rby,.  u8 exact.
17190 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
171a0 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
171b0 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20    int n;     /* 
171c0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
171d0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
171e0 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20 20  */.  int k;     
171f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
17200 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
17210 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
17220 20 2a 2f 0a 0a 20 20 70 50 61 67 65 31 20 3d 20   */..  pPage1 = 
17230 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e  pBt->pPage1;.  n
17240 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
17250 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
17260 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
17270 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
17280 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
17290 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
172a0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
172b0 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
172c0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  *pTrunk = 0;.   
172d0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
172e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76    MemPage *pPrev
172f0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 75  Trunk = 0;.    u
17300 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
17310 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
17320 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
17330 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
17340 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  by' */.    .    
17350 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74  /* If the 'exact
17360 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20  ' parameter was 
17370 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79  true and a query
17380 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
17390 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
173a0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
173b0 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
173c0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
173d0 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
173e0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
173f0 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
17400 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
17410 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
17420 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17430 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
17440 20 65 78 61 63 74 20 29 7b 0a 20 20 20 20 20 20   exact ){.      
17450 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
17460 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
17470 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17480 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
17490 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  m );.      rc = 
174a0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
174b0 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
174c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
174d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
174e0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
174f0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
17500 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
17510 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
17520 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
17530 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65  nearby;.    }.#e
17540 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
17550 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
17560 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
17570 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
17580 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
17590 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
175a0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
175b0 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
175c0 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
175d0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
175e0 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
175f0 28 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  (pPage1->aData);
17600 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
17610 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
17620 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
17630 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
17640 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
17650 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
17660 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
17670 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
17680 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
17690 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
176a0 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
176b0 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
176c0 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
176d0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
176e0 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
176f0 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
17700 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20  is located..    
17710 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
17720 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
17730 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
17740 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
17750 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
17760 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
17770 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
17780 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17790 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
177a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
177b0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
177c0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
177d0 67 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  getPage(pBt, iTr
177e0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 29 3b 0a 20  unk, &pTrunk);. 
177f0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
17800 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
17810 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
17820 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
17830 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
17840 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20    /* TODO: This 
17850 73 68 6f 75 6c 64 20 6d 6f 76 65 20 74 6f 20 61  should move to a
17860 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3f 20 2a  fter the loop? *
17870 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
17880 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
17890 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 29 3b 0a  pTrunk->aData);.
178a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
178b0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
178c0 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20  age(pTrunk);.   
178d0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
178e0 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
178f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
17900 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17910 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
17920 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
17930 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
17940 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
17950 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
17960 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
17970 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
17980 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
17990 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
179a0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
179b0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
179c0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
179d0 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
179e0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
179f0 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
17a00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
17a10 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
17a20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
17a30 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
17a40 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
17a50 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
17a60 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
17a70 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
17a80 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
17a90 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
17aa0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
17ab0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
17ac0 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
17ad0 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
17ae0 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
17af0 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e  else if( k>pBt->
17b00 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
17b10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
17b20 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
17b30 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
17b40 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
17b50 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
17b60 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
17b70 3b 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50  ; /* bkpt-CORRUP
17b80 54 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  T */.#ifndef SQL
17b90 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
17ba0 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
17bb0 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26  if( searchList &
17bc0 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b  & nearby==iTrunk
17bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
17be0 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67  he list is being
17bf0 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68   searched and th
17c00 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  is trunk page is
17c10 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
17c20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65    ** to allocate
17c30 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
17c40 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c  whether it has l
17c50 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  eaves..        *
17c60 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
17c70 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b  ( *pPgno==iTrunk
17c80 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50   );.        *ppP
17c90 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
17ca0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
17cb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
17cc0 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
17cd0 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
17ce0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
17cf0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
17d00 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
17d10 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
17d20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
17d30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17d40 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
17d50 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
17d60 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
17d70 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
17d80 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
17d90 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
17da0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
17db0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
17dc0 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
17dd0 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
17de0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
17df0 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
17e00 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
17e10 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
17e20 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
17e30 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
17e40 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
17e50 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
17e60 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
17e70 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
17e80 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
17e90 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
17ea0 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
17eb0 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
17ec0 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
17ed0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
17ee0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17ef0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17f00 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
17f10 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  (pTrunk);.      
17f20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
17f30 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
17f40 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
17f50 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
17f60 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
17f70 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
17f80 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  ite(pNewTrunk->a
17f90 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  Data);.         
17fa0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17fb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17fc0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
17fd0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
17fe0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
17ff0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  e(pTrunk);.     
18000 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
18010 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
18020 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
18030 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
18040 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
18050 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
18060 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
18070 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
18080 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
18090 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
180a0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
180b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
180c0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
180d0 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
180e0 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
180f0 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  *4);.          i
18100 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
18110 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
18120 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
18130 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
18140 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
18150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18160 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
18170 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
18180 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
18190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
181a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
181b0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
181c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
181d0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
181e0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
181f0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
18200 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
18210 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
18220 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
18230 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18240 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
18250 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
18260 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  unk */.        i
18270 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  nt closest;.    
18280 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
18290 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
182a0 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
182b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
182c0 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
182d0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
182e0 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20  int i, dist;.   
182f0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
18300 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
18310 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  st = get4byte(&a
18320 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
18330 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
18340 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d   dist<0 ) dist =
18350 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20   -dist;.        
18360 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
18370 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
18380 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62    int d2 = get4b
18390 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
183a0 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
183b0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
183c0 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20  0 ) d2 = -d2;.  
183d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
183e0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
183f0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
18400 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
18410 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
18420 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
18440 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18450 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
18460 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
18470 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
18480 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
18490 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t*4]);.        i
184a0 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c  f( !searchList |
184b0 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20  | iPage==nearby 
184c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  ){.          *pP
184d0 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
184e0 20 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e         if( *pPgn
184f0 6f 3e 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  o>sqlite3pager_p
18500 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
18510 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
18520 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67       /* Free pag
18530 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  e off the end of
18540 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
18550 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
18560 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20  SQLITE_CORRUPT; 
18570 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50 54 20  /* bkpt-CORRUPT 
18580 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  */.          }. 
18590 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
185a0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
185b0 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
185c0 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
185d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
185e0 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
185f0 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
18600 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
18610 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
18620 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
18630 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
18640 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
18650 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
18660 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
18670 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
18680 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
18690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
186a0 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
186b0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
186c0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61        rc = getPa
186d0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
186e0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
186f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18700 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18710 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
18720 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 28  _dont_rollback((
18730 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61 29  *ppPage)->aData)
18740 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
18750 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
18760 77 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  write((*ppPage)-
18770 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >aData);.       
18780 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
187a0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
187b0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
187c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
187d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
187e0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
187f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18800 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
18810 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
18820 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  );.    }while( s
18830 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 20  earchList );.   
18840 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
18850 75 6e 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  unk);.  }else{. 
18860 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
18870 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
18880 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65  freelist, so cre
18890 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61  ate a new page a
188a0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64  t the.    ** end
188b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
188c0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 73 71 6c      *pPgno = sql
188d0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
188e0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
188f0 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53   + 1;..#ifndef S
18900 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
18910 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
18920 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
18930 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
18940 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2c 20  Bt->usableSize, 
18950 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  *pPgno) ){.     
18960 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
18970 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
18980 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
18990 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
189a0 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
189b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
189c0 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
189d0 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
189e0 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
189f0 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
18a00 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
18a10 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
18a20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
18a30 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
18a40 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
18a50 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
18a60 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
18a70 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
18a80 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20  ", *pPgno));.   
18a90 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
18aa0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
18ab0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
18ac0 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
18ad0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
18ae0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
18af0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
18b00 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
18b10 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
18b20 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 29   *pPgno, ppPage)
18b30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
18b40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
18b50 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
18b60 77 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  write((*ppPage)-
18b70 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
18b80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18b90 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
18ba0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
18bb0 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
18bc0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
18bd0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
18be0 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
18bf0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
18c00 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
18c10 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 72  PAGE(pBt) );.  r
18c20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18c30 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f 66  ** Add a page of
18c40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18c50 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  le to the freeli
18c60 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  st..**.** sqlite
18c70 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69  3pager_unref() i
18c80 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72  s NOT called for
18c90 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
18ca0 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d  c int freePage(M
18cb0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
18cc0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
18cd0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d  Page->pBt;.  Mem
18ce0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
18cf0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e  Bt->pPage1;.  in
18d00 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f  t rc, n, k;..  /
18d10 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 70 61  * Prepare the pa
18d20 67 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a  ge for freeing *
18d30 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
18d40 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70  e->pgno>1 );.  p
18d50 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
18d60 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
18d70 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b  pPage->pParent);
18d80 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  .  pPage->pParen
18d90 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63  t = 0;..  /* Inc
18da0 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
18db0 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
18dc0 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
18dd0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
18de0 65 28 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  e(pPage1->aData)
18df0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
18e00 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67 65  urn rc;.  n = ge
18e10 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
18e20 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
18e30 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
18e40 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b  aData[36], n+1);
18e50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18e60 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
18e70 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
18e80 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
18e90 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
18ea0 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
18eb0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
18ec0 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
18ed0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
18ee0 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
18ef0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
18f00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   ){.    rc = ptr
18f10 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61 67  mapPut(pBt, pPag
18f20 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  e->pgno, PTRMAP_
18f30 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20  FREEPAGE, 0);.  
18f40 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
18f50 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
18f60 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a  ..  if( n==0 ){.
18f70 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
18f80 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
18f90 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ge */.    rc = s
18fa0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
18fb0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
18fc0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
18fd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d  turn rc;.    mem
18fe0 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
18ff0 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74  , 0, 8);.    put
19000 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
19010 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d  Data[32], pPage-
19020 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43  >pgno);.    TRAC
19030 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
19040 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67  d first\n", pPag
19050 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
19060 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72  se{.    /* Other
19070 20 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65   free pages alre
19080 61 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72  ady exist.  Retr
19090 69 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72  ive the first tr
190a0 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  unk page.    ** 
190b0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
190c0 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77  and find out how
190d0 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20   many leaves it 
190e0 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  has. */.    MemP
190f0 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20  age *pTrunk;.   
19100 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
19110 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t, get4byte(&pPa
19120 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c  ge1->aData[32]),
19130 20 26 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 69   &pTrunk);.    i
19140 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
19150 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62  c;.    k = get4b
19160 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
19170 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20  ta[4]);.    if( 
19180 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  k>=pBt->usableSi
19190 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
191a0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69    /* The trunk i
191b0 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68  s full.  Turn th
191c0 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
191d0 65 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20  ed into a new.  
191e0 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67      ** trunk pag
191f0 65 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73  e with no leaves
19200 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
19210 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
19220 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
19230 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
19240 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19250 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
19260 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d  ->aData, pTrunk-
19270 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 75  >pgno);.      pu
19280 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
19290 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20  Data[4], 0);.   
192a0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
192b0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
192c0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
192d0 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
192e0 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
192f0 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
19300 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ng %d\n",.      
19310 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
19320 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  gno, pTrunk->pgn
19330 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
19340 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
19350 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70 61 67   newly freed pag
19360 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e 20 74  e as a leaf on t
19370 68 65 20 63 75 72 72 65 6e 74 20 74 72 75 6e 6b  he current trunk
19380 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
19390 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
193a0 65 28 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 29  e(pTrunk->aData)
193b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
193c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
193d0 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
193e0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b  nk->aData[4], k+
193f0 31 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  1);.      put4by
19400 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
19410 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d  a[8+k*4], pPage-
19420 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 73 71  >pgno);.      sq
19430 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
19440 77 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  write(pBt->pPage
19450 72 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  r, pPage->pgno);
19460 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
19470 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
19480 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
19490 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
194a0 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
194b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
194c0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
194d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
194e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
194f0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
19500 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
19510 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
19520 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
19530 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61   clearCell(MemPa
19540 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67  ge *pPage, unsig
19550 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29  ned char *pCell)
19560 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d  {.  Btree *pBt =
19570 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
19580 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
19590 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
195a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 61 72 73   int rc;..  pars
195b0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
195c0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
195d0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
195e0 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
195f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
19600 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
19610 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
19620 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
19630 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  hing */.  }.  ov
19640 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
19650 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
19660 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 77 68 69  verflow]);.  whi
19670 6c 65 28 20 6f 76 66 6c 50 67 6e 6f 21 3d 30 20  le( ovflPgno!=0 
19680 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
19690 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f  pOvfl;.    if( o
196a0 76 66 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33 70  vflPgno>sqlite3p
196b0 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
196c0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
196d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
196e0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
196f0 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  }.    rc = getPa
19700 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
19710 2c 20 26 70 4f 76 66 6c 29 3b 0a 20 20 20 20 69  , &pOvfl);.    i
19720 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
19730 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
19740 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c  = get4byte(pOvfl
19750 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 72 63  ->aData);.    rc
19760 20 3d 20 66 72 65 65 50 61 67 65 28 70 4f 76 66   = freePage(pOvf
19770 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
19780 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19790 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
197a0 65 66 28 70 4f 76 66 6c 2d 3e 61 44 61 74 61 29  ef(pOvfl->aData)
197b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
197c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
197d0 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
197e0 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
197f0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
19800 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
19810 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
19820 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
19830 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
19840 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
19850 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
19860 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
19870 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
19880 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
19890 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
198a0 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
198b0 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
198c0 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
198d0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
198e0 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
198f0 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
19900 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
19910 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
19920 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
19930 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
19940 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
19950 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
19960 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
19970 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
19980 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
19990 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
199a0 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
199b0 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
199c0 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
199d0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
199e0 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
199f0 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
19a00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
19a10 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
19a20 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
19a30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
19a40 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
19a50 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
19a60 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
19a70 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
19a80 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
19a90 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
19aa0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
19ab0 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
19ac0 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
19ad0 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19af0 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
19b00 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
19b10 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
19b20 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
19b30 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
19b40 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
19b50 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
19b60 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
19b70 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
19b80 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
19b90 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
19ba0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
19bb0 61 79 6c 6f 61 64 3b 0a 20 20 42 74 72 65 65 20  ayload;.  Btree 
19bc0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
19bd0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
19be0 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
19bf0 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66  eader;.  CellInf
19c00 6f 20 69 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 46 69  o info;..  /* Fi
19c10 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
19c20 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
19c30 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   0;.  if( !pPage
19c40 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  ->leaf ){.    nH
19c50 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a  eader += 4;.  }.
19c60 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
19c70 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61  Data ){.    nHea
19c80 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
19c90 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
19ca0 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73  , nData);.  }els
19cb0 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  e{.    nData = 0
19cc0 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
19cd0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
19ce0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
19cf0 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 70  u64*)&nKey);.  p
19d00 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
19d10 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
19d20 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
19d30 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65  .nHeader==nHeade
19d40 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  r );.  assert( i
19d50 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29  nfo.nKey==nKey )
19d60 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
19d70 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61 20 29 3b  .nData==nData );
19d80 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
19d90 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
19da0 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
19db0 74 61 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ta;.  if( pPage-
19dc0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70  >intKey ){.    p
19dd0 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
19de0 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
19df0 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20     nData = 0;.  
19e00 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c  }else{.    nPayl
19e10 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20  oad += nKey;.   
19e20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
19e30 20 20 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a 20    nSrc = nKey;. 
19e40 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69   }.  *pnSize = i
19e50 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61  nfo.nSize;.  spa
19e60 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c  ceLeft = info.nL
19e70 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64  ocal;.  pPayload
19e80 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
19e90 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26  r];.  pPrior = &
19ea0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
19eb0 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28  flow];..  while(
19ec0 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20   nPayload>0 ){. 
19ed0 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
19ee0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
19ef0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
19f00 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
19f10 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
19f20 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
19f30 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
19f40 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
19f50 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  */.#endif.      
19f60 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67  rc = allocatePag
19f70 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26  e(pBt, &pOvfl, &
19f80 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76  pgnoOvfl, pgnoOv
19f90 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20  fl, 0);.#ifndef 
19fa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
19fb0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
19fc0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
19fd0 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
19fe0 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65  cuum, and the se
19ff0 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65  cond or subseque
1a000 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  nt.      ** over
1a010 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69  flow page is bei
1a020 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64  ng allocated, ad
1a030 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
1a040 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
1a050 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20      ** for that 
1a060 70 61 67 65 20 6e 6f 77 2e 20 54 68 65 20 65 6e  page now. The en
1a070 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
1a080 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1a090 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
1a0a0 20 61 64 64 65 64 20 6c 61 74 65 72 2c 20 62 79   added later, by
1a0b0 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28   the insertCell(
1a0c0 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 20  ) routine..     
1a0d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
1a0e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
1a0f0 20 70 67 6e 6f 50 74 72 6d 61 70 21 3d 30 20 26   pgnoPtrmap!=0 &
1a100 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1a110 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1a120 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
1a130 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  gnoOvfl, PTRMAP_
1a140 4f 56 45 52 46 4c 4f 57 32 2c 20 70 67 6e 6f 50  OVERFLOW2, pgnoP
1a150 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a  trmap);.      }.
1a160 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
1a170 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
1a180 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
1a190 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
1a1a0 2f 2a 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61  /* clearCell(pPa
1a1b0 67 65 2c 20 70 43 65 6c 6c 29 3b 20 2a 2f 0a 20  ge, pCell); */. 
1a1c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1a1d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a1e0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
1a1f0 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
1a200 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
1a210 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
1a220 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
1a230 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
1a240 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
1a250 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1a260 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
1a270 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
1a280 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
1a290 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
1a2a0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1a2b0 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
1a2c0 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
1a2d0 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
1a2e0 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
1a2f0 66 74 3b 0a 20 20 20 20 69 66 28 20 6e 3e 6e 53  ft;.    if( n>nS
1a300 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
1a310 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
1a320 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
1a330 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
1a340 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
1a350 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
1a360 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
1a370 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
1a380 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
1a390 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
1a3a0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
1a3b0 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
1a3c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
1a3d0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
1a3e0 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
1a3f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1a400 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d 65  ** Change the Me
1a410 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70 6f  mPage.pParent po
1a420 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61 67  inter on the pag
1a430 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20 69  e whose number i
1a440 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  s.** given in th
1a450 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1a460 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61 67  t so that MemPag
1a470 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  e.pParent holds 
1a480 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69  the.** pointer i
1a490 6e 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  n the third argu
1a4a0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1a4b0 69 6e 74 20 72 65 70 61 72 65 6e 74 50 61 67 65  int reparentPage
1a4c0 28 42 74 72 65 65 20 2a 70 42 74 2c 20 50 67 6e  (Btree *pBt, Pgn
1a4d0 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20  o pgno, MemPage 
1a4e0 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e 74  *pNewParent, int
1a4f0 20 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65   idx){.  MemPage
1a500 20 2a 70 54 68 69 73 3b 0a 20 20 75 6e 73 69 67   *pThis;.  unsig
1a510 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b  ned char *aData;
1a520 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ..  if( pgno==0 
1a530 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1a540 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  OK;.  assert( pB
1a550 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
1a560 20 20 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65    aData = sqlite
1a570 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 42  3pager_lookup(pB
1a580 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
1a590 3b 0a 20 20 69 66 28 20 61 44 61 74 61 20 29 7b  ;.  if( aData ){
1a5a0 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d 65  .    pThis = (Me
1a5b0 6d 50 61 67 65 2a 29 26 61 44 61 74 61 5b 70 42  mPage*)&aData[pB
1a5c0 74 2d 3e 70 73 41 6c 69 67 6e 65 64 5d 3b 0a 20  t->psAligned];. 
1a5d0 20 20 20 61 73 73 65 72 74 28 20 70 54 68 69 73     assert( pThis
1a5e0 2d 3e 61 44 61 74 61 3d 3d 61 44 61 74 61 20 29  ->aData==aData )
1a5f0 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69 73 2d  ;.    if( pThis-
1a600 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20  >isInit ){.     
1a610 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72   if( pThis->pPar
1a620 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20  ent!=pNewParent 
1a630 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1a640 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20  This->pParent ) 
1a650 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
1a660 65 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65 6e  ef(pThis->pParen
1a670 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  t->aData);.     
1a680 20 20 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e     pThis->pParen
1a690 74 20 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a  t = pNewParent;.
1a6a0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1a6b0 50 61 72 65 6e 74 20 29 20 73 71 6c 69 74 65 33  Parent ) sqlite3
1a6c0 70 61 67 65 72 5f 72 65 66 28 70 4e 65 77 50 61  pager_ref(pNewPa
1a6d0 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20  rent->aData);.  
1a6e0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 68 69      }.      pThi
1a6f0 73 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 69  s->idxParent = i
1a700 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dx;.    }.    sq
1a710 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1a720 28 61 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 23 69  (aData);.  }..#i
1a730 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a740 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
1a750 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1a760 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  um ){.    return
1a770 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1a780 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
1a790 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e  EE, pNewParent->
1a7a0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  pgno);.  }.#endi
1a7b0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
1a7c0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
1a7d0 20 43 68 61 6e 67 65 20 74 68 65 20 70 50 61 72   Change the pPar
1a7e0 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61  ent pointer of a
1a7f0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
1a800 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 62 61  Page to point ba
1a810 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a  ck.** to pPage..
1a820 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
1a830 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72 79 20  ords, for every 
1a840 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2c 20  child of pPage, 
1a850 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e 74 50  invoke reparentP
1a860 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65  age().** to make
1a870 20 73 75 72 65 20 74 68 61 74 20 65 61 63 68 20   sure that each 
1a880 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74  child knows that
1a890 20 70 50 61 67 65 20 69 73 20 69 74 73 20 70 61   pPage is its pa
1a8a0 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rent..**.** This
1a8b0 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
1a8c0 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75 20 6d  lled after you m
1a8d0 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61 67 65  emcpy() one page
1a8e0 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72   into.** another
1a8f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a900 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
1a910 65 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  es(MemPage *pPag
1a920 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42  e){.  int i;.  B
1a930 74 72 65 65 20 2a 70 42 74 20 3d 20 70 50 61 67  tree *pBt = pPag
1a940 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  e->pBt;.  int rc
1a950 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1a960 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1a970 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1a980 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  _OK;..  for(i=0;
1a990 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
1a9a0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
1a9b0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1a9c0 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
1a9d0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1a9e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  ){.      rc = re
1a9f0 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20  parentPage(pBt, 
1aa00 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
1aa10 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20   pPage, i);.    
1aa20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1aa30 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1aa40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1aa50 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1aa60 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65  .    rc = repare
1aa70 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  ntPage(pBt, get4
1aa80 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1aa90 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1aaa0 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20  set+8]), .      
1aab0 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20   pPage, i);.    
1aac0 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
1aad0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1aae0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1aaf0 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
1ab00 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
1ab10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
1ab20 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
1ab30 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
1ab40 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
1ab50 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
1ab60 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
1ab70 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
1ab80 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
1ab90 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
1aba0 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
1abb0 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
1abc0 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
1abd0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
1abe0 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
1abf0 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
1ac00 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
1ac10 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
1ac20 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
1ac30 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
1ac40 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
1ac50 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69  dx, int sz){.  i
1ac60 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
1ac70 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1ac80 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
1ac90 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
1aca0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
1acb0 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
1acc0 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
1acd0 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
1ace0 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
1acf0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
1ad00 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
1ad10 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
1ad20 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61  n data[] */..  a
1ad30 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
1ad40 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
1ad50 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
1ad60 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
1ad70 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
1ad80 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65  ert( sqlite3page
1ad90 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70 50  r_iswriteable(pP
1ada0 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20  age->aData) );. 
1adb0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
1adc0 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
1add0 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
1ade0 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
1adf0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
1ae00 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ptr);.  assert( 
1ae10 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d  pc>10 && pc+sz<=
1ae20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
1ae30 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65  leSize );.  free
1ae40 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
1ae50 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64   sz);.  for(i=id
1ae60 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  x+1; i<pPage->nC
1ae70 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32  ell; i++, ptr+=2
1ae80 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  ){.    ptr[0] = 
1ae90 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b  ptr[2];.    ptr[
1aea0 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d  1] = ptr[3];.  }
1aeb0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
1aec0 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  -;.  put2byte(&d
1aed0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1aee0 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
1aef0 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
1af00 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70  >nFree += 2;.  p
1af10 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
1af20 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   1;.}../*.** Ins
1af30 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
1af40 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
1af50 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
1af60 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
1af70 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
1af80 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
1af90 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
1afa0 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
1afb0 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
1afc0 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
1afd0 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
1afe0 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
1aff0 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
1b000 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
1b010 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
1b020 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
1b030 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
1b040 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
1b050 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
1b060 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20  ge->aOvfl[] and 
1b070 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
1b080 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
1b090 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
1b0a0 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
1b0b0 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
1b0c0 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
1b0d0 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
1b0e0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
1b0f0 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
1b100 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
1b110 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
1b120 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
1b130 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
1b140 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
1b150 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
1b160 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
1b170 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
1b180 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
1b190 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
1b1a0 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
1b1b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1b1c0 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
1b1d0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
1b1e0 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
1b1f0 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
1b200 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
1b210 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
1b220 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
1b230 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
1b240 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72  static int inser
1b250 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
1b260 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
1b270 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
1b280 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
1b290 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
1b2a0 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
1b2b0 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
1b2c0 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
1b2d0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
1b2e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
1b2f0 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
1b300 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
1b310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
1b320 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
1b330 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
1b340 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
1b350 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
1b360 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
1b370 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75  if needed */.  u
1b380 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20  8 nSkip         
1b390 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65   /* Do not write
1b3a0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
1b3b0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
1b3c0 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ll */.){.  int i
1b3d0 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
1b3e0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
1b3f0 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
1b400 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
1b410 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
1b420 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1b430 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
1b440 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1b450 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74   byte of content
1b460 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e   for any cell in
1b470 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
1b480 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f   end;          /
1b490 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
1b4a0 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  t the last cell 
1b4b0 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
1b4c0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20  ] */.  int ins; 
1b4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1b4e0 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72  x in data[] wher
1b4f0 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  e new cell point
1b500 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a  er is inserted *
1b510 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
1b520 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1b530 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74  into data[] of t
1b540 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
1b550 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
1b560 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73  et;   /* Address
1b570 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70   of first cell p
1b580 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
1b590 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
1b5a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1b5b0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
1b5c0 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ole page */.  u8
1b5d0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20   *ptr;          
1b5e0 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69  /* Used for movi
1b5f0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
1b600 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20  round in data[] 
1b610 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  */..  assert( i>
1b620 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
1b630 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
1b640 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
1b650 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
1b660 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
1b670 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1b680 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72  qlite3pager_iswr
1b690 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 61  iteable(pPage->a
1b6a0 44 61 74 61 29 20 29 3b 0a 20 20 69 66 28 20 70  Data) );.  if( p
1b6b0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
1b6c0 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e  || sz+2>pPage->n
1b6d0 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Free ){.    if( 
1b6e0 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d  pTemp ){.      m
1b6f0 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69  emcpy(pTemp+nSki
1b700 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  p, pCell+nSkip, 
1b710 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20  sz-nSkip);.     
1b720 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
1b730 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
1b740 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
1b750 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
1b760 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
1b770 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67  vfl)/sizeof(pPag
1b780 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a  e->aOvfl[0]) );.
1b790 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
1b7a0 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c  [j].pCell = pCel
1b7b0 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  l;.    pPage->aO
1b7c0 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a  vfl[j].idx = i;.
1b7d0 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
1b7e0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1b7f0 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
1b800 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20  >aData;.    hdr 
1b810 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
1b820 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  et;.    top = ge
1b830 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
1b840 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  +5]);.    cellOf
1b850 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
1b860 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
1b870 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
1b880 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   2*pPage->nCell 
1b890 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63  + 2;.    ins = c
1b8a0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b  ellOffset + 2*i;
1b8b0 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74  .    if( end > t
1b8c0 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20  op - sz ){.     
1b8d0 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
1b8e0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 6f  pPage);.      to
1b8f0 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
1b900 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
1b910 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20    assert( end + 
1b920 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20  sz <= top );.   
1b930 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c   }.    idx = all
1b940 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
1b950 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72  , sz);.    asser
1b960 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20  t( idx>0 );.    
1b970 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67  assert( end <= g
1b980 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
1b990 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61  r+5]) );.    pPa
1b9a0 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
1b9b0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
1b9c0 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   2;.    memcpy(&
1b9d0 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c  data[idx+nSkip],
1b9e0 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
1b9f0 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72  -nSkip);.    for
1ba00 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64  (j=end-2, ptr=&d
1ba10 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a  ata[j]; j>ins; j
1ba20 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20  -=2, ptr-=2){.  
1ba30 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
1ba40 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b  [-2];.      ptr[
1ba50 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20  1] = ptr[-1];.  
1ba60 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
1ba70 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
1ba80 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
1ba90 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
1baa0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
1bab0 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
1bac0 20 3d 20 31 3b 0a 20 20 20 20 70 61 67 65 49 6e   = 1;.    pageIn
1bad0 74 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a  tegrity(pPage);.
1bae0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1baf0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1bb00 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
1bb10 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1bb20 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
1bb30 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
1bb40 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
1bb50 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
1bb60 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
1bb70 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
1bb80 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
1bb90 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
1bba0 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
1bbb0 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  */.      CellInf
1bbc0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 70 61  o info;.      pa
1bbd0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
1bbe0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
1bbf0 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f  .      if( (info
1bc00 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
1bc10 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
1bc20 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  y))>info.nLocal 
1bc30 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
1bc40 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62  pgnoOvfl = get4b
1bc50 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
1bc60 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
1bc70 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 70 74       int rc = pt
1bc80 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
1bc90 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54  Bt, pgnoOvfl, PT
1bca0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
1bcb0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
1bcc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1bcd0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1bce0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1bcf0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
1bd00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bd10 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
1bd20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20  a list of cells 
1bd30 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  to a page.  The 
1bd40 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69  page should be i
1bd50 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a  nitially empty..
1bd60 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65  ** The cells are
1bd70 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66   guaranteed to f
1bd80 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  it on the page..
1bd90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1bda0 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d  ssemblePage(.  M
1bdb0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
1bdc0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
1bdd0 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f  be assemblied */
1bde0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
1bdf0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1be00 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
1be10 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
1be20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
1be30 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
1be40 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
1be50 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 53 69 7a  s */.  int *aSiz
1be60 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
1be70 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
1be80 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
1be90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1bea0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
1beb0 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20  t totalSize;    
1bec0 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
1bed0 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20   all cells */.  
1bee0 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
1bef0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61    /* Index of pa
1bf00 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
1bf10 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20  nt cellptr;     
1bf20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
1bf30 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ext cell pointer
1bf40 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f   */.  int cellbo
1bf50 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  dy;     /* Addre
1bf60 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
1bf70 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61  body */.  u8 *da
1bf80 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ta;         /* D
1bf90 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
1bfa0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1bfb0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
1bfc0 3d 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a  =0 );.  totalSiz
1bfd0 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 0;.  for(i=0
1bfe0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1bff0 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b  .    totalSize +
1c000 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a  = aSize[i];.  }.
1c010 20 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53    assert( totalS
1c020 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61  ize+2*nCell<=pPa
1c030 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61  ge->nFree );.  a
1c040 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
1c050 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c  ell==0 );.  cell
1c060 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  ptr = pPage->cel
1c070 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  lOffset;.  data 
1c080 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
1c090 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
1c0a0 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32  drOffset;.  put2
1c0b0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
1c0c0 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 63 65 6c  ], nCell);.  cel
1c0d0 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65  lbody = allocate
1c0e0 53 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74  Space(pPage, tot
1c0f0 61 6c 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  alSize);.  asser
1c100 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b  t( cellbody>0 );
1c110 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1c120 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65  ->nFree >= 2*nCe
1c130 6c 6c 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ll );.  pPage->n
1c140 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b  Free -= 2*nCell;
1c150 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1c160 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
1c170 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  ut2byte(&data[ce
1c180 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79  llptr], cellbody
1c190 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
1c1a0 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61  ata[cellbody], a
1c1b0 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b  pCell[i], aSize[
1c1c0 69 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 70 74 72  i]);.    cellptr
1c1d0 20 2b 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62   += 2;.    cellb
1c1e0 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ody += aSize[i];
1c1f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
1c200 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e  ellbody==pPage->
1c210 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1c220 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
1c230 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a  l = nCell;.}../*
1c240 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1c250 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74  g parameters det
1c260 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20  ermine how many 
1c270 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67  adjacent pages g
1c280 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69  et involved.** i
1c290 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  n a balancing op
1c2a0 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20  eration.  NN is 
1c2b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65  the number of ne
1c2c0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
1c2d0 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65  r side.** of the
1c2e0 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69   page that parti
1c2f0 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
1c300 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
1c310 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a  n.  NB is the.**
1c320 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1c330 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74   pages that part
1c340 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69  icipate, includi
1c350 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61  ng the target pa
1c360 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69  ge and.** NN nei
1c370 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
1c380 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   side..**.** The
1c390 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f   minimum value o
1c3a0 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f  f NN is 1 (of co
1c3b0 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69  urse).  Increasi
1c3c0 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a  ng NN above 1.**
1c3d0 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76   (to 2 or 3) giv
1c3e0 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72  es a modest impr
1c3f0 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43  ovement in SELEC
1c400 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72  T and DELETE per
1c410 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65  formance.** in e
1c420 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61  xchange for a la
1c430 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e  rger degradation
1c440 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55   in INSERT and U
1c450 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  PDATE performanc
1c460 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  e..** The value 
1c470 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f  of NN appears to
1c480 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72   give the best r
1c490 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a  esults overall..
1c4a0 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20  */.#define NN 1 
1c4b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c4c0 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
1c4d0 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
1c4e0 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64  e of pPage */.#d
1c4f0 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31  efine NB (NN*2+1
1c500 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  )      /* Total 
1c510 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  pages involved i
1c520 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f  n the balance */
1c530 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
1c540 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
1c550 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d   int balance(Mem
1c560 50 61 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69  Page*, int);..#i
1c570 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c580 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f  T_QUICKBALANCE./
1c590 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
1c5a0 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68  n of balance() h
1c5b0 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f  andles the commo
1c5c0 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  n special case w
1c5d0 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e  here.** a new en
1c5e0 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73  try is being ins
1c5f0 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74  erted on the ext
1c600 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f  reme right-end o
1c610 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69  f the.** tree, i
1c620 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
1c630 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hen the new entr
1c640 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  y will become th
1c650 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74  e largest.** ent
1c660 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ry in the tree..
1c670 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66  **.** Instead of
1c680 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20   trying balance 
1c690 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74  the 3 right-most
1c6a0 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73   leaf pages, jus
1c6b0 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70  t add.** a new p
1c6c0 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  age to the right
1c6d0 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70  -hand side and p
1c6e0 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65  ut the one new e
1c6f0 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20  ntry in.** that 
1c700 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76  page.  This leav
1c710 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64  es the right sid
1c720 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f  e of the tree so
1c730 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61  mewhat.** unbala
1c740 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20  nced.  But odds 
1c750 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c  are that we will
1c760 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65   be inserting ne
1c770 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20  w entries.** at 
1c780 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74  the end soon aft
1c790 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e  erwards so the n
1c7a0 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65  early empty page
1c7b0 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a   will quickly.**
1c7c0 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76   fill up.  On av
1c7d0 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  erage..**.** pPa
1c7e0 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70  ge is the leaf p
1c7f0 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65  age which is the
1c800 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65   right-most page
1c810 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
1c820 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20   pParent is its 
1c830 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d  parent.  pPage m
1c840 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c  ust have a singl
1c850 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79  e overflow entry
1c860 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73  .** which is als
1c870 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
1c880 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61   entry on the pa
1c890 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
1c8a0 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  t balance_quick(
1c8b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1c8c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
1c8d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
1c8e0 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20  emPage *pNew;.  
1c8f0 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20  Pgno pgnoNew;.  
1c900 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74  u8 *pCell;.  int
1c910 20 73 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49   szCell;.  CellI
1c920 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 72 65  nfo info;.  Btre
1c930 65 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  e *pBt = pPage->
1c940 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e  pBt;.  int paren
1c950 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e  tIdx = pParent->
1c960 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72  nCell;   /* pPar
1c970 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72 20  ent new divider 
1c980 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
1c990 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20  int parentSize; 
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9b0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77    /* Size of new
1c9c0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
1c9d0 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c  .  u8 parentCell
1c9e0 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [64];           
1c9f0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
1ca00 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  r the new divide
1ca10 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  r cell */..  /* 
1ca20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
1ca30 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20  age. Insert the 
1ca40 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72  overflow cell fr
1ca50 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e  om pPage.  ** in
1ca60 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f  to it. Then remo
1ca70 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ve the overflow 
1ca80 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
1ca90 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
1caa0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 26  ocatePage(pBt, &
1cab0 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
1cac0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
1cad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cae0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1caf0 0a 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  pCell = pPage
1cb00 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c  ->aOvfl[0].pCell
1cb10 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c  ;.  szCell = cel
1cb20 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
1cb30 70 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61  pCell);.  zeroPa
1cb40 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e  ge(pNew, pPage->
1cb50 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73  aData[0]);.  ass
1cb60 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
1cb70 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
1cb80 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  ll);.  pPage->nO
1cb90 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
1cba0 2f 2a 20 53 65 74 20 74 68 65 20 70 61 72 65 6e  /* Set the paren
1cbb0 74 20 6f 66 20 74 68 65 20 6e 65 77 6c 79 20 61  t of the newly a
1cbc0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 74 6f  llocated page to
1cbd0 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70   pParent. */.  p
1cbe0 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  New->pParent = p
1cbf0 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65  Parent;.  sqlite
1cc00 33 70 61 67 65 72 5f 72 65 66 28 70 50 61 72 65  3pager_ref(pPare
1cc10 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 2f  nt->aData);..  /
1cc20 2a 20 70 50 61 67 65 20 69 73 20 63 75 72 72 65  * pPage is curre
1cc30 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63  ntly the right-c
1cc40 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e  hild of pParent.
1cc50 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20 20 2a   Change this.  *
1cc60 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 69  * so that the ri
1cc70 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65  ght-child is the
1cc80 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61   new page alloca
1cc90 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20  ted above and.  
1cca0 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
1ccb0 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68  next-to-right ch
1ccc0 69 6c 64 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  ild. .  */.  ass
1ccd0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
1cce0 6c 3e 30 20 29 3b 0a 20 20 70 61 72 73 65 43 65  l>0 );.  parseCe
1ccf0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  llPtr(pPage, fin
1cd00 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
1cd10 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 2c 20 26 69  ge->nCell-1), &i
1cd20 6e 66 6f 29 3b 0a 20 20 72 63 20 3d 20 66 69 6c  nfo);.  rc = fil
1cd30 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lInCell(pParent,
1cd40 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20   parentCell, 0, 
1cd50 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c  info.nKey, 0, 0,
1cd60 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20   &parentSize);. 
1cd70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1cd80 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1cd90 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1cda0 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34  t( parentSize<64
1cdb0 20 29 3b 0a 20 20 72 63 20 3d 20 69 6e 73 65 72   );.  rc = inser
1cdc0 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  tCell(pParent, p
1cdd0 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e 74  arentIdx, parent
1cde0 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65  Cell, parentSize
1cdf0 2c 20 30 2c 20 34 29 3b 0a 20 20 69 66 28 20 72  , 0, 4);.  if( r
1ce00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ce10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ce20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 66 69   }.  put4byte(fi
1ce30 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
1ce40 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78  Parent,parentIdx
1ce50 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ), pPage->pgno);
1ce60 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
1ce70 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
1ce80 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
1ce90 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69  ], pgnoNew);..#i
1cea0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ceb0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
1cec0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1ced0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1cee0 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
1cef0 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a   pointer map.  *
1cf00 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
1cf10 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
1cf20 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
1cf30 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20   from the .  ** 
1cf40 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
1cf50 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
1cf60 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
1cf70 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1cf80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   ){.    rc = ptr
1cf90 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
1cfa0 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
1cfb0 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
1cfc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1cfd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cfe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1cff0 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d   }.    rc = ptrm
1d000 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20  apPutOvfl(pNew, 
1d010 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
1d020 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d030 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d040 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1d050 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
1d060 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
1d070 65 20 6e 65 77 20 70 61 67 65 20 61 6e 64 20 62  e new page and b
1d080 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
1d090 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e 20  t page,.  ** in 
1d0a0 63 61 73 65 20 74 68 65 20 64 69 76 69 64 65 72  case the divider
1d0b0 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 63   cell inserted c
1d0c0 61 75 73 65 64 20 69 74 20 74 6f 20 62 65 63 6f  aused it to beco
1d0d0 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a  me overfull..  *
1d0e0 2f 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  /.  releasePage(
1d0f0 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
1d100 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c  balance(pParent,
1d110 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   0);.}.#endif /*
1d120 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
1d130 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a  CKBALANCE */../*
1d140 0a 2a 2a 20 54 68 65 20 49 53 41 55 54 4f 56 41  .** The ISAUTOVA
1d150 43 55 55 4d 20 6d 61 63 72 6f 20 69 73 20 75 73  CUUM macro is us
1d160 65 64 20 77 69 74 68 69 6e 20 62 61 6c 61 6e 63  ed within balanc
1d170 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 64  e_nonroot() to d
1d180 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 69 66 20 74  etermine.** if t
1d190 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
1d1a0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
1d1b0 20 6f 72 20 6e 6f 74 2e 20 42 65 63 61 75 73 65   or not. Because
1d1c0 20 69 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 77   it is used.** w
1d1d0 69 74 68 69 6e 20 61 6e 20 65 78 70 72 65 73 73  ithin an express
1d1e0 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6e 20 61  ion that is an a
1d1f0 72 67 75 6d 65 6e 74 20 74 6f 20 61 6e 6f 74 68  rgument to anoth
1d200 65 72 20 6d 61 63 72 6f 20 0a 2a 2a 20 28 73 71  er macro .** (sq
1d210 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 29 2c 20  liteMallocRaw), 
1d220 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
1d230 6c 65 20 74 6f 20 75 73 65 20 63 6f 6e 64 69 74  le to use condit
1d240 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61 74 69 6f  ional compilatio
1d250 6e 2e 0a 2a 2a 20 53 6f 2c 20 74 68 69 73 20 6d  n..** So, this m
1d260 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 20  acro is defined 
1d270 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 23 69 66 6e  instead..*/.#ifn
1d280 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d290 41 55 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69  AUTOVACUUM.#defi
1d2a0 6e 65 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  ne ISAUTOVACUUM 
1d2b0 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
1d2c0 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
1d2d0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 30 0a 23  ISAUTOVACUUM 0.#
1d2e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1d2f0 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
1d300 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e  ributes Cells on
1d310 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
1d320 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a   NN*2 siblings.*
1d330 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68  * of pPage so th
1d340 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  at all pages hav
1d350 65 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65  e about the same
1d360 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20   amount of free 
1d370 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c  space..** Usuall
1d380 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  y NN siblings on
1d390 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
1d3a0 70 50 61 67 65 20 69 73 20 75 73 65 64 20 69 6e  pPage is used in
1d3b0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a   the balancing,.
1d3c0 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73  ** though more s
1d3d0 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f  iblings might co
1d3e0 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  me from one side
1d3f0 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65   if pPage is the
1d400 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73   first.** or las
1d410 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
1d420 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65  arent.  If pPage
1d430 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
1d440 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  2*NN siblings.**
1d450 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
1d460 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
1d470 6e 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68  n if pPage is th
1d480 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61  e root page or a
1d490 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f   .** child of ro
1d4a0 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61  ot) then all ava
1d4b0 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20  ilable siblings 
1d4c0 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
1d4d0 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a  he balancing..**
1d4e0 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
1d4f0 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50  f siblings of pP
1d500 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  age might be inc
1d510 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61  reased or decrea
1d520 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a  sed by one or.**
1d530 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
1d540 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
1d550 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
1d560 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54  not over full. T
1d570 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  he root page.** 
1d580 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69  is special and i
1d590 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  s allowed to be 
1d5a0 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66  nearly empty. If
1d5b0 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68   pPage is .** th
1d5c0 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  e root page, the
1d5d0 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74  n the depth of t
1d5e0 68 65 20 74 72 65 65 20 6d 69 67 68 74 20 62 65  he tree might be
1d5f0 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72   increased.** or
1d600 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e   decreased by on
1d610 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c  e, as necessary,
1d620 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f   to keep the roo
1d630 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e  t page from bein
1d640 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72  g.** overfull or
1d650 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
1d660 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  y..**.** Note th
1d670 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  at when this rou
1d680 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1d690 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  some of the Cell
1d6a0 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69  s on pPage.** mi
1d6b0 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
1d6c0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50   be stored in pP
1d6d0 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54  age->aData[].  T
1d6e0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
1d6f0 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
1d700 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74   overfull.  Part
1d710 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74   of the job of t
1d720 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
1d730 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61  o.** make sure a
1d740 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61  ll Cells for pPa
1d750 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69  ge once again fi
1d760 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  t in pPage->aDat
1d770 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  a[]..**.** In th
1d780 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61  e course of bala
1d790 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e  ncing the siblin
1d7a0 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  gs of pPage, the
1d7b0 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65   parent of pPage
1d7c0 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65  .** might become
1d7d0 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
1d7e0 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74  erfull.  If that
1d7f0 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74   happens, then t
1d800 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
1d810 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
1d820 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65  vely on the pare
1d830 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
1d840 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
1d850 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
1d860 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74  it might leave t
1d870 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
1d880 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74  n a corrupted st
1d890 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  ate.  So if this
1d8a0 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20   routine fails, 
1d8b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
1d8c0 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64  uld.** be rolled
1d8d0 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
1d8e0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e   int balance_non
1d8f0 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50  root(MemPage *pP
1d900 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
1d910 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  *pParent;       
1d920 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
1d930 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  nt of pPage */. 
1d940 20 42 74 72 65 65 20 2a 70 42 74 3b 20 20 20 20   Btree *pBt;    
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d960 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
1d970 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
1d980 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
1d990 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d9a0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 43 65 6c  of cells in aCel
1d9b0 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  l[] */.  int nOl
1d9c0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1d9d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d9e0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
1d9f0 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  d[] */.  int nNe
1da00 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
1da10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1da20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
1da30 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69  w[] */.  int nDi
1da40 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1da50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1da60 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69  of cells in apDi
1da70 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  v[] */.  int i, 
1da80 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
1da90 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1daa0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
1dab0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
1dac0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1dad0 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50  x of pPage in pP
1dae0 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
1daf0 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20  /.  int nxDiv;  
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72   /* Next divider
1db20 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74   slot in pParent
1db30 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
1db40 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1db50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1db60 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
1db70 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72  /.  int leafCorr
1db80 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ection;         
1db90 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69   /* 4 if pPage i
1dba0 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
1dbb0 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  not */.  int lea
1dbc0 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  fData;          
1dbd0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1dbe0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
1dbf0 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74   of a LEAFDATA t
1dc00 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
1dc10 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20  bleSpace;       
1dc20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69        /* Bytes i
1dc30 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74  n pPage beyond t
1dc40 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  he header */.  i
1dc50 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20  nt pageFlags;   
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1dc70 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  alue of pPage->a
1dc80 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74  Data[0] */.  int
1dc90 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20   subtotal;      
1dca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
1dcb0 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69  total of bytes i
1dcc0 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70  n cells on one p
1dcd0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70  age */.  int iSp
1dce0 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
1dcf0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
1dd00 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53  nused byte of aS
1dd10 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pace[] */.  int 
1dd20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20 20  mxCellPerPage;  
1dd30 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
1dd40 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  mum number of ce
1dd50 6c 6c 73 20 69 6e 20 6f 6e 65 20 70 61 67 65 20  lls in one page 
1dd60 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
1dd70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
1dd80 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
1dd90 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
1dda0 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
1ddb0 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
1ddc0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
1ddd0 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
1dde0 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  e in apOld[] */.
1ddf0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70    MemPage *apCop
1de00 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f  y[NB];         /
1de10 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73  * Private copies
1de20 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65   of apOld[] page
1de30 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
1de40 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  apNew[NB+2];    
1de50 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
1de60 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e   up to NB siblin
1de70 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69  gs after balanci
1de80 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ng */.  Pgno pgn
1de90 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  oNew[NB+2];     
1dea0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
1deb0 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
1dec0 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  ge in apNew[] */
1ded0 0a 20 20 69 6e 74 20 69 64 78 44 69 76 5b 4e 42  .  int idxDiv[NB
1dee0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
1def0 2f 2a 20 49 6e 64 69 63 65 73 20 6f 66 20 64 69  /* Indices of di
1df00 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
1df10 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a  Parent */.  u8 *
1df20 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20  apDiv[NB];      
1df30 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
1df40 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
1df50 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
1df60 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
1df70 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1df80 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
1df90 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
1dfa0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
1dfb0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
1dfc0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
1dfd0 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
1dfe0 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
1dff0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
1e000 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1e010 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
1e020 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
1e030 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c  */.  int *szCell
1e040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e050 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
1e060 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
1e070 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
1e080 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20   *aCopy[NB];    
1e090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
1e0a0 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ace for holding 
1e0b0 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d  data of apCopy[]
1e0c0 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65   */.  u8 *aSpace
1e0d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e0e0 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
1e0f0 6f 6c 64 20 63 6f 70 69 65 73 20 6f 66 20 64 69  old copies of di
1e100 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
1e110 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e120 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1e130 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a   u8 *aFrom = 0;.
1e140 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 0a 20 20  #endif..  /* .  
1e150 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61 72 65  ** Find the pare
1e160 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  nt page..  */.  
1e170 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1e180 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
1e190 74 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t( sqlite3pager_
1e1a0 69 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  iswriteable(pPag
1e1b0 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 70  e->aData) );.  p
1e1c0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1e1d0 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61  .  pParent = pPa
1e1e0 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 73  ge->pParent;.  s
1e1f0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1e200 65 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  e(pParent->aData
1e210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1e220 72 65 6e 74 20 29 3b 0a 20 20 54 52 41 43 45 28  rent );.  TRACE(
1e230 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e  ("BALANCE: begin
1e240 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f   page %d child o
1e250 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  f %d\n", pPage->
1e260 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70  pgno, pParent->p
1e270 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20  gno));..#ifndef 
1e280 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
1e290 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20  KBALANCE.  /*.  
1e2a0 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61 73  ** A special cas
1e2b0 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74  e:  If a new ent
1e2c0 72 79 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ry has just been
1e2d0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61   inserted into a
1e2e0 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61  .  ** table (tha
1e2f0 74 20 69 73 2c 20 61 20 62 74 72 65 65 20 77 69  t is, a btree wi
1e300 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20  th integer keys 
1e310 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20  and all data at 
1e320 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a  the leaves).  **
1e330 20 61 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72   an the new entr
1e340 79 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  y is the right-m
1e350 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ost entry in the
1e360 20 74 72 65 65 20 28 69 74 20 68 61 73 20 74 68   tree (it has th
1e370 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b  e.  ** largest k
1e380 65 79 29 20 74 68 65 6e 20 75 73 65 20 74 68 65  ey) then use the
1e390 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65   special balance
1e3a0 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65  _quick() routine
1e3b0 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63   for.  ** balanc
1e3c0 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75  ing.  balance_qu
1e3d0 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61  ick() is much fa
1e3e0 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73  ster and results
1e3f0 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20   in a tighter.  
1e400 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61  ** packing of da
1e410 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ta in the common
1e420 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   case..  */.  if
1e430 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26  ( pPage->leaf &&
1e440 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  .      pPage->in
1e450 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70 50  tKey &&.      pP
1e460 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26  age->leafData &&
1e470 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  .      pPage->nO
1e480 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20  verflow==1 &&.  
1e490 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
1e4a0 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e  [0].idx==pPage->
1e4b0 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70  nCell &&.      p
1e4c0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70  Page->pParent->p
1e4d0 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20  gno!=1 &&.      
1e4e0 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
1e4f0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
1e500 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
1e510 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29  =pPage->pgno.  )
1e520 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
1e530 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20  TODO: Check the 
1e540 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20  siblings to the 
1e550 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49  left of pPage. I
1e560 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20  t may be that.  
1e570 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f    ** they are no
1e580 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65  t full and no ne
1e590 77 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  w page is requir
1e5a0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
1e5b0 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75  eturn balance_qu
1e5c0 69 63 6b 28 70 50 61 67 65 2c 20 70 50 61 72 65  ick(pPage, pPare
1e5d0 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nt);.  }.#endif.
1e5e0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
1e5f0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
1e600 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
1e610 20 20 2a 2f 0a 20 20 6d 78 43 65 6c 6c 50 65 72    */.  mxCellPer
1e620 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70  Page = MX_CELL(p
1e630 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20  Bt);.  apCell = 
1e640 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
1e650 20 0a 20 20 20 20 20 20 20 28 6d 78 43 65 6c 6c   .       (mxCell
1e660 50 65 72 50 61 67 65 2b 32 29 2a 4e 42 2a 28 73  PerPage+2)*NB*(s
1e670 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f  izeof(u8*)+sizeo
1e680 66 28 69 6e 74 29 29 0a 20 20 20 20 20 2b 20 73  f(int)).     + s
1e690 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2a 4e  izeof(MemPage)*N
1e6a0 42 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 73  B.     + pBt->ps
1e6b0 41 6c 69 67 6e 65 64 2a 28 35 2b 4e 42 29 0a 20  Aligned*(5+NB). 
1e6c0 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43      + (ISAUTOVAC
1e6d0 55 55 4d 20 3f 20 28 6d 78 43 65 6c 6c 50 65 72  UUM ? (mxCellPer
1e6e0 50 61 67 65 2b 32 29 2a 4e 4e 2a 32 20 3a 20 30  Page+2)*NN*2 : 0
1e6f0 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 61 70 43  ).  );.  if( apC
1e700 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ell==0 ){.    re
1e710 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1e720 4d 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20  M;.  }.  szCell 
1e730 3d 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b  = (int*)&apCell[
1e740 28 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 2b 32  (mxCellPerPage+2
1e750 29 2a 4e 42 5d 3b 0a 20 20 61 43 6f 70 79 5b 30  )*NB];.  aCopy[0
1e760 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c  ] = (u8*)&szCell
1e770 5b 28 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 2b  [(mxCellPerPage+
1e780 32 29 2a 4e 42 5d 3b 0a 20 20 66 6f 72 28 69 3d  2)*NB];.  for(i=
1e790 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20  1; i<NB; i++){. 
1e7a0 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61     aCopy[i] = &a
1e7b0 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70  Copy[i-1][pBt->p
1e7c0 73 41 6c 69 67 6e 65 64 2b 73 69 7a 65 6f 66 28  sAligned+sizeof(
1e7d0 4d 65 6d 50 61 67 65 29 5d 3b 0a 20 20 7d 0a 20  MemPage)];.  }. 
1e7e0 20 61 53 70 61 63 65 20 3d 20 26 61 43 6f 70 79   aSpace = &aCopy
1e7f0 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 73 41 6c  [NB-1][pBt->psAl
1e800 69 67 6e 65 64 2b 73 69 7a 65 6f 66 28 4d 65 6d  igned+sizeof(Mem
1e810 50 61 67 65 29 5d 3b 0a 23 69 66 6e 64 65 66 20  Page)];.#ifndef 
1e820 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1e830 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74  VACUUM.  if( pBt
1e840 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1e850 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70      aFrom = &aSp
1e860 61 63 65 5b 35 2a 70 42 74 2d 3e 70 73 41 6c 69  ace[5*pBt->psAli
1e870 67 6e 65 64 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69  gned];.  }.#endi
1e880 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  f.  .  /*.  ** F
1e890 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20  ind the cell in 
1e8a0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
1e8b0 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64  whose left child
1e8c0 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a   points back.  *
1e8d0 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65  * to pPage.  The
1e8e0 20 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20   "idx" variable 
1e8f0 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
1e900 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70  that cell.  If p
1e910 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65  Page.  ** is the
1e920 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64   rightmost child
1e930 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e   of pParent then
1e940 20 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72   set idx to pPar
1e950 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f  ent->nCell .  */
1e960 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  .  if( pParent->
1e970 69 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20  idxShift ){.    
1e980 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70  Pgno pgno;.    p
1e990 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
1e9a0 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
1e9b0 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 70 61 67 65  gno==sqlite3page
1e9c0 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 70 50 61  r_pagenumber(pPa
1e9d0 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20 20  ge->aData) );.  
1e9e0 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78    for(idx=0; idx
1e9f0 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b  <pParent->nCell;
1ea00 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69   idx++){.      i
1ea10 66 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  f( get4byte(find
1ea20 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 64  Cell(pParent, id
1ea30 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20  x))==pgno ){.   
1ea40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ea50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1ea60 73 65 72 74 28 20 69 64 78 3c 70 50 61 72 65 6e  sert( idx<pParen
1ea70 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20  t->nCell.       
1ea80 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79 74        || get4byt
1ea90 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
1eaa0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
1eab0 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29  fset+8])==pgno )
1eac0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1ead0 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50  dx = pPage->idxP
1eae0 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arent;.  }..  /*
1eaf0 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  ** Initialize
1eb00 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68   variables so th
1eb10 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61  at it will be sa
1eb20 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20  fe to jump.  ** 
1eb30 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61  directly to bala
1eb40 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61  nce_cleanup at a
1eb50 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  ny moment..  */.
1eb60 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20    nOld = nNew = 
1eb70 30 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  0;.  sqlite3page
1eb80 72 5f 72 65 66 28 70 50 61 72 65 6e 74 2d 3e 61  r_ref(pParent->a
1eb90 44 61 74 61 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  Data);..  /*.  *
1eba0 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70  * Find sibling p
1ebb0 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e  ages to pPage an
1ebc0 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70  d the cells in p
1ebd0 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76 69  Parent that divi
1ebe0 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c  de.  ** the sibl
1ebf0 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70  ings.  An attemp
1ec00 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e  t is made to fin
1ec10 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  d NN siblings on
1ec20 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64   either.  ** sid
1ec30 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72  e of pPage.  Mor
1ec40 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74  e siblings are t
1ec50 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69  aken from one si
1ec60 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a  de, however, if.
1ec70 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65    ** pPage there
1ec80 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20   are fewer than 
1ec90 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74  NN siblings on t
1eca0 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20  he other side.  
1ecb0 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20  If pParent.  ** 
1ecc0 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20  has NB or fewer 
1ecd0 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c  children then al
1ece0 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
1ecf0 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e  arent are taken.
1ed00 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20  .  */.  nxDiv = 
1ed10 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20  idx - NN;.  if( 
1ed20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61  nxDiv + NB > pPa
1ed30 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
1ed40 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65     nxDiv = pPare
1ed50 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b  nt->nCell - NB +
1ed60 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78   1;.  }.  if( nx
1ed70 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44  Div<0 ){.    nxD
1ed80 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44  iv = 0;.  }.  nD
1ed90 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  iv = 0;.  for(i=
1eda0 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42  0, k=nxDiv; i<NB
1edb0 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20  ; i++, k++){.   
1edc0 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e   if( k<pParent->
1edd0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
1ede0 64 78 44 69 76 5b 69 5d 20 3d 20 6b 3b 0a 20 20  dxDiv[i] = k;.  
1edf0 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66      apDiv[i] = f
1ee00 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
1ee10 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b   k);.      nDiv+
1ee20 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
1ee30 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20   !pParent->leaf 
1ee40 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64  );.      pgnoOld
1ee50 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61  [i] = get4byte(a
1ee60 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65  pDiv[i]);.    }e
1ee70 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65  lse if( k==pPare
1ee80 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
1ee90 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20     pgnoOld[i] = 
1eea0 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
1eeb0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
1eec0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1eed0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1eee0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1eef0 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
1ef00 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
1ef10 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69  Old[i], &apOld[i
1ef20 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  ], pParent);.   
1ef30 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
1ef40 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
1ef50 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64      apOld[i]->id
1ef60 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20  xParent = k;.   
1ef70 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a   apCopy[i] = 0;.
1ef80 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
1ef90 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b  Old );.    nOld+
1efa0 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  +;.  }..  /*.  *
1efb0 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
1efc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1efd0 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73 69  pPage and its si
1efe0 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64  blings into aOld
1eff0 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73  []..  ** The res
1f000 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
1f010 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
1f020 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
1f030 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61   rather.  ** tha
1f040 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
1f050 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f  ages since the o
1f060 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69  riginal pages wi
1f070 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a  ll be in the.  *
1f080 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
1f090 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  ng overwritten..
1f0a0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
1f0b0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
1f0c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61    MemPage *p = a
1f0d0 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50  pCopy[i] = (MemP
1f0e0 61 67 65 2a 29 26 61 43 6f 70 79 5b 69 5d 5b 70  age*)&aCopy[i][p
1f0f0 42 74 2d 3e 70 73 41 6c 69 67 6e 65 64 5d 3b 0a  Bt->psAligned];.
1f100 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26      p->aData = &
1f110 28 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70  ((u8*)p)[-pBt->p
1f120 73 41 6c 69 67 6e 65 64 5d 3b 0a 20 20 20 20 6d  sAligned];.    m
1f130 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20  emcpy(p->aData, 
1f140 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c  apOld[i]->aData,
1f150 20 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65 64 20   pBt->psAligned 
1f160 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  + sizeof(MemPage
1f170 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61  ));.    p->aData
1f180 20 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70 42   = &((u8*)p)[-pB
1f190 74 2d 3e 70 73 41 6c 69 67 6e 65 64 5d 3b 0a 20  t->psAligned];. 
1f1a0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f   }..  /*.  ** Lo
1f1b0 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
1f1c0 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
1f1d0 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
1f1e0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
1f1f0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
1f200 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
1f210 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
1f220 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
1f230 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
1f240 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
1f250 6f 72 6d 20 61 53 70 61 63 65 5b 5d 20 61 6e 64  orm aSpace[] and
1f260 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20   remove the the 
1f270 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20  divider Cells.  
1f280 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e  ** from pParent.
1f290 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
1f2a0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f  e siblings are o
1f2b0 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68  n leaf pages, th
1f2c0 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69  en the child poi
1f2d0 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a  nters of the.  *
1f2e0 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * divider cells 
1f2f0 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f  are stripped fro
1f300 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f  m the cells befo
1f310 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69  re they are copi
1f320 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70  ed.  ** into aSp
1f330 61 63 65 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ace[].  In this 
1f340 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
1f350 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
1f360 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
1f370 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
1f380 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
1f390 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
1f3a0 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
1f3b0 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
1f3c0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
1f3d0 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
1f3e0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
1f3f0 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
1f400 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
1f410 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
1f420 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
1f430 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
1f440 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
1f450 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
1f460 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
1f470 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
1f480 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
1f490 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
1f4a0 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  .  nCell = 0;.  
1f4b0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
1f4c0 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a   pPage->leaf*4;.
1f4d0 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61    leafData = pPa
1f4e0 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20  ge->leafData && 
1f4f0 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 66  pPage->leaf;.  f
1f500 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
1f510 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
1f520 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
1f530 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  [i];.    int lim
1f540 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
1f550 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
1f560 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1f570 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
1f580 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
1f590 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
1f5a0 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
1f5b0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
1f5c0 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
1f5d0 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
1f5e0 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  ell]);.#ifndef S
1f5f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1f600 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
1f610 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1f620 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
1f630 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b  ;.        aFrom[
1f640 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20 20  nCell] = i;.    
1f650 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70      for(a=0; a<p
1f660 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20  Old->nOverflow; 
1f670 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  a++){.          
1f680 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  if( pOld->aOvfl[
1f690 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c  a].pCell==apCell
1f6a0 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20  [nCell] ){.     
1f6b0 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65         aFrom[nCe
1f6c0 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20  ll] = 0xFF;.    
1f6d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1f6e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f6f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
1f700 64 69 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b  dif.      nCell+
1f710 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
1f720 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20   i<nOld-1 ){.   
1f730 20 20 20 69 6e 74 20 73 7a 20 3d 20 63 65 6c 6c     int sz = cell
1f740 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
1f750 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20   apDiv[i]);.    
1f760 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29    if( leafData )
1f770 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74  {.        /* Wit
1f780 68 20 74 68 65 20 4c 45 41 46 44 41 54 41 20 66  h the LEAFDATA f
1f790 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65 6c  lag, pParent cel
1f7a0 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54  ls hold only INT
1f7b0 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20 20 20  KEYs that.      
1f7c0 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63 61    ** are duplica
1f7d0 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74  tes of keys on t
1f7e0 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e 20  he child pages. 
1f7f0 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f   We need to remo
1f800 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ve.        ** th
1f810 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  e divider cells 
1f820 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62 75  from pParent, bu
1f830 74 20 74 68 65 20 64 69 76 69 64 65 72 73 20 63  t the dividers c
1f840 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20 20  ells are not.   
1f850 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f       ** added to
1f860 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73   apCell[] becaus
1f870 65 20 74 68 65 79 20 61 72 65 20 64 75 70 6c 69  e they are dupli
1f880 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20 63  cates of child c
1f890 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ells..        */
1f8a0 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
1f8b0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
1f8c0 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , sz);.      }el
1f8d0 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a  se{.        u8 *
1f8e0 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73  pTemp;.        s
1f8f0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73  zCell[nCell] = s
1f900 7a 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  z;.        pTemp
1f910 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63   = &aSpace[iSpac
1f920 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61  e];.        iSpa
1f930 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
1f940 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
1f950 3c 3d 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65 64  <=pBt->psAligned
1f960 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  *5 );.        me
1f970 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69  mcpy(pTemp, apDi
1f980 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20  v[i], sz);.     
1f990 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
1f9a0 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72   = pTemp+leafCor
1f9b0 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e 64 65 66  rection;.#ifndef
1f9c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1f9d0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20  OVACUUM.        
1f9e0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1f9f0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  uum ){.         
1fa00 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
1fa10 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a  0xFF;.        }.
1fa20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64  #endif.        d
1fa30 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
1fa40 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20   nxDiv, sz);.   
1fa50 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
1fa60 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63  l] -= leafCorrec
1fa70 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  tion;.        as
1fa80 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 70  sert( get4byte(p
1fa90 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69  Temp)==pgnoOld[i
1faa0 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ] );.        if(
1fab0 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a   !pOld->leaf ){.
1fac0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1fad0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
1fae0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
1faf0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f   /* The right po
1fb00 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
1fb10 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63  ld page pOld bec
1fb20 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20  omes the left.  
1fb30 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
1fb40 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  er of the divide
1fb50 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  r cell */.      
1fb60 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
1fb70 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
1fb80 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72  >aData[pOld->hdr
1fb90 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20  Offset+8], 4);. 
1fba0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1fbb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1fbc0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
1fbd0 34 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  4 );.        }. 
1fbe0 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a         nCell++;.
1fbf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1fc00 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
1fc10 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
1fc20 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
1fc30 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
1fc40 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
1fc50 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
1fc60 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
1fc70 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
1fc80 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
1fc90 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
1fca0 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
1fcb0 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
1fcc0 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
1fcd0 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
1fce0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
1fcf0 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
1fd00 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
1fd10 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
1fd20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
1fd30 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
1fd40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
1fd50 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
1fd60 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
1fd70 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
1fd80 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
1fd90 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
1fda0 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
1fdb0 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
1fdc0 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
1fdd0 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
1fde0 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
1fdf0 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
1fe00 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
1fe10 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
1fe20 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
1fe30 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
1fe40 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
1fe50 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
1fe60 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
1fe70 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
1fe80 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
1fe90 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
1fea0 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
1feb0 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
1fec0 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
1fed0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
1fee0 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
1fef0 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
1ff00 2b 2b 29 7b 0a 20 20 20 20 73 75 62 74 6f 74 61  ++){.    subtota
1ff10 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
1ff20 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
1ff30 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
1ff40 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
1ff50 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
1ff60 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
1ff70 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
1ff80 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
1ff90 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
1ffa0 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
1ffb0 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
1ffc0 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b    }.  }.  szNew[
1ffd0 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20  k] = subtotal;. 
1ffe0 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65   cntNew[k] = nCe
1fff0 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a  ll;.  k++;..  /*
20000 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e  .  ** The packin
20010 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  g computed by th
20020 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b  e previous block
20030 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72   is biased towar
20040 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20  d the siblings. 
20050 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20   ** on the left 
20060 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20  side.  The left 
20070 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77  siblings are alw
20080 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c  ays nearly full,
20090 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20   while the.  ** 
200a0 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
200b0 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72  ng might be near
200c0 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
200d0 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74  block of code at
200e0 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61  tempts.  ** to a
200f0 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e  djust the packin
20100 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f  g of siblings to
20110 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61   get a better ba
20120 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lance..  **.  **
20130 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
20140 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e   is more than an
20150 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
20160 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76  The packing abov
20170 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20  e might.  ** be 
20180 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63  so out of balanc
20190 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67  e as to be illeg
201a0 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  al.  For example
201b0 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  , the right-most
201c0 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69  .  ** sibling mi
201d0 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  ght be completel
201e0 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61  y empty.  This a
201f0 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74  djustment is not
20200 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a   optional..  */.
20210 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30    for(i=k-1; i>0
20220 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
20230 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b  szRight = szNew[
20240 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  i];  /* Size of 
20250 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72  sibling on the r
20260 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ight */.    int 
20270 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69  szLeft = szNew[i
20280 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20  -1]; /* Size of 
20290 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c  sibling on the l
202a0 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  eft */.    int r
202b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
202c0 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
202d0 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65  -most cell in le
202e0 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20  ft sibling */.  
202f0 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20    int d;        
20300 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
20310 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
20320 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68  the left of righ
20330 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20  t sibling */..  
20340 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
20350 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72  ] - 1;.    d = r
20360 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
20370 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69  .    while( szRi
20380 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68  ght==0 || szRigh
20390 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73  t+szCell[d]+2<=s
203a0 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d  zLeft-(szCell[r]
203b0 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52  +2) ){.      szR
203c0 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64  ight += szCell[d
203d0 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c  ] + 2;.      szL
203e0 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d  eft -= szCell[r]
203f0 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e   + 2;.      cntN
20400 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20  ew[i-1]--;.     
20410 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
20420 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20   - 1;.      d = 
20430 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
20440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65  ;.    }.    szNe
20450 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a  w[i] = szRight;.
20460 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d      szNew[i-1] =
20470 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 61   szLeft;.  }.  a
20480 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
20490 3e 30 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  >0 );..  /*.  **
204a0 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20   Allocate k new 
204b0 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c  pages.  Reuse ol
204c0 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f  d pages where po
204d0 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  ssible..  */.  a
204e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
204f0 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c  no>1 );.  pageFl
20500 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ags = pPage->aDa
20510 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
20520 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
20530 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
20540 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
20550 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
20560 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
20570 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  i];.      pgnoNe
20580 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69  w[i] = pgnoOld[i
20590 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69  ];.      apOld[i
205a0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  ] = 0;.      rc 
205b0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
205c0 72 69 74 65 28 70 4e 65 77 2d 3e 61 44 61 74 61  rite(pNew->aData
205d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
205e0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
205f0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
20600 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  e{.      rc = al
20610 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
20620 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b  &pNew, &pgnoNew[
20630 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d  i], pgnoNew[i-1]
20640 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
20650 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
20660 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
20670 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77   apNew[i] = pNew
20680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4e 65 77  ;.    }.    nNew
20690 2b 2b 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65  ++;.    zeroPage
206a0 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
206b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65  );.  }..  /* Fre
206c0 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
206d0 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
206e0 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
206f0 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
20700 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72   i<nOld ){.    r
20710 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f  c = freePage(apO
20720 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ld[i]);.    if( 
20730 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
20740 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
20750 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
20760 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
20770 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
20780 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
20790 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
207a0 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
207b0 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
207c0 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
207d0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
207e0 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
207f0 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
20800 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
20810 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
20820 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
20830 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
20840 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
20850 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
20860 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
20870 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
20880 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
20890 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
208a0 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
208b0 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
208c0 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
208d0 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
208e0 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
208f0 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
20900 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
20910 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
20920 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
20930 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
20940 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
20950 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
20960 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
20970 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
20980 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
20990 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
209a0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
209b0 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
209c0 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67     int minV = pg
209d0 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e  noNew[i];.    in
209e0 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20  t minI = i;.    
209f0 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20  for(j=i+1; j<k; 
20a00 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
20a10 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69  pgnoNew[j]<(unsi
20a20 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
20a30 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
20a40 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67         minV = pg
20a50 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20  noNew[j];.      
20a60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
20a70 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
20a80 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d  int t;.      Mem
20a90 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
20aa0 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  t = pgnoNew[i];.
20ab0 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
20ac0 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
20ad0 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b  ew[i] = pgnoNew[
20ae0 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
20af0 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
20b00 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  nI];.      pgnoN
20b10 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20  ew[minI] = t;.  
20b20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
20b30 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
20b40 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
20b50 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
20b60 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64    new: %d(%d) %d
20b70 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
20b80 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  d) %d(%d)\n",.  
20b90 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20    pgnoOld[0], . 
20ba0 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e     nOld>=2 ? pgn
20bb0 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  oOld[1] : 0,.   
20bc0 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f   nOld>=3 ? pgnoO
20bd0 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70  ld[2] : 0,.    p
20be0 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77  gnoNew[0], szNew
20bf0 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32  [0],.    nNew>=2
20c00 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20   ? pgnoNew[1] : 
20c10 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
20c20 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
20c30 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77  New>=3 ? pgnoNew
20c40 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  [2] : 0, nNew>=3
20c50 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
20c60 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70  .    nNew>=4 ? p
20c70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e  gnoNew[3] : 0, n
20c80 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
20c90 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
20ca0 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20  =5 ? pgnoNew[4] 
20cb0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73  : 0, nNew>=5 ? s
20cc0 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a  zNew[4] : 0));..
20cd0 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
20ce0 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
20cf0 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
20d00 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
20d10 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
20d20 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
20d30 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
20d40 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
20d50 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
20d60 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
20d70 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
20d80 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
20d90 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
20da0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
20db0 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
20dc0 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f  sert( pNew->pgno
20dd0 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a  ==pgnoNew[i] );.
20de0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
20df0 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
20e00 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
20e10 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
20e20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
20e30 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
20e40 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65  sert( pNew->nOve
20e50 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69 66  rflow==0 );..#if
20e60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20e70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20e80 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
20e90 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
20ea0 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
20eb0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
20ec0 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  tries.    ** tha
20ed0 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  t point to the s
20ee0 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72  iblings that wer
20ef0 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68  e rearranged. Th
20f00 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74  ese can be: left
20f10 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e  .    ** children
20f20 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72   of cells, the r
20f30 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68  ight-child of th
20f40 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66  e page, or overf
20f50 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a  low pages.    **
20f60 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63   pointed to by c
20f70 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ells..    */.   
20f80 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
20f90 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 66 6f  cuum ){.      fo
20fa0 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b  r(k=j; k<cntNew[
20fb0 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; k++){.      
20fc0 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d    if( aFrom[k]==
20fd0 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61  0xFF || apCopy[a
20fe0 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d  From[k]]->pgno!=
20ff0 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  pNew->pgno ){.  
21000 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
21010 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c  mapPutOvfl(pNew,
21020 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20   k-j);.         
21030 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21040 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21050 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
21060 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
21070 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
21080 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
21090 69 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e  if..    j = cntN
210a0 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
210b0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
210c0 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
210d0 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
210e0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
210f0 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
21100 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
21110 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
21120 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
21130 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26   if( i<nNew-1 &&
21140 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
21150 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
21160 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
21170 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
21180 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c    pCell = apCell
21190 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20  [j];.      sz = 
211a0 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66  szCell[j] + leaf
211b0 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
211c0 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
211d0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
211e0 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
211f0 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
21200 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
21210 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
21220 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 09  f( leafData ){..
21230 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
21240 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
21250 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
21260 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
21270 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
21280 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
21290 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
212a0 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
212b0 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
212c0 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
212d0 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
212e0 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
212f0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
21300 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
21310 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
21320 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
21330 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
21340 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
21350 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
21360 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70    j--;.        p
21370 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77  arseCellPtr(pNew
21380 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e  , apCell[j], &in
21390 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65  fo);.        pCe
213a0 6c 6c 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70  ll = &aSpace[iSp
213b0 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 66 69  ace];.        fi
213c0 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74  llInCell(pParent
213d0 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f  , pCell, 0, info
213e0 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 26 73 7a  .nKey, 0, 0, &sz
213f0 29 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63  );.        iSpac
21400 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  e += sz;.       
21410 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c   assert( iSpace<
21420 3d 70 42 74 2d 3e 70 73 41 6c 69 67 6e 65 64 2a  =pBt->psAligned*
21430 35 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  5 );.        pTe
21440 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
21450 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65  lse{.        pCe
21460 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll -= 4;.       
21470 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
21480 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20  [iSpace];.      
21490 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a    iSpace += sz;.
214a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
214b0 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 73 41  iSpace<=pBt->psA
214c0 6c 69 67 6e 65 64 2a 35 20 29 3b 0a 20 20 20 20  ligned*5 );.    
214d0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 69    }.      rc = i
214e0 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
214f0 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c  t, nxDiv, pCell,
21500 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a   sz, pTemp, 4);.
21510 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
21520 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
21530 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
21540 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
21550 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
21560 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20  pParent,nxDiv), 
21570 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66  pNew->pgno);.#if
21580 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21590 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
215a0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
215b0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
215c0 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74  atabase, and not
215d0 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
215e0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  e,.      ** then
215f0 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
21600 74 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e 20  ter map with an 
21610 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
21620 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
21630 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 65    ** that the ce
21640 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64  ll just inserted
21650 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20 61   points to (if a
21660 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ny)..      */.  
21670 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
21680 6f 56 61 63 75 75 6d 20 26 26 20 21 6c 65 61 66  oVacuum && !leaf
21690 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
216a0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
216b0 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  fl(pParent, nxDi
216c0 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  v);.        if( 
216d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
216e0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
216f0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
21700 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21710 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
21720 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  j++;.      nxDiv
21730 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
21740 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
21750 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46   );.  if( (pageF
21760 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29  lags & PTF_LEAF)
21770 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ==0 ){.    memcp
21780 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
21790 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 61 70 43  ->aData[8], &apC
217a0 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
217b0 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 7d 0a 20  ta[8], 4);.  }. 
217c0 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61 72   if( nxDiv==pPar
217d0 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65  ent->nCell+pPare
217e0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  nt->nOverflow ){
217f0 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
21800 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
21810 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  e right-most chi
21820 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f  ld of pParent */
21830 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
21840 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
21850 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
21860 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  +8], pgnoNew[nNe
21870 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w-1]);.  }else{.
21880 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73      /* Right-mos
21890 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65  t sibling is the
218a0 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74   left child of t
218b0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
218c0 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a  n pParent.    **
218d0 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74 2d   past the right-
218e0 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e 74  most divider ent
218f0 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  ry */.    put4by
21900 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
21910 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
21920 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  iv), pgnoNew[nNe
21930 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  w-1]);.  }..  /*
21940 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20 63  .  ** Reparent c
21950 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20 63  hildren of all c
21960 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ells..  */.  for
21970 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
21980 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70  +){.    rc = rep
21990 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
219a0 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 69  apNew[i]);.    i
219b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
219c0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
219d0 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 72  cleanup;.  }.  r
219e0 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
219f0 64 50 61 67 65 73 28 70 50 61 72 65 6e 74 29 3b  dPages(pParent);
21a00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
21a10 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
21a20 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20  nce_cleanup;..  
21a30 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20  /*.  ** Balance 
21a40 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
21a50 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
21a60 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70 50  current page (pP
21a70 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  age) might.  ** 
21a80 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20  have been added 
21a90 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
21aa0 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c  so it might no l
21ab0 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c  onger be initial
21ac0 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74  ized..  ** But t
21ad0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
21ae0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e  ill always be in
21af0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
21b00 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
21b10 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 2f  t->isInit );.  /
21b20 2a 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d  * assert( pPage-
21b30 3e 69 73 49 6e 69 74 20 29 3b 20 2f 2f 20 4e 6f  >isInit ); // No
21b40 21 20 70 50 61 67 65 20 6d 69 67 68 74 20 68 61  ! pPage might ha
21b50 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 74 6f  ve been added to
21b60 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 2f   freelist */.  /
21b70 2a 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28  * pageIntegrity(
21b80 70 50 61 67 65 29 3b 20 20 20 20 2f 2f 20 4e 6f  pPage);    // No
21b90 21 20 70 50 61 67 65 20 6d 69 67 68 74 20 68 61  ! pPage might ha
21ba0 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 74 6f  ve been added to
21bb0 20 66 72 65 65 6c 69 73 74 20 2a 2f 20 0a 20 20   freelist */ .  
21bc0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
21bd0 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f  rent, 0);.  .  /
21be0 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
21bf0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
21c00 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
21c10 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 46  eanup:.  sqliteF
21c20 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66  ree(apCell);.  f
21c30 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
21c40 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
21c50 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
21c60 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
21c70 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
21c80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
21c90 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  New[i]);.  }.  r
21ca0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65  eleasePage(pPare
21cb0 6e 74 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  nt);.  TRACE(("B
21cc0 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
21cd0 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64   with %d: old=%d
21ce0 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64   new=%d cells=%d
21cf0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
21d00 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64  Page->pgno, nOld
21d10 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b  , nNew, nCell));
21d20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21d30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
21d40 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
21d50 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  r the root page 
21d60 6f 66 20 61 20 62 74 72 65 65 20 77 68 65 6e 20  of a btree when 
21d70 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  the root.** page
21d80 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
21d90 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  ls.  This is an 
21da0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d  opportunity to m
21db0 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20  ake the tree.** 
21dc0 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65  shallower by one
21dd0 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
21de0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68  c int balance_sh
21df0 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65 20  allower(MemPage 
21e00 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61  *pPage){.  MemPa
21e10 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20  ge *pChild;     
21e20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
21e30 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f  nly child page o
21e40 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  f pPage */.  Pgn
21e50 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20  o pgnoChild;    
21e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
21e70 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68  e number for pCh
21e80 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ild */.  int rc 
21e90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
21ea0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
21eb0 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  code from subpro
21ec0 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 72  cedures */.  Btr
21ed0 65 65 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ee *pBt;        
21ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21ef0 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74 72 75   main BTree stru
21f00 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d  cture */.  int m
21f10 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20 20 20  xCellPerPage;   
21f20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
21f30 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  um number of cel
21f40 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f 0a 20  ls per page */. 
21f50 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20   u8 **apCell;   
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21f70 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20   All cells from 
21f80 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61  pages being bala
21f90 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 73  nced */.  int *s
21fa0 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zCell;          
21fb0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
21fc0 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
21fd0 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
21fe0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
21ff0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
22000 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
22010 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
22020 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65  >pBt;.  mxCellPe
22030 72 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28  rPage = MX_CELL(
22040 70 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d  pBt);.  apCell =
22050 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
22060 28 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 2a  ( mxCellPerPage*
22070 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a  (sizeof(u8*)+siz
22080 65 6f 66 28 69 6e 74 29 29 20 29 3b 0a 20 20 69  eof(int)) );.  i
22090 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72  f( apCell==0 ) r
220a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
220b0 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28  EM;.  szCell = (
220c0 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43  int*)&apCell[mxC
220d0 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20 69  ellPerPage];.  i
220e0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
220f0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  {.    /* The tab
22100 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  le is completely
22110 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54 52   empty */.    TR
22120 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 65  ACE(("BALANCE: e
22130 6d 70 74 79 20 74 61 62 6c 65 20 25 64 5c 6e 22  mpty table %d\n"
22140 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
22150 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
22160 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   The root page i
22170 73 20 65 6d 70 74 79 20 62 75 74 20 68 61 73 20  s empty but has 
22180 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e  one child.  Tran
22190 73 66 65 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  sfer the.    ** 
221a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
221b0 20 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64 20   that one child 
221c0 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  into the root pa
221d0 67 65 20 69 66 20 69 74 20 0a 20 20 20 20 2a 2a  ge if it .    **
221e0 20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69 73   will fit.  This
221f0 20 72 65 64 75 63 65 73 20 74 68 65 20 64 65 70   reduces the dep
22200 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 62  th of the tree b
22210 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  y one..    **.  
22220 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74    ** If the root
22230 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 2c   page is page 1,
22240 20 69 74 20 68 61 73 20 6c 65 73 73 20 73 70 61   it has less spa
22250 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 68 61  ce available tha
22260 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20 63 68 69  n.    ** its chi
22270 6c 64 20 28 64 75 65 20 74 6f 20 74 68 65 20 31  ld (due to the 1
22280 30 30 20 62 79 74 65 20 68 65 61 64 65 72 20 74  00 byte header t
22290 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  hat occurs at th
222a0 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  e beginning.    
222b0 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
222c0 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d  se fle), so it m
222d0 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c 65  ight not be able
222e0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20   to hold all of 
222f0 74 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f  the .    ** info
22300 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  rmation currentl
22310 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  y contained in t
22320 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74 68  he child.  If th
22330 69 73 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a  is is the .    *
22340 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20  * case, then do 
22350 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73  not do the trans
22360 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65  fer.  Leave page
22370 20 31 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a   1 empty except.
22380 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72      ** for the r
22390 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20  ight-pointer to 
223a0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  the child page. 
223b0 20 54 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   The child page 
223c0 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74  becomes.    ** t
223d0 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
223e0 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20 20  of the tree..   
223f0 20 2a 2f 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c   */.    pgnoChil
22400 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  d = get4byte(&pP
22410 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
22420 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
22430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
22440 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20  oChild>0 );.    
22450 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c  assert( pgnoChil
22460 64 3c 3d 73 71 6c 69 74 65 33 70 61 67 65 72 5f  d<=sqlite3pager_
22470 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d  pagecount(pPage-
22480 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 3b  >pBt->pPager) );
22490 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67  .    rc = getPag
224a0 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67  e(pPage->pBt, pg
224b0 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c 64  noChild, &pChild
224c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
224d0 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
224e0 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66  _balance;.    if
224f0 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  ( pPage->pgno==1
22500 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   ){.      rc = i
22510 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20  nitPage(pChild, 
22520 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
22530 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
22540 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
22550 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22560 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
22570 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
22580 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d   pChild->nFree>=
22590 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  100 ){.        /
225a0 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f  * The child info
225b0 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74  rmation will fit
225c0 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67   on the root pag
225d0 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20  e, so do the.   
225e0 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a       ** copy */.
225f0 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
22600 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28         zeroPage(
22610 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
22620 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
22630 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68    for(i=0; i<pCh
22640 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  ild->nCell; i++)
22650 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 65  {.          apCe
22660 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  ll[i] = findCell
22670 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20  (pChild,i);.    
22680 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20        szCell[i] 
22690 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43  = cellSizePtr(pC
226a0 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29  hild, apCell[i])
226b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
226c0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
226d0 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
226e0 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73  nCell, apCell, s
226f0 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zCell);.        
22700 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67 68  /* Copy the righ
22710 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t-pointer of the
22720 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61   child to the pa
22730 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rent. */.       
22740 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
22750 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
22760 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20  drOffset+8], .  
22770 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
22780 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74  te(&pChild->aDat
22790 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66  a[pChild->hdrOff
227a0 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
227b0 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
227c0 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  d);.        TRAC
227d0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
227e0 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20 74  ld %d transfer t
227f0 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  o page 1\n", pCh
22800 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
22810 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22820 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68    /* The child h
22830 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  as more informat
22840 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ion that will fi
22850 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20  t on the root.. 
22860 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72         ** The tr
22870 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62 61  ee is already ba
22880 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68  lanced.  Do noth
22890 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ing. */.        
228a0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
228b0 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e   child %d will n
228c0 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31  ot fit on page 1
228d0 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  \n", pChild->pgn
228e0 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o));.      }.   
228f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
22900 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74  mcpy(pPage->aDat
22910 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  a, pChild->aData
22920 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
22930 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
22940 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
22950 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
22960 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20  >pParent = 0;.  
22970 20 20 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67      rc = initPag
22980 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  e(pPage, 0);.   
22990 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
229a0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
229b0 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
229c0 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  d);.      TRACE(
229d0 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73  ("BALANCE: trans
229e0 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74  fer child %d int
229f0 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20  o root %d\n",.  
22a00 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68 69              pChi
22a10 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d  ld->pgno, pPage-
22a20 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20  >pgno));.    }. 
22a30 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
22a40 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 67 65  ChildPages(pPage
22a50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22a60 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
22a70 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
22a80 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
22a90 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
22aa0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
22ab0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
22ac0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
22ad0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
22ae0 7b 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  { .        rc = 
22af0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50  ptrmapPutOvfl(pP
22b00 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  age, i);.       
22b10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
22b30 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
22b40 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20  _balance;.      
22b50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22b60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
22b70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22b80 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
22b90 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 72  w_balance;.    r
22ba0 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
22bb0 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c  d);.  }.end_shal
22bc0 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73  low_balance:.  s
22bd0 71 6c 69 74 65 46 72 65 65 28 61 70 43 65 6c 6c  qliteFree(apCell
22be0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
22bf0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f  }.../*.** The ro
22c00 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  ot page is overf
22c10 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ull.**.** When t
22c20 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65  his happens, Cre
22c30 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20  ate a new child 
22c40 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68  page and copy th
22c50 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
22c60 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74   the root into t
22c70 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20  he child.  Then 
22c80 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  make the root.**
22c90 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70   page an empty p
22ca0 61 67 65 20 77 69 74 68 20 72 69 67 68 74 43 68  age with rightCh
22cb0 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ild pointing to 
22cc0 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64  the new.** child
22cd0 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c  .   Finally, cal
22ce0 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e  l balance_intern
22cf0 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  al() on the new 
22d00 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73  child.** to caus
22d10 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a  e it to split..*
22d20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
22d30 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50  ance_deeper(MemP
22d40 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
22d50 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22d60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
22d70 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  ue from subproce
22d80 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  dures */.  MemPa
22d90 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f  ge *pChild;    /
22da0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
22db0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
22dc0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
22dd0 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e  d;     /* Page n
22de0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
22df0 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
22e00 20 42 74 72 65 65 20 2a 70 42 74 3b 20 20 20 20   Btree *pBt;    
22e10 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
22e20 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
22e30 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f  eSize;     /* To
22e40 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20  tal usable size 
22e50 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75  of a page */.  u
22e60 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
22e70 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
22e80 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
22e90 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b   */.  u8 *cdata;
22ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
22eb0 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c  tent of the chil
22ec0 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
22ed0 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
22ee0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67  /* Offset to pag
22ef0 65 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65  e header in pare
22f00 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b  nt */.  int brk;
22f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22f20 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74  ffset to content
22f30 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69   of first cell i
22f40 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61  n parent */..  a
22f50 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50  ssert( pPage->pP
22f60 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  arent==0 );.  as
22f70 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
22f80 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42  erflow>0 );.  pB
22f90 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
22fa0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50    rc = allocateP
22fb0 61 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64  age(pBt, &pChild
22fc0 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50  , &pgnoChild, pP
22fd0 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  age->pgno, 0);. 
22fe0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
22ff0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
23000 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72  qlite3pager_iswr
23010 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e  iteable(pChild->
23020 61 44 61 74 61 29 20 29 3b 0a 20 20 75 73 61 62  aData) );.  usab
23030 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
23040 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61  ableSize;.  data
23050 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
23060 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
23070 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 62 72 6b  hdrOffset;.  brk
23080 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
23090 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61  a[hdr+5]);.  cda
230a0 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61  ta = pChild->aDa
230b0 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61  ta;.  memcpy(cda
230c0 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20  ta, &data[hdr], 
230d0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
230e0 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  t+2*pPage->nCell
230f0 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28  -hdr);.  memcpy(
23100 26 63 64 61 74 61 5b 62 72 6b 5d 2c 20 26 64 61  &cdata[brk], &da
23110 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  ta[brk], usableS
23120 69 7a 65 2d 62 72 6b 29 3b 0a 20 20 61 73 73 65  ize-brk);.  asse
23130 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e  rt( pChild->isIn
23140 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  it==0 );.  rc = 
23150 69 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c  initPage(pChild,
23160 20 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72   pPage);.  if( r
23170 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
23180 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e   memcpy(pChild->
23190 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f  aOvfl, pPage->aO
231a0 76 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  vfl, pPage->nOve
231b0 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61  rflow*sizeof(pPa
231c0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a  ge->aOvfl[0]));.
231d0 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
231e0 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76  low = pPage->nOv
231f0 65 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43  erflow;.  if( pC
23200 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
23210 29 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e  ){.    pChild->n
23220 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
23230 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
23240 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43  nCell==pPage->nC
23250 65 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ell );.  zeroPag
23260 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
23270 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46  >aData[0] & ~PTF
23280 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79  _LEAF);.  put4by
23290 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
232a0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
232b0 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29  t+8], pgnoChild)
232c0 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ;.  TRACE(("BALA
232d0 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25  NCE: copy root %
232e0 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50  d into %d\n", pP
232f0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c  age->pgno, pChil
23300 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64  d->pgno));.#ifnd
23310 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
23320 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
23330 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
23340 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
23350 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
23360 28 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67  (pBt, pChild->pg
23370 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
23380 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
23390 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
233a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 66 6f 72 28  urn rc;.    for(
233b0 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e  i=0; i<pChild->n
233c0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
233d0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
233e0 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20 69 29 3b  Ovfl(pChild, i);
233f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
23400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23410 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23420 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23430 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 62  .#endif.  rc = b
23440 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
23450 43 68 69 6c 64 29 3b 0a 20 20 72 65 6c 65 61 73  Child);.  releas
23460 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
23470 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23480 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69 66 20 74  *.** Decide if t
23490 68 65 20 70 61 67 65 20 70 50 61 67 65 20 6e 65  he page pPage ne
234a0 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63  eds to be balanc
234b0 65 64 2e 20 20 49 66 20 62 61 6c 61 6e 63 69 6e  ed.  If balancin
234c0 67 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64  g is.** required
234d0 2c 20 63 61 6c 6c 20 74 68 65 20 61 70 70 72 6f  , call the appro
234e0 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67  priate balancing
234f0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
23500 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
23510 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
23520 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20 20 69  int insert){.  i
23530 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23540 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  K;.  if( pPage->
23550 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20  pParent==0 ){.  
23560 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
23570 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20  erflow>0 ){.    
23580 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64    rc = balance_d
23590 65 65 70 65 72 28 70 50 61 67 65 29 3b 0a 20 20  eeper(pPage);.  
235a0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
235b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
235c0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  ge->nCell==0 ){.
235d0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
235e0 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50 61  ce_shallower(pPa
235f0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ge);.    }.  }el
23600 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  se{.    if( pPag
23610 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  e->nOverflow>0 |
23620 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69 6e 73  | .        (!ins
23630 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ert && pPage->nF
23640 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ree>pPage->pBt->
23650 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20  usableSize*2/3) 
23660 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
23670 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50  lance_nonroot(pP
23680 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
23690 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
236a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
236b0 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75  ne checks all cu
236c0 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74  rsors that point
236d0 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f   to table pgnoRo
236e0 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66  ot..** If any of
236f0 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 6f   those cursors o
23700 74 68 65 72 20 74 68 61 6e 20 70 45 78 63 6c 75  ther than pExclu
23710 64 65 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77  de were opened w
23720 69 74 68 20 0a 2a 2a 20 77 72 46 6c 61 67 3d 3d  ith .** wrFlag==
23730 30 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  0 then this rout
23740 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
23750 54 45 5f 4c 4f 43 4b 45 44 2e 20 20 49 66 20 61  TE_LOCKED.  If a
23760 6c 6c 0a 2a 2a 20 63 75 72 73 6f 72 73 20 74 68  ll.** cursors th
23770 61 74 20 70 6f 69 6e 74 20 74 6f 20 70 67 6e 6f  at point to pgno
23780 52 6f 6f 74 20 77 65 72 65 20 6f 70 65 6e 65 64  Root were opened
23790 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a   with wrFlag==1.
237a0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
237b0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
237c0 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ITE_OK..**.** In
237d0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 63 68 65   addition to che
237e0 63 6b 69 6e 67 20 66 6f 72 20 72 65 61 64 2d 6c  cking for read-l
237f0 6f 63 6b 73 20 28 77 68 65 72 65 20 61 20 72 65  ocks (where a re
23800 61 64 2d 6c 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e  ad-lock .** mean
23810 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65  s a cursor opene
23820 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  d with wrFlag==0
23830 29 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  ) this routine a
23840 6c 73 6f 20 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c  lso moves.** all
23850 20 63 75 72 73 6f 72 73 20 6f 74 68 65 72 20 74   cursors other t
23860 68 61 6e 20 70 45 78 63 6c 75 64 65 20 73 6f 20  han pExclude so 
23870 74 68 61 74 20 74 68 65 79 20 61 72 65 20 70 6f  that they are po
23880 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a  inting to the .*
23890 2a 20 66 69 72 73 74 20 43 65 6c 6c 20 6f 6e 20  * first Cell on 
238a0 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 69 73  root page.  This
238b0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
238c0 63 61 75 73 65 20 61 6e 20 69 6e 73 65 72 74 20  cause an insert 
238d0 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65 20 6d 69  .** or delete mi
238e0 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 6e  ght change the n
238f0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
23900 6e 20 61 20 70 61 67 65 20 6f 72 20 64 65 6c 65  n a page or dele
23910 74 65 0a 2a 2a 20 61 20 70 61 67 65 20 65 6e 74  te.** a page ent
23920 69 72 65 6c 79 20 61 6e 64 20 77 65 20 64 6f 20  irely and we do 
23930 6e 6f 74 20 77 61 6e 74 20 74 6f 20 6c 65 61 76  not want to leav
23940 65 20 61 6e 79 20 63 75 72 73 6f 72 73 20 0a 2a  e any cursors .*
23950 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6e 6f  * pointing to no
23960 6e 2d 65 78 69 73 74 61 6e 74 20 70 61 67 65 73  n-existant pages
23970 20 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74   or cells..*/.st
23980 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
23990 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  adLocks(Btree *p
239a0 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  Bt, Pgno pgnoRoo
239b0 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
239c0 63 6c 75 64 65 29 7b 0a 20 20 42 74 43 75 72 73  clude){.  BtCurs
239d0 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
239e0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
239f0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
23a00 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
23a10 21 3d 70 67 6e 6f 52 6f 6f 74 20 7c 7c 20 70 3d  !=pgnoRoot || p=
23a20 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74  =pExclude ) cont
23a30 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
23a40 3e 77 72 46 6c 61 67 3d 3d 30 20 29 20 72 65 74  >wrFlag==0 ) ret
23a50 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
23a60 44 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50  D;.    if( p->pP
23a70 61 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e 70 67  age->pgno!=p->pg
23a80 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  noRoot ){.      
23a90 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b 0a 20  moveToRoot(p);. 
23aa0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
23ab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
23ac0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
23ad0 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
23ae0 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b  he BTree.  The k
23af0 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ey is given by (
23b00 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e  pKey,nKey).** an
23b10 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69  d the data is gi
23b20 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44  ven by (pData,nD
23b30 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f  ata).  The curso
23b40 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  r is used only t
23b50 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74  o.** define what
23b60 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72   table the recor
23b70 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  d should be inse
23b80 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20  rted into.  The 
23b90 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
23ba0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
23bb0 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e  random location.
23bc0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e  .**.** For an IN
23bd0 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79  TKEY table, only
23be0 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20   the nKey value 
23bf0 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73  of the key is us
23c00 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20  ed.  pKey is.** 
23c10 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20  ignored.  For a 
23c20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20  ZERODATA table, 
23c30 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44  the pData and nD
23c40 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e  ata are both ign
23c50 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ored..*/.int sql
23c60 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
23c70 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
23c80 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
23c90 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
23ca0 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20   into the table 
23cb0 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  of this cursor *
23cc0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
23cd0 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
23ce0 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66     /* The key of
23cf0 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
23d00 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
23d10 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
23d20 61 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  a   /* The data 
23d30 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
23d40 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
23d50 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69  ;.  int loc;.  i
23d60 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50  nt szNew;.  MemP
23d70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
23d80 72 65 65 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  ree *pBt = pCur-
23d90 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  >pBt;.  unsigned
23da0 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a   char *oldCell;.
23db0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
23dc0 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20  *newCell = 0;.. 
23dd0 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
23de0 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
23df0 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74  {.    /* Must st
23e00 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
23e10 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  n before doing a
23e20 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20  n insert */.    
23e30 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64  return pBt->read
23e40 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
23e50 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
23e60 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73  ERROR;.  }.  ass
23e70 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
23e80 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70 43  nly );.  if( !pC
23e90 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20  ur->wrFlag ){.  
23ea0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23eb0 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f  PERM;   /* Curso
23ec0 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77  r not open for w
23ed0 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  riting */.  }.  
23ee0 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
23ef0 6b 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ks(pBt, pCur->pg
23f00 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b  noRoot, pCur) ){
23f10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23f20 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68  TE_LOCKED; /* Th
23f30 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69  e table pCur poi
23f40 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61  nts to has a rea
23f50 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20  d lock */.  }.  
23f60 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
23f70 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b  eMoveto(pCur, pK
23f80 65 79 2c 20 6e 4b 65 79 2c 20 26 6c 6f 63 29 3b  ey, nKey, &loc);
23f90 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
23fa0 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d  rn rc;.  pPage =
23fb0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
23fc0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
23fd0 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30  ntKey || nKey>=0
23fe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
23ff0 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50  age->leaf || !pP
24000 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b  age->leafData );
24010 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52  .  TRACE(("INSER
24020 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79  T: table=%d nkey
24030 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70  =%lld ndata=%d p
24040 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  age=%d %s\n",.  
24050 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67          pCur->pg
24060 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44  noRoot, nKey, nD
24070 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ata, pPage->pgno
24080 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d  ,.          loc=
24090 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22  =0 ? "overwrite"
240a0 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29   : "new entry"))
240b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
240c0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 72  e->isInit );.  r
240d0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
240e0 5f 77 72 69 74 65 28 70 50 61 67 65 2d 3e 61 44  _write(pPage->aD
240f0 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ata);.  if( rc )
24100 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 65   return rc;.  ne
24110 77 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61  wCell = sqliteMa
24120 6c 6c 6f 63 52 61 77 28 20 4d 58 5f 43 45 4c 4c  llocRaw( MX_CELL
24130 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
24140 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29  if( newCell==0 )
24150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
24160 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c  OMEM;.  rc = fil
24170 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e  lInCell(pPage, n
24180 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b  ewCell, pKey, nK
24190 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61  ey, pData, nData
241a0 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28  , &szNew);.  if(
241b0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69   rc ) goto end_i
241c0 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28  nsert;.  assert(
241d0 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65   szNew==cellSize
241e0 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65  Ptr(pPage, newCe
241f0 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ll) );.  assert(
24200 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f   szNew<=MX_CELL_
24210 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69  SIZE(pBt) );.  i
24220 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20 70 43 75  f( loc==0 && pCu
24230 72 2d 3e 69 73 56 61 6c 69 64 20 29 7b 0a 20 20  r->isValid ){.  
24240 20 20 69 6e 74 20 73 7a 4f 6c 64 3b 0a 20 20 20    int szOld;.   
24250 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
24260 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
24270 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
24280 29 3b 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d  );.    oldCell =
24290 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
242a0 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 20   pCur->idx);.   
242b0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
242c0 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  f ){.      memcp
242d0 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65  y(newCell, oldCe
242e0 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 4);.    }.  
242f0 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69    szOld = cellSi
24300 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64  zePtr(pPage, old
24310 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  Cell);.    rc = 
24320 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
24330 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69   oldCell);.    i
24340 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
24350 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 64 72 6f  _insert;.    dro
24360 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  pCell(pPage, pCu
24370 72 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a  r->idx, szOld);.
24380 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c    }else if( loc<
24390 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c  0 && pPage->nCel
243a0 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  l>0 ){.    asser
243b0 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
243c0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2b  ;.    pCur->idx+
243d0 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  +;.    pCur->inf
243e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d  o.nSize = 0;.  }
243f0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
24400 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
24410 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65  .  }.  rc = inse
24420 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  rtCell(pPage, pC
24430 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c 6c  ur->idx, newCell
24440 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  , szNew, 0, 0);.
24450 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24460 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69  _OK ) goto end_i
24470 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62 61  nsert;.  rc = ba
24480 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 31 29 3b  lance(pPage, 1);
24490 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 42 74 72  .  /* sqlite3Btr
244a0 65 65 50 61 67 65 44 75 6d 70 28 70 43 75 72 2d  eePageDump(pCur-
244b0 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  >pBt, pCur->pgno
244c0 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f  Root, 1); */.  /
244d0 2a 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  * fflush(stdout)
244e0 3b 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  ; */.  if( rc==S
244f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24500 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
24510 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74  ;.  }.end_insert
24520 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 6e  :.  sqliteFree(n
24530 65 77 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72  ewCell);.  retur
24540 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
24550 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20  elete the entry 
24560 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
24570 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
24580 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
24590 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
245a0 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  at a random loca
245b0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
245c0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
245d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
245e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
245f0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
24600 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
24610 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72   *pCell;.  int r
24620 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  c;.  Pgno pgnoCh
24630 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72 65 65  ild = 0;.  Btree
24640 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
24650 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  t;..  assert( pP
24660 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
24670 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
24680 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
24690 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74  {.    /* Must st
246a0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
246b0 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  n before doing a
246c0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72   delete */.    r
246d0 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f  eturn pBt->readO
246e0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
246f0 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
24700 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65  RROR;.  }.  asse
24710 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
24720 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  ly );.  if( pCur
24730 2d 3e 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e  ->idx >= pPage->
24740 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  nCell ){.    ret
24750 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
24760 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72  ;  /* The cursor
24770 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
24780 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a   to anything */.
24790 20 20 7d 0a 20 20 69 66 28 20 21 70 43 75 72 2d    }.  if( !pCur-
247a0 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  >wrFlag ){.    r
247b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
247c0 4d 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20  M;   /* Did not 
247d0 6f 70 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72  open this cursor
247e0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a   for writing */.
247f0 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52    }.  if( checkR
24800 65 61 64 4c 6f 63 6b 73 28 70 42 74 2c 20 70 43  eadLocks(pBt, pC
24810 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
24820 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ur) ){.    retur
24830 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
24840 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43   /* The table pC
24850 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ur points to has
24860 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
24870 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
24880 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
24890 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 69  age->aData);.  i
248a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
248b0 63 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  c;..  /* Locate 
248c0 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20  the cell within 
248d0 69 74 27 73 20 70 61 67 65 20 61 6e 64 20 6c 65  it's page and le
248e0 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69  ave pCell pointi
248f0 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64  ng to the.  ** d
24900 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65  ata. The clearCe
24910 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20  ll() call frees 
24920 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
24930 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
24940 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  th the.  ** cell
24950 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c  . The cell itsel
24960 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63  f is still intac
24970 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20  t..  */.  pCell 
24980 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
24990 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20  , pCur->idx);.  
249a0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
249b0 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c   ){.    pgnoChil
249c0 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  d = get4byte(pCe
249d0 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ll);.  }.  rc = 
249e0 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
249f0 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72   pCell);.  if( r
24a00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
24a10 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
24a20 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  af ){.    /*.   
24a30 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65   ** The entry we
24a40 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65   are about to de
24a50 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
24a60 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e  af so if we do n
24a70 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d  ot.    ** do som
24a80 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c  ething we will l
24a90 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61  eave a hole on a
24aa0 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e  n internal page.
24ab0 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20  .    ** We have 
24ac0 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65  to fill the hole
24ad0 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20   by moving in a 
24ae0 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
24af0 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65  .  The.    ** ne
24b00 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68  xt Cell after th
24b10 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65  e one to be dele
24b20 74 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65  ted is guarantee
24b30 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20  d to exist and. 
24b40 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65     ** to be a le
24b50 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65  af so we can use
24b60 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
24b70 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72  BtCursor leafCur
24b80 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
24b90 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  har *pNext;.    
24ba0 69 6e 74 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20  int szNext;.    
24bb0 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  int notUsed;.   
24bc0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
24bd0 74 65 6d 70 43 65 6c 6c 3b 0a 20 20 20 20 61 73  tempCell;.    as
24be0 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 6c 65  sert( !pPage->le
24bf0 61 66 44 61 74 61 20 29 3b 0a 20 20 20 20 67 65  afData );.    ge
24c00 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72  tTempCursor(pCur
24c10 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20  , &leafCur);.   
24c20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
24c30 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c  eeNext(&leafCur,
24c40 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
24c50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24c60 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  K ){.      if( r
24c70 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
24c80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
24c90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20  SQLITE_CORRUPT; 
24ca0 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50 54   /* bkpt-CORRUPT
24cb0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
24cc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
24cd0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
24ce0 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 6c  te3pager_write(l
24cf0 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 61 44  eafCur.pPage->aD
24d00 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ata);.    if( rc
24d10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
24d20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45    TRACE(("DELETE
24d30 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74  : table=%d delet
24d40 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20  e internal from 
24d50 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20  %d replace from 
24d60 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20  leaf %d\n",.    
24d70 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
24d80 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  t, pPage->pgno, 
24d90 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70  leafCur.pPage->p
24da0 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43  gno));.    dropC
24db0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
24dc0 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74  >idx, cellSizePt
24dd0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
24de0 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 66 69  ;.    pNext = fi
24df0 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70  ndCell(leafCur.p
24e00 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64  Page, leafCur.id
24e10 78 29 3b 0a 20 20 20 20 73 7a 4e 65 78 74 20 3d  x);.    szNext =
24e20 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61   cellSizePtr(lea
24e30 66 43 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78  fCur.pPage, pNex
24e40 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
24e50 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
24e60 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20  )>=szNext+4 );. 
24e70 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 73 71     tempCell = sq
24e80 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d  liteMallocRaw( M
24e90 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
24ea0 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70   );.    if( temp
24eb0 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
24ec0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
24ed0 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
24ee0 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
24ef0 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a  idx, pNext-4, sz
24f00 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c  Next+4, tempCell
24f10 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
24f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
24f30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
24f40 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
24f50 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  owCell(pPage, pC
24f60 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68  ur->idx), pgnoCh
24f70 69 6c 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  ild);.    rc = b
24f80 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29  alance(pPage, 0)
24f90 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
24fa0 28 74 65 6d 70 43 65 6c 6c 29 3b 0a 20 20 20 20  (tempCell);.    
24fb0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
24fc0 72 63 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c  rc;.    dropCell
24fd0 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
24fe0 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73 7a 4e  leafCur.idx, szN
24ff0 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  ext);.    rc = b
25000 61 6c 61 6e 63 65 28 6c 65 61 66 43 75 72 2e 70  alance(leafCur.p
25010 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 72 65  Page, 0);.    re
25020 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28  leaseTempCursor(
25030 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c  &leafCur);.  }el
25040 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22  se{.    TRACE(("
25050 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64  DELETE: table=%d
25060 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61   delete from lea
25070 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f %d\n",.       
25080 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
25090 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
250a0 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67     dropCell(pPag
250b0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65  e, pCur->idx, ce
250c0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
250d0 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63   pCell));.    rc
250e0 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
250f0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 6d 6f 76 65  , 0);.  }.  move
25100 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
25110 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25120 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
25130 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57   BTree table.  W
25140 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62  rite into *piTab
25150 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  le the page.** n
25160 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f  umber for the ro
25170 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
25180 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ew table..**.** 
25190 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65  The type of type
251a0 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
251b0 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  y the flags para
251c0 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65  meter.  Only the
251d0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  .** following va
251e0 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72  lues of flags ar
251f0 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
25200 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65  se.  Other value
25210 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d  s for.** flags m
25220 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a  ight not work:.*
25230 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49  *.**     BTREE_I
25240 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46  NTKEY|BTREE_LEAF
25250 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f  DATA     Used fo
25260 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74  r SQL tables wit
25270 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20  h rowid keys.** 
25280 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41      BTREE_ZERODA
25290 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TA              
252a0 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
252b0 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 69 6e 74 20   indices.*/.int 
252c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
252d0 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
252e0 42 74 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65  Bt, int *piTable
252f0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
25300 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
25310 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b    Pgno pgnoRoot;
25320 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
25330 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 21 3d 54   pBt->inTrans!=T
25340 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
25350 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
25360 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  a transaction fi
25370 72 73 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  rst */.    retur
25380 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  n pBt->readOnly 
25390 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
253a0 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
253b0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
253c0 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
253d0 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c  ;..  /* It is il
253e0 6c 65 67 61 6c 20 74 6f 20 63 72 65 61 74 65 20  legal to create 
253f0 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63  a table if any c
25400 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20  ursors are open 
25410 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
25420 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65  base. This is be
25430 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61  cause in auto-va
25440 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61  cuum mode the ba
25450 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e  ckend may.  ** n
25460 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 20 64 61  eed to move a da
25470 74 61 62 61 73 65 20 70 61 67 65 20 74 6f 20 6d  tabase page to m
25480 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
25490 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 2e 0a   new root-page..
254a0 20 20 2a 2a 20 49 66 20 61 6e 20 6f 70 65 6e 20    ** If an open 
254b0 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67  cursor was using
254c0 20 74 68 65 20 70 61 67 65 20 61 20 70 72 6f 62   the page a prob
254d0 6c 65 6d 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  lem would occur.
254e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
254f0 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
25500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
25510 43 4b 45 44 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  CKED;.  }..#ifde
25520 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
25530 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20  TOVACUUM.  rc = 
25540 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  allocatePage(pBt
25550 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52  , &pRoot, &pgnoR
25560 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66  oot, 1, 0);.  if
25570 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
25580 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42  ;.#else.  if( pB
25590 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
255a0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f  .    Pgno pgnoMo
255b0 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ve;      /* Move
255c0 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20   a page here to 
255d0 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
255e0 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20  e root-page */. 
255f0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
25600 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61  eMove; /* The pa
25610 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a  ge to move to. *
25620 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
25630 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61  he value of meta
25640 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74  [3] from the dat
25650 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69  abase to determi
25660 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20  ne where the.   
25670 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66   ** root page of
25680 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73   the new table s
25690 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33  hould go. meta[3
256a0 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74  ] is the largest
256b0 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
256c0 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72  * created so far
256d0 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f  , so the new roo
256e0 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b  t-page is (meta[
256f0 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  3]+1)..    */.  
25700 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
25710 72 65 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20  reeGetMeta(pBt, 
25720 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20  4, &pgnoRoot);. 
25730 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25740 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
25750 3b 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b  ;.    pgnoRoot++
25760 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ;..    /* The ne
25770 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20  w root-page may 
25780 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  not be allocated
25790 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   on a pointer-ma
257a0 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20  p page, or the. 
257b0 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59     ** PENDING_BY
257c0 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  TE page..    */.
257d0 20 20 20 20 69 66 28 20 70 67 6e 6f 52 6f 6f 74      if( pgnoRoot
257e0 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  ==PTRMAP_PAGENO(
257f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2c  pBt->usableSize,
25800 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20   pgnoRoot) ||.  
25810 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d        pgnoRoot==
25820 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
25830 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
25840 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20  pgnoRoot++;.    
25850 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  }.    assert( pg
25860 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20  noRoot>=3 );..  
25870 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
25880 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74  page. The page t
25890 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  hat currently re
258a0 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f  sides at pgnoRoo
258b0 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  t will.    ** be
258c0 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c   moved to the al
258d0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e  located page (un
258e0 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74  less the allocat
258f0 65 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a  ed page happens.
25900 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65      ** to reside
25910 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20   at pgnoRoot).. 
25920 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61     */.    rc = a
25930 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  llocatePage(pBt,
25940 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67   &pPageMove, &pg
25950 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74  noMove, pgnoRoot
25960 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
25970 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25980 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
25990 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
259a0 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f  gnoMove!=pgnoRoo
259b0 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54  t ){.      u8 eT
259c0 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ype;.      Pgno 
259d0 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20  iPtrPage;..     
259e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
259f0 67 65 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 72  geMove);.      r
25a00 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
25a10 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
25a20 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
25a30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25a40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
25a50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25a60 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
25a70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65  Bt, pgnoRoot, &e
25a80 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
25a90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25aa0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
25ab0 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  OTPAGE );.      
25ac0 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
25ad0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
25ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
25af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25b00 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
25b10 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
25b20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
25b30 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 72    }.      rc = r
25b40 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
25b50 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69   pRoot, eType, i
25b60 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76  PtrPage, pgnoMov
25b70 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e);.      releas
25b80 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
25b90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25bb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
25bc0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 67    }.      rc = g
25bd0 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
25be0 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 29 3b 0a 20  Root, &pRoot);. 
25bf0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
25c00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25c10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
25c20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
25c30 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
25c40 74 65 28 70 52 6f 6f 74 2d 3e 61 44 61 74 61 29  te(pRoot->aData)
25c50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
25c60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25c70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
25c80 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
25c90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
25ca0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
25cb0 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61       pRoot = pPa
25cc0 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a  geMove;.    } ..
25cd0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
25ce0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e  e pointer-map an
25cf0 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68  d meta-data with
25d00 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   the new root-pa
25d10 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20  ge number. */.  
25d20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
25d30 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
25d40 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
25d50 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
25d60 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
25d70 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
25d80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
25d90 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
25da0 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
25db0 65 74 61 28 70 42 74 2c 20 34 2c 20 70 67 6e 6f  eta(pBt, 4, pgno
25dc0 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
25dd0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  c ){.      relea
25de0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
25df0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
25e00 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
25e10 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
25e20 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f  ePage(pBt, &pRoo
25e30 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c  t, &pgnoRoot, 1,
25e40 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
25e50 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
25e60 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
25e70 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69  ( sqlite3pager_i
25e80 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74  swriteable(pRoot
25e90 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 7a 65  ->aData) );.  ze
25ea0 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c  roPage(pRoot, fl
25eb0 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b  ags | PTF_LEAF);
25ec0 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
25ed0 75 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 61 44 61  unref(pRoot->aDa
25ee0 74 61 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20  ta);.  *piTable 
25ef0 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b  = (int)pgnoRoot;
25f00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25f10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  _OK;.}../*.** Er
25f20 61 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61  ase the given da
25f30 74 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20  tabase page and 
25f40 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e  all its children
25f50 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
25f60 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
25f70 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  elist..*/.static
25f80 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61   int clearDataba
25f90 73 65 50 61 67 65 28 0a 20 20 42 74 72 65 65 20  sePage(.  Btree 
25fa0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
25fb0 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74 68 61  /* The BTree tha
25fc0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
25fd0 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  able */.  Pgno p
25fe0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
25ff0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
26000 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 4d 65 6d  o clear */.  Mem
26010 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20  Page *pParent,  
26020 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
26030 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74 68 65  e.  NULL for the
26040 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 66   root */.  int f
26050 72 65 65 50 61 67 65 46 6c 61 67 20 20 20 20 20  reePageFlag     
26060 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 70   /* Deallocate p
26070 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  age if true */.)
26080 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
26090 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ge;.  int rc;.  
260a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
260b0 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Cell;.  int i;..
260c0 20 20 69 66 28 20 70 67 6e 6f 3e 73 71 6c 69 74    if( pgno>sqlit
260d0 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
260e0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
260f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
26100 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ITE_CORRUPT;.  }
26110 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ..  rc = getAndI
26120 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
26130 6f 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65  o, &pPage, pPare
26140 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
26150 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
26160 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
26170 72 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  rite(pPage->aDat
26180 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  a);.  if( rc ) r
26190 65 74 75 72 6e 20 72 63 3b 0a 20 20 66 6f 72 28  eturn rc;.  for(
261a0 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
261b0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
261c0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
261d0 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
261e0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
261f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c  ){.      rc = cl
26200 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
26210 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
26220 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50 61  ell), pPage->pPa
26230 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rent, 1);.      
26240 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
26250 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
26260 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
26270 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
26280 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
26290 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  rc;.  }.  if( !p
262a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
262b0 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
262c0 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65  basePage(pBt, ge
262d0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
262e0 44 61 74 61 5b 38 5d 29 2c 20 70 50 61 67 65 2d  Data[8]), pPage-
262f0 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20  >pParent, 1);.  
26300 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
26310 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
26320 66 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a  freePageFlag ){.
26330 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
26340 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  e(pPage);.  }els
26350 65 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  e{.    zeroPage(
26360 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44  pPage, pPage->aD
26370 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41  ata[0] | PTF_LEA
26380 46 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  F);.  }.  releas
26390 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
263a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
263b0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69  .** Delete all i
263c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
263d0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
263e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
263f0 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68   iTable is.** th
26400 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
26410 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
26420 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74   table.  After t
26430 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
26440 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74  rns,.** the root
26450 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20   page is empty, 
26460 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73  but still exists
26470 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
26480 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77  tine will fail w
26490 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
264a0 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  D if there are a
264b0 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20  ny open.** read 
264c0 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
264d0 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74  able.  Open writ
264e0 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f  e cursors are mo
264f0 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f  ved to the.** ro
26500 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ot of the table.
26510 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
26520 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42  treeClearTable(B
26530 74 72 65 65 20 2a 70 42 74 2c 20 69 6e 74 20 69  tree *pBt, int i
26540 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  Table){.  int rc
26550 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
26560 75 72 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  ur;.  if( pBt->i
26570 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
26580 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ITE ){.    retur
26590 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  n pBt->readOnly 
265a0 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
265b0 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
265c0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 43 75 72  ;.  }.  for(pCur
265d0 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
265e0 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
265f0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
26600 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
26610 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a  (Pgno)iTable ){.
26620 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
26630 77 72 46 6c 61 67 3d 3d 30 20 29 20 72 65 74 75  wrFlag==0 ) retu
26640 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
26650 3b 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f  ;.      moveToRo
26660 6f 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  ot(pCur);.    }.
26670 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72    }.  rc = clear
26680 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
26690 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20  , (Pgno)iTable, 
266a0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  0, 0);.  if( rc 
266b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
266c0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 42 74 29  reeRollback(pBt)
266d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
266e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  c;.}../*.** Eras
266f0 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
26700 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64  n in a table and
26710 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66   add the root of
26720 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a   the table to.**
26730 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
26740 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74  Except, the root
26750 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c   of the principl
26760 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65  e table (the one
26770 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69   on.** page 1) i
26780 73 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f  s never added to
26790 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
267a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
267b0 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
267c0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
267d0 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
267e0 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20  open.** cursors 
267f0 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  on the table..**
26800 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55  .** If AUTOVACUU
26810 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64  M is enabled and
26820 20 74 68 65 20 70 61 67 65 20 61 74 20 69 54 61   the page at iTa
26830 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  ble is not the l
26840 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  ast.** root page
26850 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
26860 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
26870 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a  last root page .
26880 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
26890 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64  se file is moved
268a0 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66   into the slot f
268b0 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64  ormerly occupied
268c0 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e   by.** iTable an
268d0 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74  d that last slot
268e0 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69   formerly occupi
268f0 65 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72  ed by the last r
26900 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  oot page.** is a
26910 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
26920 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20  list instead of 
26930 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73  iTable.  In this
26940 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f   say, all.** roo
26950 74 20 70 61 67 65 73 20 61 72 65 20 6b 65 70 74  t pages are kept
26960 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
26970 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
26980 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a  e file, which.**
26990 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
269a0 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20  r AUTOVACUUM to 
269b0 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69  work right.  *pi
269c0 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
269d0 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d  the .** page num
269e0 62 65 72 20 74 68 61 74 20 75 73 65 64 20 74 6f  ber that used to
269f0 20 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f   be the last roo
26a00 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
26a10 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  le before.** the
26a20 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61   move.  If no pa
26a30 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a  ge gets moved, *
26a40 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  piMoved is set t
26a50 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74  o 0..** The last
26a60 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65   root page is re
26a70 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33  corded in meta[3
26a80 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  ] and the value 
26a90 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73  of.** meta[3] is
26aa0 20 75 70 64 61 74 65 64 20 62 79 20 74 68 69 73   updated by this
26ab0 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 69   procedure..*/.i
26ac0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
26ad0 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ropTable(Btree *
26ae0 70 42 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  pBt, int iTable,
26af0 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a   int *piMoved){.
26b00 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
26b10 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
26b20 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
26b30 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
26b40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
26b50 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
26b60 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
26b70 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
26b80 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69   }..  /* It is i
26b90 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61  llegal to drop a
26ba0 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75   table if any cu
26bb0 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f  rsors are open o
26bc0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
26bd0 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ase. This is bec
26be0 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63  ause in auto-vac
26bf0 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63  uum mode the bac
26c00 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65  kend may.  ** ne
26c10 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68  ed to move anoth
26c20 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20  er root-page to 
26c30 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20  fill a gap left 
26c40 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20  by the deleted. 
26c50 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49   ** root page. I
26c60 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  f an open cursor
26c70 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20   was using this 
26c80 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77  page a problem w
26c90 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72  ould .  ** occur
26ca0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
26cb0 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
26cc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
26cd0 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63  OCKED;.  }..  rc
26ce0 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
26cf0 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70  (Pgno)iTable, &p
26d00 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
26d10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
26d20 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
26d30 43 6c 65 61 72 54 61 62 6c 65 28 70 42 74 2c 20  ClearTable(pBt, 
26d40 69 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 72  iTable);.  if( r
26d50 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
26d60 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a    *piMoved = 0;.
26d70 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20  .  if( iTable>1 
26d80 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
26d90 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
26da0 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
26db0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
26dc0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
26dd0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  );.#else.    if(
26de0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
26df0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d   ){.      Pgno m
26e00 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
26e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
26e20 72 65 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20  reeGetMeta(pBt, 
26e30 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  4, &maxRootPgno)
26e40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
26e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26e60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
26e70 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
26e80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26e90 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69    }..      if( i
26ea0 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67  Table==maxRootPg
26eb0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  no ){.        /*
26ec0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   If the table be
26ed0 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20 74  ing dropped is t
26ee0 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  he table with th
26ef0 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
26f00 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
26f10 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74  umber in the dat
26f20 61 62 61 73 65 2c 20 70 75 74 20 74 68 65 20 72  abase, put the r
26f30 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20  oot page on the 
26f40 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20  free list. .    
26f50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
26f60 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
26f70 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
26f80 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
26f90 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
26fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26fb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
26fc0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
26fd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26fe0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
26ff0 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65  eing dropped doe
27000 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c  s not have the l
27010 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
27020 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
27030 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
27040 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20  se. So move the 
27050 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 69  page that does i
27060 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20  nto the .       
27070 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20   ** gap left by 
27080 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74  the deleted root
27090 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a  -page..        *
270a0 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  /.        MemPag
270b0 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20  e *pMove;.      
270c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
270d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63  age);.        rc
270e0 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
270f0 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d  maxRootPgno, &pM
27100 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ove);.        if
27110 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
27130 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
27140 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  }.        rc = r
27150 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
27160 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52   pMove, PTRMAP_R
27170 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61 62  OOTPAGE, 0, iTab
27180 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  le);.        rel
27190 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  easePage(pMove);
271a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
271b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
271c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
271d0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
271e0 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67       rc = getPag
271f0 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  e(pBt, maxRootPg
27200 6e 6f 2c 20 26 70 4d 6f 76 65 29 3b 0a 20 20 20  no, &pMove);.   
27210 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27230 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
27240 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27250 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
27260 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Move);.        r
27270 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
27280 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
272a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
272b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
272c0 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20         *piMoved 
272d0 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20  = maxRootPgno;. 
272e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
272f0 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61   Set the new 'ma
27300 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c  x-root-page' val
27310 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ue in the databa
27320 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a  se header. This.
27330 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
27340 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f  old value less o
27350 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72  ne, less one mor
27360 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e  e if that happen
27370 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65  s to.      ** be
27380 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d   a root-page num
27390 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67  ber, less one ag
273a0 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74  ain if that is t
273b0 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44  he.      ** PEND
273c0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20  ING_BYTE_PAGE.. 
273d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61       */.      ma
273e0 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
273f0 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
27400 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
27410 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
27420 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
27430 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o--;.      }.   
27440 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
27450 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  no==PTRMAP_PAGEN
27460 4f 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  O(pBt->usableSiz
27470 65 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20  e, maxRootPgno) 
27480 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f  ){.        maxRo
27490 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
274a0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
274b0 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e  maxRootPgno!=PEN
274c0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
274d0 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63  Bt) );..      rc
274e0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
274f0 70 64 61 74 65 4d 65 74 61 28 70 42 74 2c 20 34  pdateMeta(pBt, 4
27500 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a  , maxRootPgno);.
27510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27520 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
27530 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c  Page);.      rel
27540 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
27550 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
27560 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
27570 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
27580 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65  pTable was calle
27590 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a  d on page 1. */.
275a0 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
275b0 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ge, PTF_INTKEY|P
275c0 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72  TF_LEAF );.    r
275d0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
275e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
275f0 72 63 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rc;  .}.../*.** 
27600 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e  Read the meta-in
27610 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66  formation out of
27620 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
27630 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
27640 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
27650 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e  ree pages curren
27660 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  tly in the datab
27670 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a  ase.  Meta[1].**
27680 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35   through meta[15
27690 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  ] are available 
276a0 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65  for use by highe
276b0 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b  r layers.  Meta[
276c0 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e  0].** is read-on
276d0 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61  ly, the others a
276e0 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a  re read/write..*
276f0 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  * .** The schema
27700 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d   layer numbers m
27710 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65  eta values diffe
27720 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20  rently.  At the 
27730 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20  schema.** layer 
27740 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b  (and the SetCook
27750 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69  ie and ReadCooki
27760 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e  e opcodes) the n
27770 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65  umber of.** free
27780 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69   pages is not vi
27790 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69  sible.  So Cooki
277a0 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65  e[0] is the same
277b0 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a   as Meta[1]..*/.
277c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
277d0 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70  GetMeta(Btree *p
277e0 42 74 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32  Bt, int idx, u32
277f0 20 2a 70 4d 65 74 61 29 7b 0a 20 20 69 6e 74 20   *pMeta){.  int 
27800 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
27810 68 61 72 20 2a 70 50 31 3b 0a 0a 20 20 61 73 73  har *pP1;..  ass
27820 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
27830 64 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20 3d  dx<=15 );.  rc =
27840 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
27850 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31  t(pBt->pPager, 1
27860 2c 20 28 76 6f 69 64 2a 2a 29 26 70 50 31 29 3b  , (void**)&pP1);
27870 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
27880 72 6e 20 72 63 3b 0a 20 20 2a 70 4d 65 74 61 20  rn rc;.  *pMeta 
27890 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31 5b  = get4byte(&pP1[
278a0 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20  36 + idx*4]);.  
278b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
278c0 65 66 28 70 50 31 29 3b 0a 0a 20 20 2f 2a 20 49  ef(pP1);..  /* I
278d0 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69  f autovacuumed i
278e0 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
278f0 69 73 20 62 75 69 6c 64 20 62 75 74 20 77 65 20  is build but we 
27900 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20  are trying to . 
27910 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75   ** access an au
27920 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61 62  tovacuumed datab
27930 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74  ase, then make t
27940 68 65 20 64 61 74 61 62 61 73 65 20 72 65 61 64  he database read
27950 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64  only. .  */.#ifd
27960 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
27970 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
27980 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61  idx==4 && *pMeta
27990 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e  >0 ) pBt->readOn
279a0 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  ly = 1;.#endif..
279b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
279c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  OK;.}../*.** Wri
279d0 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74  te meta-informat
279e0 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ion back into th
279f0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74  e database.  Met
27a00 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d  a[0] is.** read-
27a10 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74  only and may not
27a20 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a   be written..*/.
27a30 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27a40 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65 65  UpdateMeta(Btree
27a50 20 2a 70 42 74 2c 20 69 6e 74 20 69 64 78 2c 20   *pBt, int idx, 
27a60 75 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 75 6e  u32 iMeta){.  un
27a70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31  signed char *pP1
27a80 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
27a90 73 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20  sert( idx>=1 && 
27aa0 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 69 66 28  idx<=15 );.  if(
27ab0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 21 3d 54   pBt->inTrans!=T
27ac0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
27ad0 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
27ae0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
27af0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
27b00 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  E_ERROR;.  }.  a
27b10 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
27b20 65 31 21 3d 30 20 29 3b 0a 20 20 70 50 31 20 3d  e1!=0 );.  pP1 =
27b30 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
27b40 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
27b50 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
27b60 50 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  P1);.  if( rc ) 
27b70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 75 74  return rc;.  put
27b80 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20  4byte(&pP1[36 + 
27b90 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a  idx*4], iMeta);.
27ba0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27bb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
27bc0 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74  urn the flag byt
27bd0 65 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  e at the beginni
27be0 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ng of the page t
27bf0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hat the cursor.*
27c00 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  * is currently p
27c10 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69  ointing to..*/.i
27c20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
27c30 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70  lags(BtCursor *p
27c40 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
27c50 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
27c60 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70  Page;.  return p
27c70 50 61 67 65 20 3f 20 70 50 61 67 65 2d 3e 61 44  Page ? pPage->aD
27c80 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
27c90 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 23 69  fset] : 0;.}..#i
27ca0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
27cb0 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  G./*.** Print a 
27cc0 64 69 73 61 73 73 65 6d 62 6c 79 20 6f 66 20 74  disassembly of t
27cd0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 6f 6e  he given page on
27ce0 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
27cf0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
27d00 2a 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ** is used for d
27d10 65 62 75 67 67 69 6e 67 20 61 6e 64 20 74 65 73  ebugging and tes
27d20 74 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  ting only..*/.st
27d30 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 50 61  atic int btreePa
27d40 67 65 44 75 6d 70 28 42 74 72 65 65 20 2a 70 42  geDump(Btree *pB
27d50 74 2c 20 69 6e 74 20 70 67 6e 6f 2c 20 69 6e 74  t, int pgno, int
27d60 20 72 65 63 75 72 73 69 76 65 2c 20 4d 65 6d 50   recursive, MemP
27d70 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20  age *pParent){. 
27d80 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
27d90 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  ge *pPage;.  int
27da0 20 69 2c 20 6a 2c 20 63 3b 0a 20 20 69 6e 74 20   i, j, c;.  int 
27db0 6e 46 72 65 65 3b 0a 20 20 75 31 36 20 69 64 78  nFree;.  u16 idx
27dc0 3b 0a 20 20 69 6e 74 20 68 64 72 3b 0a 20 20 69  ;.  int hdr;.  i
27dd0 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  nt nCell;.  int 
27de0 69 73 49 6e 69 74 3b 0a 20 20 75 6e 73 69 67 6e  isInit;.  unsign
27df0 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
27e00 20 63 68 61 72 20 72 61 6e 67 65 5b 32 30 5d 3b   char range[20];
27e10 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
27e20 20 70 61 79 6c 6f 61 64 5b 32 30 5d 3b 0a 0a 20   payload[20];.. 
27e30 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
27e40 74 2c 20 28 50 67 6e 6f 29 70 67 6e 6f 2c 20 26  t, (Pgno)pgno, &
27e50 70 50 61 67 65 29 3b 0a 20 20 69 73 49 6e 69 74  pPage);.  isInit
27e60 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
27e70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
27e80 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  sInit==0 ){.    
27e90 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  initPage(pPage, 
27ea0 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  pParent);.  }.  
27eb0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
27ec0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 68  turn rc;.  }.  h
27ed0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
27ee0 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20  ffset;.  data = 
27ef0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
27f00 63 20 3d 20 64 61 74 61 5b 68 64 72 5d 3b 0a 20  c = data[hdr];. 
27f10 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
27f20 20 28 63 20 26 20 28 50 54 46 5f 49 4e 54 4b 45   (c & (PTF_INTKE
27f30 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 29 29  Y|PTF_LEAFDATA))
27f40 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 7a 65  !=0;.  pPage->ze
27f50 72 6f 44 61 74 61 20 3d 20 28 63 20 26 20 50 54  roData = (c & PT
27f60 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a  F_ZERODATA)!=0;.
27f70 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74    pPage->leafDat
27f80 61 20 3d 20 28 63 20 26 20 50 54 46 5f 4c 45 41  a = (c & PTF_LEA
27f90 46 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61  FDATA)!=0;.  pPa
27fa0 67 65 2d 3e 6c 65 61 66 20 3d 20 28 63 20 26 20  ge->leaf = (c & 
27fb0 50 54 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20  PTF_LEAF)!=0;.  
27fc0 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
27fd0 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61   !(pPage->zeroDa
27fe0 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c  ta || (!pPage->l
27ff0 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65  eaf && pPage->le
28000 61 66 44 61 74 61 29 29 3b 0a 20 20 6e 43 65 6c  afData));.  nCel
28010 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
28020 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 73 71  ta[hdr+3]);.  sq
28030 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
28040 28 22 50 41 47 45 20 25 64 3a 20 20 66 6c 61 67  ("PAGE %d:  flag
28050 73 3d 30 78 25 30 32 78 20 20 66 72 61 67 3d 25  s=0x%02x  frag=%
28060 64 20 20 20 70 61 72 65 6e 74 3d 25 64 5c 6e 22  d   parent=%d\n"
28070 2c 20 70 67 6e 6f 2c 0a 20 20 20 20 64 61 74 61  , pgno,.    data
28080 5b 68 64 72 5d 2c 20 64 61 74 61 5b 68 64 72 2b  [hdr], data[hdr+
28090 37 5d 2c 20 0a 20 20 20 20 28 70 50 61 67 65 2d  7], .    (pPage-
280a0 3e 69 73 49 6e 69 74 20 26 26 20 70 50 61 67 65  >isInit && pPage
280b0 2d 3e 70 50 61 72 65 6e 74 29 20 3f 20 70 50 61  ->pParent) ? pPa
280c0 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e  ge->pParent->pgn
280d0 6f 20 3a 20 30 29 3b 0a 20 20 61 73 73 65 72 74  o : 0);.  assert
280e0 28 20 68 64 72 20 3d 3d 20 28 70 67 6e 6f 3d 3d  ( hdr == (pgno==
280f0 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
28100 20 20 69 64 78 20 3d 20 68 64 72 20 2b 20 31 32    idx = hdr + 12
28110 20 2d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34   - pPage->leaf*4
28120 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
28130 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
28140 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
28150 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 3b 0a 20     Pgno child;. 
28160 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
28170 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74   *pCell;.    int
28180 20 73 7a 3b 0a 20 20 20 20 69 6e 74 20 61 64 64   sz;.    int add
28190 72 3b 0a 0a 20 20 20 20 61 64 64 72 20 3d 20 67  r;..    addr = g
281a0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 64  et2byte(&data[id
281b0 78 20 2b 20 32 2a 69 5d 29 3b 0a 20 20 20 20 70  x + 2*i]);.    p
281c0 43 65 6c 6c 20 3d 20 26 64 61 74 61 5b 61 64 64  Cell = &data[add
281d0 72 5d 3b 0a 20 20 20 20 70 61 72 73 65 43 65 6c  r];.    parseCel
281e0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
281f0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73  l, &info);.    s
28200 7a 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  z = info.nSize;.
28210 20 20 20 20 73 70 72 69 6e 74 66 28 72 61 6e 67      sprintf(rang
28220 65 2c 22 25 64 2e 2e 25 64 22 2c 20 61 64 64 72  e,"%d..%d", addr
28230 2c 20 61 64 64 72 2b 73 7a 2d 31 29 3b 0a 20 20  , addr+sz-1);.  
28240 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
28250 66 20 29 7b 0a 20 20 20 20 20 20 63 68 69 6c 64  f ){.      child
28260 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
28270 0a 20 20 20 20 20 20 63 68 69 6c 64 20 3d 20 67  .      child = g
28280 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
28290 20 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20 69      }.    sz = i
282a0 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69  nfo.nData;.    i
282b0 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
282c0 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e  y ) sz += info.n
282d0 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e  Key;.    if( sz>
282e0 73 69 7a 65 6f 66 28 70 61 79 6c 6f 61 64 29 2d  sizeof(payload)-
282f0 31 20 29 20 73 7a 20 3d 20 73 69 7a 65 6f 66 28  1 ) sz = sizeof(
28300 70 61 79 6c 6f 61 64 29 2d 31 3b 0a 20 20 20 20  payload)-1;.    
28310 6d 65 6d 63 70 79 28 70 61 79 6c 6f 61 64 2c 20  memcpy(payload, 
28320 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 48 65 61  &pCell[info.nHea
28330 64 65 72 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 66  der], sz);.    f
28340 6f 72 28 6a 3d 30 3b 20 6a 3c 73 7a 3b 20 6a 2b  or(j=0; j<sz; j+
28350 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 61  +){.      if( pa
28360 79 6c 6f 61 64 5b 6a 5d 3c 30 78 32 30 20 7c 7c  yload[j]<0x20 ||
28370 20 70 61 79 6c 6f 61 64 5b 6a 5d 3e 30 78 37 66   payload[j]>0x7f
28380 20 29 20 70 61 79 6c 6f 61 64 5b 6a 5d 20 3d 20   ) payload[j] = 
28390 27 2e 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  '.';.    }.    p
283a0 61 79 6c 6f 61 64 5b 73 7a 5d 20 3d 20 30 3b 0a  ayload[sz] = 0;.
283b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
283c0 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 63  Printf(.      "c
283d0 65 6c 6c 20 25 32 64 3a 20 69 3d 25 2d 31 30 73  ell %2d: i=%-10s
283e0 20 63 68 6c 64 3d 25 2d 34 64 20 6e 6b 3d 25 2d   chld=%-4d nk=%-
283f0 34 6c 6c 64 20 6e 64 3d 25 2d 34 64 20 70 61 79  4lld nd=%-4d pay
28400 6c 6f 61 64 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  load=%s\n",.    
28410 20 20 69 2c 20 72 61 6e 67 65 2c 20 63 68 69 6c    i, range, chil
28420 64 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 69 6e  d, info.nKey, in
28430 66 6f 2e 6e 44 61 74 61 2c 20 70 61 79 6c 6f 61  fo.nData, payloa
28440 64 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69  d.    );.  }.  i
28450 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
28460 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
28470 62 75 67 50 72 69 6e 74 66 28 22 72 69 67 68 74  bugPrintf("right
28480 5f 63 68 69 6c 64 3a 20 25 64 5c 6e 22 2c 20 67  _child: %d\n", g
28490 65 74 34 62 79 74 65 28 26 64 61 74 61 5b 68 64  et4byte(&data[hd
284a0 72 2b 38 5d 29 29 3b 0a 20 20 7d 0a 20 20 6e 46  r+8]));.  }.  nF
284b0 72 65 65 20 3d 20 30 3b 0a 20 20 69 20 3d 20 30  ree = 0;.  i = 0
284c0 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 32 62 79  ;.  idx = get2by
284d0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
284e0 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3e 30  ;.  while( idx>0
284f0 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 70   && idx<pPage->p
28500 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
28510 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67  {.    int sz = g
28520 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 64  et2byte(&data[id
28530 78 2b 32 5d 29 3b 0a 20 20 20 20 73 70 72 69 6e  x+2]);.    sprin
28540 74 66 28 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64  tf(range,"%d..%d
28550 22 2c 20 69 64 78 2c 20 69 64 78 2b 73 7a 2d 31  ", idx, idx+sz-1
28560 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20  );.    nFree += 
28570 73 7a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  sz;.    sqlite3D
28580 65 62 75 67 50 72 69 6e 74 66 28 22 66 72 65 65  ebugPrintf("free
28590 62 6c 6f 63 6b 20 25 32 64 3a 20 69 3d 25 2d 31  block %2d: i=%-1
285a0 30 73 20 73 69 7a 65 3d 25 2d 34 64 20 74 6f 74  0s size=%-4d tot
285b0 61 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  al=%d\n",.      
285c0 20 69 2c 20 72 61 6e 67 65 2c 20 73 7a 2c 20 6e   i, range, sz, n
285d0 46 72 65 65 29 3b 0a 20 20 20 20 69 64 78 20 3d  Free);.    idx =
285e0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
285f0 69 64 78 5d 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a  idx]);.    i++;.
28600 20 20 7d 0a 20 20 69 66 28 20 69 64 78 21 3d 30    }.  if( idx!=0
28610 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
28620 65 62 75 67 50 72 69 6e 74 66 28 22 45 52 52 4f  ebugPrintf("ERRO
28630 52 3a 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  R: next freebloc
28640 6b 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72  k index out of r
28650 61 6e 67 65 3a 20 25 64 5c 6e 22 2c 20 69 64 78  ange: %d\n", idx
28660 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 63  );.  }.  if( rec
28670 75 72 73 69 76 65 20 26 26 20 21 70 50 61 67 65  ursive && !pPage
28680 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 66 6f  ->leaf ){.    fo
28690 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
286a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69  i++){.      unsi
286b0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
286c0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
286d0 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 62 74 72  e, i);.      btr
286e0 65 65 50 61 67 65 44 75 6d 70 28 70 42 74 2c 20  eePageDump(pBt, 
286f0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
28700 20 31 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20   1, pPage);.    
28710 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65    idx = get2byte
28720 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  (pCell);.    }. 
28730 20 20 20 62 74 72 65 65 50 61 67 65 44 75 6d 70     btreePageDump
28740 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26  (pBt, get4byte(&
28750 64 61 74 61 5b 68 64 72 2b 38 5d 29 2c 20 31 2c  data[hdr+8]), 1,
28760 20 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70   pPage);.  }.  p
28770 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
28780 73 49 6e 69 74 3b 0a 20 20 73 71 6c 69 74 65 33  sInit;.  sqlite3
28790 70 61 67 65 72 5f 75 6e 72 65 66 28 64 61 74 61  pager_unref(data
287a0 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f  );.  fflush(stdo
287b0 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ut);.  return SQ
287c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
287d0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 44  qlite3BtreePageD
287e0 75 6d 70 28 42 74 72 65 65 20 2a 70 42 74 2c 20  ump(Btree *pBt, 
287f0 69 6e 74 20 70 67 6e 6f 2c 20 69 6e 74 20 72 65  int pgno, int re
28800 63 75 72 73 69 76 65 29 7b 0a 20 20 72 65 74 75  cursive){.  retu
28810 72 6e 20 62 74 72 65 65 50 61 67 65 44 75 6d 70  rn btreePageDump
28820 28 70 42 74 2c 20 70 67 6e 6f 2c 20 72 65 63 75  (pBt, pgno, recu
28830 72 73 69 76 65 2c 20 30 29 3b 0a 7d 0a 23 65 6e  rsive, 0);.}.#en
28840 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
28850 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 46 69  TE_TEST./*.** Fi
28860 6c 6c 20 61 52 65 73 75 6c 74 5b 5d 20 77 69 74  ll aResult[] wit
28870 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  h information ab
28880 6f 75 74 20 74 68 65 20 65 6e 74 72 79 20 61 6e  out the entry an
28890 64 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  d page that the.
288a0 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ** cursor is poi
288b0 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2a 20 0a 2a 2a  nting to..** .**
288c0 20 20 20 61 52 65 73 75 6c 74 5b 30 5d 20 3d 20     aResult[0] = 
288d0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
288e0 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 31 5d  .**   aResult[1]
288f0 20 3d 20 20 54 68 65 20 65 6e 74 72 79 20 6e 75   =  The entry nu
28900 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73 75 6c  mber.**   aResul
28910 74 5b 32 5d 20 3d 20 20 54 6f 74 61 6c 20 6e 75  t[2] =  Total nu
28920 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
28930 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a 20  on this page.** 
28940 20 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d 20 20    aResult[3] =  
28950 43 65 6c 6c 20 73 69 7a 65 20 28 6c 6f 63 61 6c  Cell size (local
28960 20 70 61 79 6c 6f 61 64 20 2b 20 68 65 61 64 65   payload + heade
28970 72 29 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  r).**   aResult[
28980 34 5d 20 3d 20 20 4e 75 6d 62 65 72 20 6f 66 20  4] =  Number of 
28990 66 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74 68  free bytes on th
289a0 69 73 20 70 61 67 65 0a 2a 2a 20 20 20 61 52 65  is page.**   aRe
289b0 73 75 6c 74 5b 35 5d 20 3d 20 20 4e 75 6d 62 65  sult[5] =  Numbe
289c0 72 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 73  r of free blocks
289d0 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
289e0 20 20 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 20    aResult[6] =  
289f0 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69  Total payload si
28a00 7a 65 20 28 6c 6f 63 61 6c 20 2b 20 6f 76 65 72  ze (local + over
28a10 66 6c 6f 77 29 0a 2a 2a 20 20 20 61 52 65 73 75  flow).**   aResu
28a20 6c 74 5b 37 5d 20 3d 20 20 48 65 61 64 65 72 20  lt[7] =  Header 
28a30 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 2a 2a  size in bytes.**
28a40 20 20 20 61 52 65 73 75 6c 74 5b 38 5d 20 3d 20     aResult[8] = 
28a50 20 4c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 73   Local payload s
28a60 69 7a 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  ize.**   aResult
28a70 5b 39 5d 20 3d 20 20 50 61 72 65 6e 74 20 70 61  [9] =  Parent pa
28a80 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2a 20  ge number.**.** 
28a90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
28aa0 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
28ab0 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
28ac0 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nly..*/.int sqli
28ad0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 6e  te3BtreeCursorIn
28ae0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
28af0 72 2c 20 69 6e 74 20 2a 61 52 65 73 75 6c 74 2c  r, int *aResult,
28b00 20 69 6e 74 20 75 70 43 6e 74 29 7b 0a 20 20 69   int upCnt){.  i
28b10 6e 74 20 63 6e 74 2c 20 69 64 78 3b 0a 20 20 4d  nt cnt, idx;.  M
28b20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
28b30 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 42  pCur->pPage;.  B
28b40 74 43 75 72 73 6f 72 20 74 6d 70 43 75 72 3b 0a  tCursor tmpCur;.
28b50 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79  .  pageIntegrity
28b60 28 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72  (pPage);.  asser
28b70 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
28b80 20 29 3b 0a 20 20 67 65 74 54 65 6d 70 43 75 72   );.  getTempCur
28b90 73 6f 72 28 70 43 75 72 2c 20 26 74 6d 70 43 75  sor(pCur, &tmpCu
28ba0 72 29 3b 0a 20 20 77 68 69 6c 65 28 20 75 70 43  r);.  while( upC
28bb0 6e 74 2d 2d 20 29 7b 0a 20 20 20 20 6d 6f 76 65  nt-- ){.    move
28bc0 54 6f 50 61 72 65 6e 74 28 26 74 6d 70 43 75 72  ToParent(&tmpCur
28bd0 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 20 3d  );.  }.  pPage =
28be0 20 74 6d 70 43 75 72 2e 70 50 61 67 65 3b 0a 20   tmpCur.pPage;. 
28bf0 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70   pageIntegrity(p
28c00 50 61 67 65 29 3b 0a 20 20 61 52 65 73 75 6c 74  Page);.  aResult
28c10 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 70 61 67  [0] = sqlite3pag
28c20 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 70 50  er_pagenumber(pP
28c30 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 61  age->aData);.  a
28c40 73 73 65 72 74 28 20 61 52 65 73 75 6c 74 5b 30  ssert( aResult[0
28c50 5d 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  ]==pPage->pgno )
28c60 3b 0a 20 20 61 52 65 73 75 6c 74 5b 31 5d 20 3d  ;.  aResult[1] =
28c70 20 74 6d 70 43 75 72 2e 69 64 78 3b 0a 20 20 61   tmpCur.idx;.  a
28c80 52 65 73 75 6c 74 5b 32 5d 20 3d 20 70 50 61 67  Result[2] = pPag
28c90 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20  e->nCell;.  if( 
28ca0 74 6d 70 43 75 72 2e 69 64 78 3e 3d 30 20 26 26  tmpCur.idx>=0 &&
28cb0 20 74 6d 70 43 75 72 2e 69 64 78 3c 70 50 61 67   tmpCur.idx<pPag
28cc0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
28cd0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 26 74 6d 70  getCellInfo(&tmp
28ce0 43 75 72 29 3b 0a 20 20 20 20 61 52 65 73 75 6c  Cur);.    aResul
28cf0 74 5b 33 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e  t[3] = tmpCur.in
28d00 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20 61 52  fo.nSize;.    aR
28d10 65 73 75 6c 74 5b 36 5d 20 3d 20 74 6d 70 43 75  esult[6] = tmpCu
28d20 72 2e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  r.info.nData;.  
28d30 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 74    aResult[7] = t
28d40 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 48 65 61 64  mpCur.info.nHead
28d50 65 72 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b  er;.    aResult[
28d60 38 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f  8] = tmpCur.info
28d70 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  .nLocal;.  }else
28d80 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 33 5d  {.    aResult[3]
28d90 20 3d 20 30 3b 0a 20 20 20 20 61 52 65 73 75 6c   = 0;.    aResul
28da0 74 5b 36 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52  t[6] = 0;.    aR
28db0 65 73 75 6c 74 5b 37 5d 20 3d 20 30 3b 0a 20 20  esult[7] = 0;.  
28dc0 20 20 61 52 65 73 75 6c 74 5b 38 5d 20 3d 20 30    aResult[8] = 0
28dd0 3b 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c 74 5b  ;.  }.  aResult[
28de0 34 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65  4] = pPage->nFre
28df0 65 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20  e;.  cnt = 0;.  
28e00 69 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 26  idx = get2byte(&
28e10 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
28e20 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 31 5d  ge->hdrOffset+1]
28e30 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3e  );.  while( idx>
28e40 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
28e50 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
28e60 29 7b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  ){.    cnt++;.  
28e70 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65    idx = get2byte
28e80 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69  (&pPage->aData[i
28e90 64 78 5d 29 3b 0a 20 20 7d 0a 20 20 61 52 65 73  dx]);.  }.  aRes
28ea0 75 6c 74 5b 35 5d 20 3d 20 63 6e 74 3b 0a 20 20  ult[5] = cnt;.  
28eb0 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
28ec0 6e 74 3d 3d 30 20 7c 7c 20 69 73 52 6f 6f 74 50  nt==0 || isRootP
28ed0 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20  age(pPage) ){.  
28ee0 20 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 30    aResult[9] = 0
28ef0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
28f00 52 65 73 75 6c 74 5b 39 5d 20 3d 20 70 50 61 67  Result[9] = pPag
28f10 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  e->pParent->pgno
28f20 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 54  ;.  }.  releaseT
28f30 65 6d 70 43 75 72 73 6f 72 28 26 74 6d 70 43 75  empCursor(&tmpCu
28f40 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
28f50 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
28f60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
28f70 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61  he pager associa
28f80 74 65 64 20 77 69 74 68 20 61 20 42 54 72 65 65  ted with a BTree
28f90 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
28fa0 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
28fb0 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
28fc0 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61  ging only..*/.Pa
28fd0 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  ger *sqlite3Btre
28fe0 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70 42  ePager(Btree *pB
28ff0 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  t){.  return pBt
29000 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 2f 2a 0a  ->pPager;.}../*.
29010 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 72  ** This structur
29020 65 20 69 73 20 70 61 73 73 65 64 20 61 72 6f 75  e is passed arou
29030 6e 64 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74  nd through all t
29040 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
29050 6e 67 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 69  ng routines.** i
29060 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
29070 74 72 61 63 6b 20 6f 66 20 73 6f 6d 65 20 67 6c  track of some gl
29080 6f 62 61 6c 20 73 74 61 74 65 20 69 6e 66 6f 72  obal state infor
29090 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  mation..*/.typed
290a0 65 66 20 73 74 72 75 63 74 20 49 6e 74 65 67 72  ef struct Integr
290b0 69 74 79 43 6b 20 49 6e 74 65 67 72 69 74 79 43  ityCk IntegrityC
290c0 6b 3b 0a 73 74 72 75 63 74 20 49 6e 74 65 67 72  k;.struct Integr
290d0 69 74 79 43 6b 20 7b 0a 20 20 42 74 72 65 65 20  ityCk {.  Btree 
290e0 2a 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  *pBt;    /* The 
290f0 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b  tree being check
29100 65 64 20 6f 75 74 20 2a 2f 0a 20 20 50 61 67 65  ed out */.  Page
29110 72 20 2a 70 50 61 67 65 72 3b 20 2f 2a 20 54 68  r *pPager; /* Th
29120 65 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 67  e associated pag
29130 65 72 2e 20 20 41 6c 73 6f 20 61 63 63 65 73 73  er.  Also access
29140 69 62 6c 65 20 62 79 20 70 42 74 2d 3e 70 50 61  ible by pBt->pPa
29150 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ger */.  int nPa
29160 67 65 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ge;     /* Numbe
29170 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
29180 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
29190 69 6e 74 20 2a 61 6e 52 65 66 3b 20 20 20 20 2f  int *anRef;    /
291a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  * Number of time
291b0 73 20 65 61 63 68 20 70 61 67 65 20 69 73 20 72  s each page is r
291c0 65 66 65 72 65 6e 63 65 64 20 2a 2f 0a 20 20 63  eferenced */.  c
291d0 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 20 2f 2a  har *zErrMsg; /*
291e0 20 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   An error messag
291f0 65 2e 20 20 4e 55 4c 4c 20 6f 66 20 6e 6f 20 65  e.  NULL of no e
29200 72 72 6f 72 73 20 73 65 65 6e 2e 20 2a 2f 0a 7d  rrors seen. */.}
29210 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
29220 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
29230 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70  _CHECK./*.** App
29240 65 6e 64 20 61 20 6d 65 73 73 61 67 65 20 74 6f  end a message to
29250 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
29260 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  ge string..*/.st
29270 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41  atic void checkA
29280 70 70 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65  ppendMsg(.  Inte
29290 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
292a0 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a  .  char *zMsg1,.
292b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
292c0 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a  ormat,.  ....){.
292d0 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
292e0 63 68 61 72 20 2a 7a 4d 73 67 32 3b 0a 20 20 76  char *zMsg2;.  v
292f0 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
29300 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20 3d 20  mat);.  zMsg2 = 
29310 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
29320 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
29330 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
29340 28 20 7a 4d 73 67 31 3d 3d 30 20 29 20 7a 4d 73  ( zMsg1==0 ) zMs
29350 67 31 20 3d 20 22 22 3b 0a 20 20 69 66 28 20 70  g1 = "";.  if( p
29360 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 29  Check->zErrMsg )
29370 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64  {.    char *zOld
29380 20 3d 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d   = pCheck->zErrM
29390 73 67 3b 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e  sg;.    pCheck->
293a0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
293b0 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
293c0 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d  g(&pCheck->zErrM
293d0 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22 2c 20  sg, zOld, "\n", 
293e0 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63  zMsg1, zMsg2, (c
293f0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c  har*)0);.    sql
29400 69 74 65 46 72 65 65 28 7a 4f 6c 64 29 3b 0a 20  iteFree(zOld);. 
29410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
29420 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 43  te3SetString(&pC
29430 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a  heck->zErrMsg, z
29440 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68  Msg1, zMsg2, (ch
29450 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 73 71  ar*)0);.  }.  sq
29460 6c 69 74 65 46 72 65 65 28 7a 4d 73 67 32 29 3b  liteFree(zMsg2);
29470 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
29480 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
29490 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
294a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
294b0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
294c0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20  ./*.** Add 1 to 
294d0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
294e0 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50 61  unt for page iPa
294f0 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ge.  If this is 
29500 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65  the second.** re
29510 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
29520 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72 6f  age, add an erro
29530 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43 68  r message to pCh
29540 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  eck->zErrMsg..**
29550 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
29560 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f 72  re are 2 ore mor
29570 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
29580 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20 69  the page and 0 i
29590 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  f.** if this is 
295a0 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72 65  the first refere
295b0 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2e  nce to the page.
295c0 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63  .**.** Also chec
295d0 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
295e0 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75  number is in bou
295f0 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nds..*/.static i
29600 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65  nt checkRef(Inte
29610 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
29620 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61 72   int iPage, char
29630 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69   *zContext){.  i
29640 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65  f( iPage==0 ) re
29650 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 50  turn 1;.  if( iP
29660 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67  age>pCheck->nPag
29670 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a  e || iPage<0 ){.
29680 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
29690 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
296a0 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61  ext, "invalid pa
296b0 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69  ge number %d", i
296c0 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
296d0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
296e0 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61  Check->anRef[iPa
296f0 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68  ge]==1 ){.    ch
29700 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
29710 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
29720 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f  2nd reference to
29730 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
29740 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
29750 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28  .  }.  return  (
29760 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50  pCheck->anRef[iP
29770 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69  age]++)>1;.}..#i
29780 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29790 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
297a0 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
297b0 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  e entry in the p
297c0 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70  ointer-map for p
297d0 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20  age iChild maps 
297e0 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72  to .** page iPar
297f0 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70  ent, pointer typ
29800 65 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f  e ptrType. If no
29810 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72  t, append an err
29820 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f  or message.** to
29830 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74   pCheck..*/.stat
29840 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72  ic void checkPtr
29850 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79  map(.  Integrity
29860 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a  Ck *pCheck,   /*
29870 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   Integrity check
29880 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67   context */.  Pg
29890 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
298a0 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61       /* Child pa
298b0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75  ge number */.  u
298c0 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
298d0 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
298e0 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79  d pointer map ty
298f0 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61  pe */.  Pgno iPa
29900 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f  rent,          /
29910 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74  * Expected point
29920 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61  er map parent pa
29930 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  ge number */.  c
29940 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20  har *zContext   
29950 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
29960 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73   description (us
29970 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67  ed for error msg
29980 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
29990 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54 79  ;.  u8 ePtrmapTy
299a0 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d  pe;.  Pgno iPtrm
299b0 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20  apParent;..  rc 
299c0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43 68 65  = ptrmapGet(pChe
299d0 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c  ck->pBt, iChild,
299e0 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26   &ePtrmapType, &
299f0 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a  iPtrmapParent);.
29a00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29a10 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  _OK ){.    check
29a20 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
29a30 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61 69  , zContext, "Fai
29a40 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74 72 6d  led to read ptrm
29a50 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68 69  ap key=%d", iChi
29a60 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ld);.    return;
29a70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74 72  .  }..  if( ePtr
29a80 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65 20 7c  mapType!=eType |
29a90 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 21  | iPtrmapParent!
29aa0 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  =iParent ){.    
29ab0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
29ac0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
29ad0 20 0a 20 20 20 20 20 20 22 42 61 64 20 70 74 72   .      "Bad ptr
29ae0 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d 25   map entry key=%
29af0 64 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c 25  d expected=(%d,%
29b00 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c  d) got=(%d,%d)",
29b10 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c 20   .      iChild, 
29b20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c 20  eType, iParent, 
29b30 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50 74  ePtrmapType, iPt
29b40 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  rmapParent);.  }
29b50 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
29b60 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
29b70 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65  rity of the free
29b80 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76  list or of an ov
29b90 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74  erflow page list
29ba0 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  ..** Verify that
29bb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
29bc0 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73 74  ages on the list
29bd0 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63   is N..*/.static
29be0 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74 28   void checkList(
29bf0 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
29c00 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65  pCheck,  /* Inte
29c10 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20 63  grity checking c
29c20 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
29c30 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20 20  isFreeList,     
29c40 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
29c50 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73 65  freelist.  False
29c60 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61   for overflow pa
29c70 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ge list */.  int
29c80 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20   iPage,         
29c90 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
29ca0 72 20 66 6f 72 20 66 69 72 73 74 20 70 61 67 65  r for first page
29cb0 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
29cc0 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
29cd0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
29ce0 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ted number of pa
29cf0 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
29d00 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74  */.  char *zCont
29d10 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ext        /* Co
29d20 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20  ntext for error 
29d30 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  messages */.){. 
29d40 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78   int i;.  int ex
29d50 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e  pected = N;.  in
29d60 74 20 69 46 69 72 73 74 20 3d 20 69 50 61 67 65  t iFirst = iPage
29d70 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e  ;.  while( N-- >
29d80 20 30 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e   0 ){.    unsign
29d90 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 3b 0a  ed char *pOvfl;.
29da0 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 31 20      if( iPage<1 
29db0 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
29dc0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
29dd0 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
29de0 20 20 20 22 25 64 20 6f 66 20 25 64 20 70 61 67     "%d of %d pag
29df0 65 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  es missing from 
29e00 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 73 74  overflow list st
29e10 61 72 74 69 6e 67 20 61 74 20 25 64 22 2c 0a 20  arting at %d",. 
29e20 20 20 20 20 20 20 20 20 20 4e 2b 31 2c 20 65 78           N+1, ex
29e30 70 65 63 74 65 64 2c 20 69 46 69 72 73 74 29 3b  pected, iFirst);
29e40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
29e50 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63    }.    if( chec
29e60 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61  kRef(pCheck, iPa
29e70 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29 20  ge, zContext) ) 
29e80 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73  break;.    if( s
29e90 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
29ea0 70 43 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20  pCheck->pPager, 
29eb0 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 28 76 6f  (Pgno)iPage, (vo
29ec0 69 64 2a 2a 29 26 70 4f 76 66 6c 29 20 29 7b 0a  id**)&pOvfl) ){.
29ed0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
29ee0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
29ef0 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74  ntext, "failed t
29f00 6f 20 67 65 74 20 70 61 67 65 20 25 64 22 2c 20  o get page %d", 
29f10 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72  iPage);.      br
29f20 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
29f30 66 28 20 69 73 46 72 65 65 4c 69 73 74 20 29 7b  f( isFreeList ){
29f40 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 67  .      int n = g
29f50 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 5b 34  et4byte(&pOvfl[4
29f60 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
29f70 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
29f80 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  UM.      if( pCh
29f90 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
29fa0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
29fb0 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
29fc0 63 6b 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41  ck, iPage, PTRMA
29fd0 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a  P_FREEPAGE, 0, z
29fe0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
29ff0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
2a000 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74  f( n>pCheck->pBt
2a010 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38  ->usableSize/4-8
2a020 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
2a030 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
2a040 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20  k, zContext,.   
2a050 20 20 20 20 20 20 20 20 22 66 72 65 65 6c 69 73          "freelis
2a060 74 20 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f  t leaf count too
2a070 20 62 69 67 20 6f 6e 20 70 61 67 65 20 25 64 22   big on page %d"
2a080 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
2a090 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c    N--;.      }el
2a0a0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
2a0b0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
2a0c0 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
2a0d0 46 72 65 65 50 61 67 65 20 3d 20 67 65 74 34 62  FreePage = get4b
2a0e0 79 74 65 28 26 70 4f 76 66 6c 5b 38 2b 69 2a 34  yte(&pOvfl[8+i*4
2a0f0 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
2a100 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2a110 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  UM.          if(
2a120 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75   pCheck->pBt->au
2a130 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2a140 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
2a150 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72 65  map(pCheck, iFre
2a160 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  ePage, PTRMAP_FR
2a170 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74  EEPAGE, 0, zCont
2a180 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ext);.          
2a190 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
2a1a0 20 20 20 63 68 65 63 6b 52 65 66 28 70 43 68 65     checkRef(pChe
2a1b0 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 7a  ck, iFreePage, z
2a1c0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
2a1d0 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d    }.        N -=
2a1e0 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
2a1f0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
2a200 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2a210 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
2a220 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
2a230 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
2a240 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69 50  to-vacuum and iP
2a250 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  age is not the l
2a260 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ast.      ** pag
2a270 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66 6c  e in this overfl
2a280 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20 74  ow list, check t
2a290 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hat the pointer-
2a2a0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
2a2b0 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
2a2c0 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68 65  wing page matche
2a2d0 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20 2a  s iPage..      *
2a2e0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65  /.      if( pChe
2a2f0 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
2a300 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20  uum && N>0 ){.  
2a310 20 20 20 20 20 20 69 20 3d 20 67 65 74 34 62 79        i = get4by
2a320 74 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  te(pOvfl);.     
2a330 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
2a340 43 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50  Check, i, PTRMAP
2a350 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50 61 67  _OVERFLOW2, iPag
2a360 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
2a370 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
2a380 69 66 0a 20 20 20 20 69 50 61 67 65 20 3d 20 67  if.    iPage = g
2a390 65 74 34 62 79 74 65 28 70 4f 76 66 6c 29 3b 0a  et4byte(pOvfl);.
2a3a0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
2a3b0 5f 75 6e 72 65 66 28 70 4f 76 66 6c 29 3b 0a 20  _unref(pOvfl);. 
2a3c0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
2a3d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
2a3e0 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
2a3f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a400 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
2a410 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69  CK./*.** Do vari
2a420 6f 75 73 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ous sanity check
2a430 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61  s on a single pa
2a440 67 65 20 6f 66 20 61 20 74 72 65 65 2e 20 20 52  ge of a tree.  R
2a450 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65  eturn.** the tre
2a460 65 20 64 65 70 74 68 2e 20 20 52 6f 6f 74 20 70  e depth.  Root p
2a470 61 67 65 73 20 72 65 74 75 72 6e 20 30 2e 20 20  ages return 0.  
2a480 50 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20  Parents of root 
2a490 70 61 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20  pages.** return 
2a4a0 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  1, and so forth.
2a4b0 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63 68  .** .** These ch
2a4c0 65 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a  ecks are done:.*
2a4d0 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d 61  *.**      1.  Ma
2a4e0 6b 65 20 73 75 72 65 20 74 68 61 74 20 63 65 6c  ke sure that cel
2a4f0 6c 73 20 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b  ls and freeblock
2a500 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70  s do not overlap
2a510 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 62 75 74  .**          but
2a520 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70   combine to comp
2a530 6c 65 74 65 6c 79 20 63 6f 76 65 72 20 74 68 65  letely cover the
2a540 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32   page..**  NO  2
2a550 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 63 65 6c  .  Make sure cel
2a560 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 20 6f 72  l keys are in or
2a570 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20  der..**  NO  3. 
2a580 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65   Make sure no ke
2a590 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  y is less than o
2a5a0 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65  r equal to zLowe
2a5b0 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20  rBound..**  NO  
2a5c0 34 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f  4.  Make sure no
2a5d0 20 6b 65 79 20 69 73 20 67 72 65 61 74 65 72 20   key is greater 
2a5e0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
2a5f0 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a   zUpperBound..**
2a600 20 20 20 20 20 20 35 2e 20 20 43 68 65 63 6b 20        5.  Check 
2a610 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
2a620 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
2a630 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20 52 65 63  .**      6.  Rec
2a640 75 72 73 69 76 65 6c 79 20 63 61 6c 6c 20 63 68  ursively call ch
2a650 65 63 6b 54 72 65 65 50 61 67 65 20 6f 6e 20 61  eckTreePage on a
2a660 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20  ll children..** 
2a670 20 20 20 20 20 37 2e 20 20 56 65 72 69 66 79 20       7.  Verify 
2a680 74 68 61 74 20 74 68 65 20 64 65 70 74 68 20 6f  that the depth o
2a690 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69  f all children i
2a6a0 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20  s the same..**  
2a6b0 20 20 20 20 38 2e 20 20 4d 61 6b 65 20 73 75 72      8.  Make sur
2a6c0 65 20 74 68 69 73 20 70 61 67 65 20 69 73 20 61  e this page is a
2a6d0 74 20 6c 65 61 73 74 20 33 33 25 20 66 75 6c 6c  t least 33% full
2a6e0 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 0a 2a   or else it is.*
2a6f0 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72  *          the r
2a700 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e  oot of the tree.
2a710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2a720 68 65 63 6b 54 72 65 65 50 61 67 65 28 0a 20 20  heckTreePage(.  
2a730 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
2a740 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74  eck,  /* Context
2a750 20 66 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20   for the sanity 
2a760 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69  check */.  int i
2a770 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
2a780 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2a790 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 63  of the page to c
2a7a0 68 65 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  heck */.  MemPag
2a7b0 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  e *pParent,     
2a7c0 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 2a  /* Parent page *
2a7d0 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  /.  char *zParen
2a7e0 74 43 6f 6e 74 65 78 74 2c 20 2f 2a 20 50 61 72  tContext, /* Par
2a7f0 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ent context */. 
2a800 20 63 68 61 72 20 2a 7a 4c 6f 77 65 72 42 6f 75   char *zLowerBou
2a810 6e 64 2c 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65  nd,    /* All ke
2a820 79 73 20 73 68 6f 75 6c 64 20 62 65 20 67 72 65  ys should be gre
2a830 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
2a840 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20  if not NULL */. 
2a850 20 69 6e 74 20 6e 4c 6f 77 65 72 2c 20 20 20 20   int nLower,    
2a860 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2a870 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
2a880 6e 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 20 2a 2f  n zLowerBound */
2a890 0a 20 20 63 68 61 72 20 2a 7a 55 70 70 65 72 42  .  char *zUpperB
2a8a0 6f 75 6e 64 2c 20 20 20 20 2f 2a 20 41 6c 6c 20  ound,    /* All 
2a8b0 6b 65 79 73 20 73 68 6f 75 6c 64 20 62 65 20 6c  keys should be l
2a8c0 65 73 73 20 74 68 61 6e 20 74 68 69 73 2c 20 69  ess than this, i
2a8d0 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20  f not NULL */.  
2a8e0 69 6e 74 20 6e 55 70 70 65 72 20 20 20 20 20 20  int nUpper      
2a8f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a900 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
2a910 20 7a 55 70 70 65 72 42 6f 75 6e 64 20 2a 2f 0a   zUpperBound */.
2a920 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2a930 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63  age;.  int i, rc
2a940 2c 20 64 65 70 74 68 2c 20 64 32 2c 20 70 67 6e  , depth, d2, pgn
2a950 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64  o, cnt;.  int hd
2a960 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20  r, cellStart;.  
2a970 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20  int nCell;.  u8 
2a980 2a 64 61 74 61 3b 0a 20 20 42 74 43 75 72 73 6f  *data;.  BtCurso
2a990 72 20 63 75 72 3b 0a 20 20 42 74 72 65 65 20 2a  r cur;.  Btree *
2a9a0 70 42 74 3b 0a 20 20 69 6e 74 20 6d 61 78 4c 6f  pBt;.  int maxLo
2a9b0 63 61 6c 2c 20 75 73 61 62 6c 65 53 69 7a 65 3b  cal, usableSize;
2a9c0 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65 78 74  .  char zContext
2a9d0 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68  [100];.  char *h
2a9e0 69 74 3b 0a 0a 20 20 73 70 72 69 6e 74 66 28 7a  it;..  sprintf(z
2a9f0 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25  Context, "Page %
2aa00 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20  d: ", iPage);.. 
2aa10 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2aa20 68 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20  he page exists. 
2aa30 20 2a 2f 0a 20 20 63 75 72 2e 70 42 74 20 3d 20   */.  cur.pBt = 
2aa40 70 42 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42  pBt = pCheck->pB
2aa50 74 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  t;.  usableSize 
2aa60 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2aa70 65 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d  e;.  if( iPage==
2aa80 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
2aa90 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68  if( checkRef(pCh
2aaa0 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61 72  eck, iPage, zPar
2aab0 65 6e 74 43 6f 6e 74 65 78 74 29 20 29 20 72 65  entContext) ) re
2aac0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 72  turn 0;.  if( (r
2aad0 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
2aae0 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70   (Pgno)iPage, &p
2aaf0 50 61 67 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  Page))!=0 ){.   
2ab00 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
2ab10 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
2ab20 2c 0a 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  ,.       "unable
2ab30 20 74 6f 20 67 65 74 20 74 68 65 20 70 61 67 65   to get the page
2ab40 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 22  . error code=%d"
2ab50 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72  , rc);.    retur
2ab60 6e 20 30 3b 0a 20 20 7d 0a 20 20 6d 61 78 4c 6f  n 0;.  }.  maxLo
2ab70 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  cal = pPage->lea
2ab80 66 44 61 74 61 20 3f 20 70 42 74 2d 3e 6d 61 78  fData ? pBt->max
2ab90 4c 65 61 66 20 3a 20 70 42 74 2d 3e 6d 61 78 4c  Leaf : pBt->maxL
2aba0 6f 63 61 6c 3b 0a 20 20 69 66 28 20 28 72 63 20  ocal;.  if( (rc 
2abb0 3d 20 69 6e 69 74 50 61 67 65 28 70 50 61 67 65  = initPage(pPage
2abc0 2c 20 70 50 61 72 65 6e 74 29 29 21 3d 30 20 29  , pParent))!=0 )
2abd0 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
2abe0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
2abf0 6e 74 65 78 74 2c 20 22 69 6e 69 74 50 61 67 65  ntext, "initPage
2ac00 28 29 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72  () returns error
2ac10 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29 3b 0a   code %d", rc);.
2ac20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2ac30 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  pPage);.    retu
2ac40 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
2ac50 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74 68  Check out all th
2ac60 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20  e cells..  */.  
2ac70 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 63 75 72  depth = 0;.  cur
2ac80 2e 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  .pPage = pPage;.
2ac90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
2aca0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
2acb0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  .    u8 *pCell;.
2acc0 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
2acd0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
2ace0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79      /* Check pay
2acf0 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  load overflow pa
2ad00 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ges.    */.    s
2ad10 70 72 69 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c  printf(zContext,
2ad20 20 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25   "On tree page %
2ad30 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50  d cell %d: ", iP
2ad40 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65  age, i);.    pCe
2ad50 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
2ad60 61 67 65 2c 69 29 3b 0a 20 20 20 20 70 61 72 73  age,i);.    pars
2ad70 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
2ad80 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
2ad90 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61     sz = info.nDa
2ada0 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  ta;.    if( !pPa
2adb0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20  ge->intKey ) sz 
2adc0 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  += info.nKey;.  
2add0 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c    if( sz>info.nL
2ade0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e  ocal ){.      in
2adf0 74 20 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d 20  t nPage = (sz - 
2ae00 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73  info.nLocal + us
2ae10 61 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28 75  ableSize - 5)/(u
2ae20 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
2ae30 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f        Pgno pgnoO
2ae40 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
2ae50 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
2ae60 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20  flow]);.#ifndef 
2ae70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2ae80 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
2ae90 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2aea0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
2aeb0 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
2aec0 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50  pgnoOvfl, PTRMAP
2aed0 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50 61 67  _OVERFLOW1, iPag
2aee0 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
2aef0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2af00 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70 43 68     checkList(pCh
2af10 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c  eck, 0, pgnoOvfl
2af20 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , nPage, zContex
2af30 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  t);.    }..    /
2af40 2a 20 43 68 65 63 6b 20 73 61 6e 69 74 79 20 6f  * Check sanity o
2af50 66 20 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67  f left child pag
2af60 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2af70 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2af80 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  {.      pgno = g
2af90 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
2afa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2afb0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2afc0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
2afd0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2afe0 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
2aff0 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54  pCheck, pgno, PT
2b000 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67  RMAP_BTREE, iPag
2b010 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
2b020 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2b030 20 20 20 64 32 20 3d 20 63 68 65 63 6b 54 72 65     d2 = checkTre
2b040 65 50 61 67 65 28 70 43 68 65 63 6b 2c 70 67 6e  ePage(pCheck,pgn
2b050 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74  o,pPage,zContext
2b060 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20  ,0,0,0,0);.     
2b070 20 69 66 28 20 69 3e 30 20 26 26 20 64 32 21 3d   if( i>0 && d2!=
2b080 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 20  depth ){.       
2b090 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
2b0a0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
2b0b0 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20 64 65  , "Child page de
2b0c0 70 74 68 20 64 69 66 66 65 72 73 22 29 3b 0a 20  pth differs");. 
2b0d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 70       }.      dep
2b0e0 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20  th = d2;.    }. 
2b0f0 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
2b100 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
2b110 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
2b120 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2b130 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2b140 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 43 6f  .    sprintf(zCo
2b150 6e 74 65 78 74 2c 20 22 4f 6e 20 70 61 67 65 20  ntext, "On page 
2b160 25 64 20 61 74 20 72 69 67 68 74 20 63 68 69 6c  %d at right chil
2b170 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69  d: ", iPage);.#i
2b180 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b190 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2b1a0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2b1b0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68  cuum ){.      ch
2b1c0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
2b1d0 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  , pgno, PTRMAP_B
2b1e0 54 52 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b  TREE, iPage, 0);
2b1f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2b200 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28    checkTreePage(
2b210 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50  pCheck, pgno, pP
2b220 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 2c 30 2c  age, zContext,0,
2b230 30 2c 30 2c 30 29 3b 0a 20 20 7d 0a 20 0a 20 20  0,0,0);.  }. .  
2b240 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d  /* Check for com
2b250 70 6c 65 74 65 20 63 6f 76 65 72 61 67 65 20 6f  plete coverage o
2b260 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a  f the page.  */.
2b270 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2b280 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
2b290 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
2b2a0 0a 20 20 68 69 74 20 3d 20 73 71 6c 69 74 65 4d  .  hit = sqliteM
2b2b0 61 6c 6c 6f 63 28 20 75 73 61 62 6c 65 53 69 7a  alloc( usableSiz
2b2c0 65 20 29 3b 0a 20 20 69 66 28 20 68 69 74 20 29  e );.  if( hit )
2b2d0 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74  {.    memset(hit
2b2e0 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28 26 64  , 1, get2byte(&d
2b2f0 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20  ata[hdr+5]));.  
2b300 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79    nCell = get2by
2b310 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
2b320 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20  ;.    cellStart 
2b330 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
2b340 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
2b350 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
2b360 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
2b370 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
2b380 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b  &data[cellStart+
2b390 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  i*2]);.      int
2b3a0 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65   size = cellSize
2b3b0 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
2b3c0 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  [pc]);.      int
2b3d0 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   j;.      if( (p
2b3e0 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c  c+size-1)>=usabl
2b3f0 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b  eSize || pc<0 ){
2b400 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
2b410 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
2b420 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
2b430 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65  "Corruption dete
2b440 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20  cted in cell %d 
2b450 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50  on page %d",i,iP
2b460 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  age,0);.      }e
2b470 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
2b480 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e  (j=pc+size-1; j>
2b490 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d  =pc; j--) hit[j]
2b4a0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
2b4b0 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c  }.    for(cnt=0,
2b4c0 20 69 3d 67 65 74 32 62 79 74 65 28 26 64 61 74   i=get2byte(&dat
2b4d0 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26  a[hdr+1]); i>0 &
2b4e0 26 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26  & i<usableSize &
2b4f0 26 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20  & cnt<10000; .  
2b500 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b           cnt++){
2b510 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
2b520 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
2b530 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e  [i+2]);.      in
2b540 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28  t j;.      if( (
2b550 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c  i+size-1)>=usabl
2b560 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a  eSize || i<0 ){.
2b570 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
2b580 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
2b590 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,  .            
2b5a0 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65  "Corruption dete
2b5b0 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20  cted in cell %d 
2b5c0 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50  on page %d",i,iP
2b5d0 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  age,0);.      }e
2b5e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
2b5f0 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d  (j=i+size-1; j>=
2b600 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b  i; j--) hit[j]++
2b610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b620 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  i = get2byte(&da
2b630 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ta[i]);.    }.  
2b640 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69    for(i=cnt=0; i
2b650 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b  <usableSize; i++
2b660 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69 74  ){.      if( hit
2b670 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
2b680 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d    cnt++;.      }
2b690 65 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e  else if( hit[i]>
2b6a0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  1 ){.        che
2b6b0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
2b6c0 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ck, 0,.         
2b6d0 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20   "Multiple uses 
2b6e0 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70  for byte %d of p
2b6f0 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67  age %d", i, iPag
2b700 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
2b710 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2b720 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61  .    if( cnt!=da
2b730 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20  ta[hdr+7] ){.   
2b740 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
2b750 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  g(pCheck, 0, .  
2b760 20 20 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e          "Fragmen
2b770 74 65 64 20 73 70 61 63 65 20 69 73 20 25 64 20  ted space is %d 
2b780 62 79 74 65 20 72 65 70 6f 72 74 65 64 20 61 73  byte reported as
2b790 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c   %d on page %d",
2b7a0 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20  .          cnt, 
2b7b0 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61  data[hdr+7], iPa
2b7c0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
2b7d0 20 73 71 6c 69 74 65 46 72 65 65 28 68 69 74 29   sqliteFree(hit)
2b7e0 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ;..  releasePage
2b7f0 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
2b800 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e  n depth+1;.}.#en
2b810 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2b820 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
2b830 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
2b840 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
2b850 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
2b860 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
2b870 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68  es a complete ch
2b880 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e  eck of the given
2b890 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52   BTree file.  aR
2b8a0 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61  oot[] is.** an a
2b8b0 72 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75  rray of pages nu
2b8c0 6d 62 65 72 73 20 77 65 72 65 20 65 61 63 68 20  mbers were each 
2b8d0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74  page number is t
2b8e0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a  he root page of.
2b8f0 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f  ** a table.  nRo
2b900 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ot is the number
2b910 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
2b920 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Root..**.** If e
2b930 76 65 72 79 74 68 69 6e 67 20 63 68 65 63 6b 73  verything checks
2b940 20 6f 75 74 2c 20 74 68 69 73 20 72 6f 75 74 69   out, this routi
2b950 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
2b960 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 69    If something i
2b970 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e 20 65  s.** amiss, an e
2b980 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2b990 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d  written into mem
2b9a0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
2b9b0 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e  m malloc().** an
2b9c0 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
2b9d0 68 61 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67  hat error messag
2b9e0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
2b9f0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2ba00 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
2ba10 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69  nsible for freei
2ba20 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  ng the error mes
2ba30 73 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  sage when it is 
2ba40 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  done..*/.char *s
2ba50 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
2ba60 72 69 74 79 43 68 65 63 6b 28 42 74 72 65 65 20  rityCheck(Btree 
2ba70 2a 70 42 74 2c 20 69 6e 74 20 2a 61 52 6f 6f 74  *pBt, int *aRoot
2ba80 2c 20 69 6e 74 20 6e 52 6f 6f 74 29 7b 0a 20 20  , int nRoot){.  
2ba90 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65  int i;.  int nRe
2baa0 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  f;.  IntegrityCk
2bab0 20 73 43 68 65 63 6b 3b 0a 0a 20 20 6e 52 65 66   sCheck;..  nRef
2bac0 20 3d 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72   = *sqlite3pager
2bad0 5f 73 74 61 74 73 28 70 42 74 2d 3e 70 50 61 67  _stats(pBt->pPag
2bae0 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42  er);.  if( lockB
2baf0 74 72 65 65 28 70 42 74 29 21 3d 53 51 4c 49 54  tree(pBt)!=SQLIT
2bb00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
2bb10 72 6e 20 73 71 6c 69 74 65 53 74 72 44 75 70 28  rn sqliteStrDup(
2bb20 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71 75 69  "Unable to acqui
2bb30 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  re a read lock o
2bb40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 22 29  n the database")
2bb50 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70  ;.  }.  sCheck.p
2bb60 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43 68 65  Bt = pBt;.  sChe
2bb70 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74 2d  ck.pPager = pBt-
2bb80 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68 65 63  >pPager;.  sChec
2bb90 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65  k.nPage = sqlite
2bba0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
2bbb0 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29 3b  (sCheck.pPager);
2bbc0 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 50  .  if( sCheck.nP
2bbd0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e  age==0 ){.    un
2bbe0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
2bbf0 64 28 70 42 74 29 3b 0a 20 20 20 20 72 65 74 75  d(pBt);.    retu
2bc00 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68 65  rn 0;.  }.  sChe
2bc10 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69 74  ck.anRef = sqlit
2bc20 65 4d 61 6c 6c 6f 63 52 61 77 28 20 28 73 43 68  eMallocRaw( (sCh
2bc30 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a  eck.nPage+1)*siz
2bc40 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66  eof(sCheck.anRef
2bc50 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21 73  [0]) );.  if( !s
2bc60 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20  Check.anRef ){. 
2bc70 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
2bc80 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
2bc90 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d   return sqlite3M
2bca0 50 72 69 6e 74 66 28 22 55 6e 61 62 6c 65 20 74  Printf("Unable t
2bcb0 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79 74 65  o malloc %d byte
2bcc0 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28 73 43  s", .        (sC
2bcd0 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69  heck.nPage+1)*si
2bce0 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65  zeof(sCheck.anRe
2bcf0 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 66 6f  f[0]));.  }.  fo
2bd00 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b  r(i=0; i<=sCheck
2bd10 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43  .nPage; i++){ sC
2bd20 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20  heck.anRef[i] = 
2bd30 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49  0; }.  i = PENDI
2bd40 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2bd50 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43 68 65  );.  if( i<=sChe
2bd60 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  ck.nPage ){.    
2bd70 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20  sCheck.anRef[i] 
2bd80 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63  = 1;.  }.  sChec
2bd90 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a  k.zErrMsg = 0;..
2bda0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 69    /* Check the i
2bdb0 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20  ntegrity of the 
2bdc0 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20  freelist.  */.  
2bdd0 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65 63  checkList(&sChec
2bde0 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28 26  k, 1, get4byte(&
2bdf0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
2be00 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20 20  ta[32]),.       
2be10 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
2be20 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
2be30 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72  a[36]), "Main fr
2be40 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f  eelist: ");..  /
2be50 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65 20  * Check all the 
2be60 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
2be70 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 3b  or(i=0; i<nRoot;
2be80 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
2be90 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  Root[i]==0 ) con
2bea0 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53  tinue;.#ifndef S
2beb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2bec0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
2bed0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
2bee0 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20   aRoot[i]>1 ){. 
2bef0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
2bf00 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b  (&sCheck, aRoot[
2bf10 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  i], PTRMAP_ROOTP
2bf20 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  AGE, 0, 0);.    
2bf30 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65  }.#endif.    che
2bf40 63 6b 54 72 65 65 50 61 67 65 28 26 73 43 68 65  ckTreePage(&sChe
2bf50 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c  ck, aRoot[i], 0,
2bf60 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20 72   "List of tree r
2bf70 6f 6f 74 73 3a 20 22 2c 20 30 2c 30 2c 30 2c 30  oots: ", 0,0,0,0
2bf80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  );.  }..  /* Mak
2bf90 65 20 73 75 72 65 20 65 76 65 72 79 20 70 61 67  e sure every pag
2bfa0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  e in the file is
2bfb0 20 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f   referenced.  */
2bfc0 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73  .  for(i=1; i<=s
2bfd0 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b  Check.nPage; i++
2bfe0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
2bff0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2c000 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
2c010 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20  anRef[i]==0 ){. 
2c020 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
2c030 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20  Msg(&sCheck, 0, 
2c040 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65  "Page %d is neve
2c050 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20  r used", i);.   
2c060 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20   }.#else.    /* 
2c070 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2c080 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
2c090 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20  cuum, make sure 
2c0a0 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69  no tables contai
2c0b0 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  n.    ** referen
2c0c0 63 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d  ces to pointer-m
2c0d0 61 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f  ap pages..    */
2c0e0 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
2c0f0 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a  anRef[i]==0 && .
2c100 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50         (PTRMAP_P
2c110 41 47 45 4e 4f 28 70 42 74 2d 3e 75 73 61 62 6c  AGENO(pBt->usabl
2c120 65 53 69 7a 65 2c 20 69 29 21 3d 69 20 7c 7c 20  eSize, i)!=i || 
2c130 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
2c140 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ) ){.      check
2c150 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63  AppendMsg(&sChec
2c160 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20 69  k, 0, "Page %d i
2c170 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69  s never used", i
2c180 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2c190 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
2c1a0 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28  !=0 && .       (
2c1b0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
2c1c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2c 20 69  t->usableSize, i
2c1d0 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74  )==i && pBt->aut
2c1e0 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
2c1f0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
2c200 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f  (&sCheck, 0, "Po
2c210 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 25  inter map page %
2c220 64 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 22  d is referenced"
2c230 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , i);.    }.#end
2c240 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  if.  }..  /* Mak
2c250 65 20 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c  e sure this anal
2c260 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61  ysis did not lea
2c270 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70  ve any unref() p
2c280 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f  ages.  */.  unlo
2c290 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
2c2a0 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66  pBt);.  if( nRef
2c2b0 20 21 3d 20 2a 73 71 6c 69 74 65 33 70 61 67 65   != *sqlite3page
2c2c0 72 5f 73 74 61 74 73 28 70 42 74 2d 3e 70 50 61  r_stats(pBt->pPa
2c2d0 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65 63  ger) ){.    chec
2c2e0 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
2c2f0 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 4f  ck, 0, .      "O
2c300 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
2c310 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20  count goes from 
2c320 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67 20  %d to %d during 
2c330 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a  this analysis",.
2c340 20 20 20 20 20 20 6e 52 65 66 2c 20 2a 73 71 6c        nRef, *sql
2c350 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28  ite3pager_stats(
2c360 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20 20  pBt->pPager).   
2c370 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   );.  }..  /* Cl
2c380 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f  ean  up and repo
2c390 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  rt errors..  */.
2c3a0 20 20 73 71 6c 69 74 65 46 72 65 65 28 73 43 68    sqliteFree(sCh
2c3b0 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 72 65  eck.anRef);.  re
2c3c0 74 75 72 6e 20 73 43 68 65 63 6b 2e 7a 45 72 72  turn sCheck.zErr
2c3d0 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Msg;.}.#endif /*
2c3e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
2c3f0 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
2c400 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2c410 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
2c420 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
2c430 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  g database file.
2c440 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
2c450 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
2c460 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  ilename(Btree *p
2c470 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Bt){.  assert( p
2c480 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
2c490 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2c4a0 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28  3pager_filename(
2c4b0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
2c4c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2c4d0 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  e pathname of th
2c4e0 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
2c4f0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
2c500 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
2c510 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
2c520 74 65 33 42 74 72 65 65 47 65 74 44 69 72 6e 61  te3BtreeGetDirna
2c530 6d 65 28 42 74 72 65 65 20 2a 70 42 74 29 7b 0a  me(Btree *pBt){.
2c540 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
2c550 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65  Pager!=0 );.  re
2c560 74 75 72 6e 20 73 71 6c 69 74 65 33 70 61 67 65  turn sqlite3page
2c570 72 5f 64 69 72 6e 61 6d 65 28 70 42 74 2d 3e 70  r_dirname(pBt->p
2c580 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
2c590 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   Return the path
2c5a0 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
2c5b0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69  nal file for thi
2c5c0 73 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  s database. The 
2c5d0 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20  return.** value 
2c5e0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
2c5f0 69 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 61  is the same rega
2c600 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2c610 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
2c620 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
2c630 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a  reated or not..*
2c640 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
2c650 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
2c660 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a  rnalname(Btree *
2c670 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
2c680 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
2c690 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
2c6a0 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e  e3pager_journaln
2c6b0 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ame(pBt->pPager)
2c6c0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
2c6d0 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a  ITE_OMIT_VACUUM.
2c6e0 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63  /*.** Copy the c
2c6f0 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
2c700 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20  of pBtFrom into 
2c710 70 42 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61  pBtTo.  A transa
2c720 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65  ction.** must be
2c730 20 61 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68   active for both
2c740 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   files..**.** Th
2c750 65 20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70  e size of file p
2c760 42 74 46 72 6f 6d 20 6d 61 79 20 62 65 20 72 65  BtFrom may be re
2c770 64 75 63 65 64 20 62 79 20 74 68 69 73 20 6f 70  duced by this op
2c780 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61  eration..** If a
2c790 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
2c7a0 6e 67 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  ng, the transact
2c7b0 69 6f 6e 20 6f 6e 20 70 42 74 46 72 6f 6d 20 69  ion on pBtFrom i
2c7c0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
2c7d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2c7e0 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65  eeCopyFile(Btree
2c7f0 20 2a 70 42 74 54 6f 2c 20 42 74 72 65 65 20 2a   *pBtTo, Btree *
2c800 70 42 74 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20  pBtFrom){.  int 
2c810 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c820 20 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67 65 2c    Pgno i, nPage,
2c830 20 6e 54 6f 50 61 67 65 3b 0a 0a 20 20 69 66 28   nToPage;..  if(
2c840 20 70 42 74 54 6f 2d 3e 69 6e 54 72 61 6e 73 21   pBtTo->inTrans!
2c850 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
2c860 70 42 74 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73  pBtFrom->inTrans
2c870 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2c880 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2c890 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2c8a0 69 66 28 20 70 42 74 54 6f 2d 3e 70 43 75 72 73  if( pBtTo->pCurs
2c8b0 6f 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  or ) return SQLI
2c8c0 54 45 5f 42 55 53 59 3b 0a 20 20 6e 54 6f 50 61  TE_BUSY;.  nToPa
2c8d0 67 65 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  ge = sqlite3page
2c8e0 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 54  r_pagecount(pBtT
2c8f0 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 6e 50  o->pPager);.  nP
2c900 61 67 65 20 3d 20 73 71 6c 69 74 65 33 70 61 67  age = sqlite3pag
2c910 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74  er_pagecount(pBt
2c920 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a 20  From->pPager);. 
2c930 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51   for(i=1; rc==SQ
2c940 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 50  LITE_OK && i<=nP
2c950 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76  age; i++){.    v
2c960 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  oid *pPage;.    
2c970 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
2c980 72 5f 67 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70  r_get(pBtFrom->p
2c990 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65  Pager, i, &pPage
2c9a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2c9b0 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20  break;.    rc = 
2c9c0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65  sqlite3pager_ove
2c9d0 72 77 72 69 74 65 28 70 42 74 54 6f 2d 3e 70 50  rwrite(pBtTo->pP
2c9e0 61 67 65 72 2c 20 69 2c 20 70 50 61 67 65 29 3b  ager, i, pPage);
2c9f0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
2ca00 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eak;.    sqlite3
2ca10 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67  pager_unref(pPag
2ca20 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
2ca30 6e 50 61 67 65 2b 31 3b 20 72 63 3d 3d 53 51 4c  nPage+1; rc==SQL
2ca40 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 54 6f  ITE_OK && i<=nTo
2ca50 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
2ca60 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20  void *pPage;.   
2ca70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
2ca80 65 72 5f 67 65 74 28 70 42 74 54 6f 2d 3e 70 50  er_get(pBtTo->pP
2ca90 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29  ager, i, &pPage)
2caa0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
2cab0 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73  reak;.    rc = s
2cac0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
2cad0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71  e(pPage);.    sq
2cae0 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
2caf0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c  (pPage);.    sql
2cb00 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77  ite3pager_dont_w
2cb10 72 69 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67  rite(pBtTo->pPag
2cb20 65 72 2c 20 69 29 3b 0a 20 20 7d 0a 20 20 69 66  er, i);.  }.  if
2cb30 28 20 21 72 63 20 26 26 20 6e 50 61 67 65 3c 6e  ( !rc && nPage<n
2cb40 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 72 63  ToPage ){.    rc
2cb50 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
2cb60 74 72 75 6e 63 61 74 65 28 70 42 74 54 6f 2d 3e  truncate(pBtTo->
2cb70 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
2cb80 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a    }.  if( rc ){.
2cb90 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2cba0 52 6f 6c 6c 62 61 63 6b 28 70 42 74 54 6f 29 3b  Rollback(pBtTo);
2cbb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2cbc0 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
2cbd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
2cbe0 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UM */../*.** Ret
2cbf0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
2cc00 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
2cc10 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
2cc20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
2cc30 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 42 74  Trans(Btree *pBt
2cc40 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 42 74  ){.  return (pBt
2cc50 20 26 26 20 28 70 42 74 2d 3e 69 6e 54 72 61 6e   && (pBt->inTran
2cc60 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 29  s==TRANS_WRITE))
2cc70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2cc80 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20  n non-zero if a 
2cc90 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
2cca0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2ccb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2ccc0 74 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74 72  treeIsInStmt(Btr
2ccd0 65 65 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75  ee *pBt){.  retu
2cce0 72 6e 20 28 70 42 74 20 26 26 20 70 42 74 2d 3e  rn (pBt && pBt->
2ccf0 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  inStmt);.}../*.*
2cd00 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
2cd10 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
2cd20 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
2cd30 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
2cd40 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
2cd50 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
2cd60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cd70 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
2cd80 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
2cd90 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
2cda0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
2cdb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
2cdc0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
2cdd0 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
2cde0 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
2cdf0 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
2ce00 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
2ce10 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
2ce20 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
2ce30 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
2ce40 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
2ce50 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
2ce60 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
2ce70 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
2ce80 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
2ce90 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
2cea0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
2ceb0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
2cec0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2ced0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
2cee0 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
2cef0 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
2cf00 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
2cf10 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
2cf20 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
2cf30 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
2cf40 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
2cf50 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
2cf60 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
2cf70 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
2cf80 63 28 42 74 72 65 65 20 2a 70 42 74 2c 20 63 6f  c(Btree *pBt, co
2cf90 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
2cfa0 72 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  r){.  if( pBt->i
2cfb0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2cfc0 49 54 45 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ITE ){.#ifndef S
2cfd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2cfe0 41 43 55 55 4d 0a 20 20 20 20 50 67 6e 6f 20 6e  ACUUM.    Pgno n
2cff0 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20 69  Trunc = 0;.    i
2d000 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2d010 75 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  um ){.      int 
2d020 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
2d030 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54 72 75  ommit(pBt, &nTru
2d040 6e 63 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  nc); .      if( 
2d050 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2d060 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2d070 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
2d080 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 42  te3pager_sync(pB
2d090 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
2d0a0 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 23 65 6e  er, nTrunc);.#en
2d0b0 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 73  dif.    return s
2d0c0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
2d0d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
2d0e0 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  aster, 0);.  }. 
2d0f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d100 4b 3b 0a 7d 0a                                   K;.}.