System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact c5d6d02c71222ad2f4db2e123e6b7bfde30f599f:


0000: 23 70 72 61 67 6d 61 20 75 6e 6d 61 6e 61 67 65  #pragma unmanage
0010: 64 0a 65 78 74 65 72 6e 20 22 43 22 0a 7b 0a 20  d.extern "C".{. 
0020: 20 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69   /*.** 2004 Apri
0030: 6c 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75  l 6.**.** The au
0040: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63  thor disclaims c
0050: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73  opyright to this
0060: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49   source code.  I
0070: 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20  n place of.** a 
0080: 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65  legal notice, he
0090: 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67  re is a blessing
00a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79  :.**.**    May y
00b0: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e  ou do good and n
00c0: 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d  ot evil..**    M
00d0: 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67  ay you find forg
00e0: 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72  iveness for your
00f0: 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65  self and forgive
0100: 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d   others..**    M
0110: 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65  ay you share fre
0120: 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e  ely, never takin
0130: 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20  g more than you 
0140: 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  give..**.*******
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0190: 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65  **.** $Id: btree
01a0: 2e 63 2c 76 20 31 2e 36 20 32 30 30 35 2f 30 38  .c,v 1.6 2005/08
01b0: 2f 30 31 20 31 39 3a 33 32 3a 30 39 20 72 6d 73  /01 19:32:09 rms
01c0: 69 6d 70 73 6f 6e 20 45 78 70 20 24 0a 2a 2a 0a  impson Exp $.**.
01d0: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70  ** This file imp
01e0: 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65 72 6e  lements a extern
01f0: 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64 29 20  al (disk-based) 
0200: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 42  database using B
0210: 54 72 65 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 20  Trees..** For a 
0220: 64 65 74 61 69 6c 65 64 20 64 69 73 63 75 73 73  detailed discuss
0230: 69 6f 6e 20 6f 66 20 42 54 72 65 65 73 2c 20 72  ion of BTrees, r
0240: 65 66 65 72 20 74 6f 0a 2a 2a 0a 2a 2a 20 20 20  efer to.**.**   
0250: 20 20 44 6f 6e 61 6c 64 20 45 2e 20 4b 6e 75 74    Donald E. Knut
0260: 68 2c 20 54 48 45 20 41 52 54 20 4f 46 20 43 4f  h, THE ART OF CO
0270: 4d 50 55 54 45 52 20 50 52 4f 47 52 41 4d 4d 49  MPUTER PROGRAMMI
0280: 4e 47 2c 20 56 6f 6c 75 6d 65 20 33 3a 0a 2a 2a  NG, Volume 3:.**
0290: 20 20 20 20 20 22 53 6f 72 74 69 6e 67 20 41 6e       "Sorting An
02a0: 64 20 53 65 61 72 63 68 69 6e 67 22 2c 20 70 61  d Searching", pa
02b0: 67 65 73 20 34 37 33 2d 34 38 30 2e 20 41 64 64  ges 473-480. Add
02c0: 69 73 6f 6e 2d 57 65 73 6c 65 79 0a 2a 2a 20 20  ison-Wesley.**  
02d0: 20 20 20 50 75 62 6c 69 73 68 69 6e 67 20 43 6f     Publishing Co
02e0: 6d 70 61 6e 79 2c 20 52 65 61 64 69 6e 67 2c 20  mpany, Reading, 
02f0: 4d 61 73 73 61 63 68 75 73 65 74 74 73 2e 0a 2a  Massachusetts..*
0300: 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69  *.** The basic i
0310: 64 65 61 20 69 73 20 74 68 61 74 20 65 61 63 68  dea is that each
0320: 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
0330: 65 20 63 6f 6e 74 61 69 6e 73 20 4e 20 64 61 74  e contains N dat
0340: 61 62 61 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73  abase.** entries
0350: 20 61 6e 64 20 4e 2b 31 20 70 6f 69 6e 74 65 72   and N+1 pointer
0360: 73 20 74 6f 20 73 75 62 70 61 67 65 73 2e 0a 2a  s to subpages..*
0370: 2a 0a 2a 2a 20 20 20 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03b0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 7c 20 20  -------.**   |  
03c0: 50 74 72 28 30 29 20 7c 20 4b 65 79 28 30 29 20  Ptr(0) | Key(0) 
03d0: 7c 20 50 74 72 28 31 29 20 7c 20 4b 65 79 28 31  | Ptr(1) | Key(1
03e0: 29 20 7c 20 2e 2e 2e 20 7c 20 4b 65 79 28 4e 29  ) | ... | Key(N)
03f0: 20 7c 20 50 74 72 28 4e 2b 31 29 20 7c 0a 2a 2a   | Ptr(N+1) |.**
0400: 20 20 20 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0440: 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  ---.**.** All of
0450: 20 74 68 65 20 6b 65 79 73 20 6f 6e 20 74 68 65   the keys on the
0460: 20 70 61 67 65 20 74 68 61 74 20 50 74 72 28 30   page that Ptr(0
0470: 29 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 76 65  ) points to have
0480: 20 76 61 6c 75 65 73 20 6c 65 73 73 0a 2a 2a 20   values less.** 
0490: 74 68 61 6e 20 4b 65 79 28 30 29 2e 20 20 41 6c  than Key(0).  Al
04a0: 6c 20 6f 66 20 74 68 65 20 6b 65 79 73 20 6f 6e  l of the keys on
04b0: 20 70 61 67 65 20 50 74 72 28 31 29 20 61 6e 64   page Ptr(1) and
04c0: 20 69 74 73 20 73 75 62 70 61 67 65 73 20 68 61   its subpages ha
04d0: 76 65 0a 2a 2a 20 76 61 6c 75 65 73 20 67 72 65  ve.** values gre
04e0: 61 74 65 72 20 74 68 61 6e 20 4b 65 79 28 30 29  ater than Key(0)
04f0: 20 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 4b   and less than K
0500: 65 79 28 31 29 2e 20 20 41 6c 6c 20 6f 66 20 74  ey(1).  All of t
0510: 68 65 20 6b 65 79 73 0a 2a 2a 20 6f 6e 20 50 74  he keys.** on Pt
0520: 72 28 4e 2b 31 29 20 61 6e 64 20 69 74 73 20 73  r(N+1) and its s
0530: 75 62 70 61 67 65 73 20 68 61 76 65 20 76 61 6c  ubpages have val
0540: 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ues greater than
0550: 20 4b 65 79 28 4e 29 2e 20 20 41 6e 64 0a 2a 2a   Key(N).  And.**
0560: 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a   so forth..**.**
0570: 20 46 69 6e 64 69 6e 67 20 61 20 70 61 72 74 69   Finding a parti
0580: 63 75 6c 61 72 20 6b 65 79 20 72 65 71 75 69 72  cular key requir
0590: 65 73 20 72 65 61 64 69 6e 67 20 4f 28 6c 6f 67  es reading O(log
05a0: 28 4d 29 29 20 70 61 67 65 73 20 66 72 6f 6d 20  (M)) pages from 
05b0: 74 68 65 20 0a 2a 2a 20 64 69 73 6b 20 77 68 65  the .** disk whe
05c0: 72 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62  re M is the numb
05d0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
05e0: 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
05f0: 20 49 6e 20 74 68 69 73 20 69 6d 70 6c 65 6d 65   In this impleme
0600: 6e 74 61 74 69 6f 6e 2c 20 61 20 73 69 6e 67 6c  ntation, a singl
0610: 65 20 66 69 6c 65 20 63 61 6e 20 68 6f 6c 64 20  e file can hold 
0620: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  one or more sepa
0630: 72 61 74 65 20 0a 2a 2a 20 42 54 72 65 65 73 2e  rate .** BTrees.
0640: 20 20 45 61 63 68 20 42 54 72 65 65 20 69 73 20    Each BTree is 
0650: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
0660: 65 20 69 6e 64 65 78 20 6f 66 20 69 74 73 20 72  e index of its r
0670: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 0a 2a  oot page.  The.*
0680: 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 66  * key and data f
0690: 6f 72 20 61 6e 79 20 65 6e 74 72 79 20 61 72 65  or any entry are
06a0: 20 63 6f 6d 62 69 6e 65 64 20 74 6f 20 66 6f 72   combined to for
06b0: 6d 20 74 68 65 20 22 70 61 79 6c 6f 61 64 22 2e  m the "payload".
06c0: 20 20 41 0a 2a 2a 20 66 69 78 65 64 20 61 6d 6f    A.** fixed amo
06d0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 63  unt of payload c
06e0: 61 6e 20 62 65 20 63 61 72 72 69 65 64 20 64 69  an be carried di
06f0: 72 65 63 74 6c 79 20 6f 6e 20 74 68 65 20 64 61  rectly on the da
0700: 74 61 62 61 73 65 0a 2a 2a 20 70 61 67 65 2e 20  tabase.** page. 
0710: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
0720: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
0730: 68 65 20 70 72 65 73 65 74 20 61 6d 6f 75 6e 74  he preset amount
0740: 20 74 68 65 6e 20 73 75 72 70 6c 75 73 0a 2a 2a   then surplus.**
0750: 20 62 79 74 65 73 20 61 72 65 20 73 74 6f 72 65   bytes are store
0760: 64 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  d on overflow pa
0770: 67 65 73 2e 20 20 54 68 65 20 70 61 79 6c 6f 61  ges.  The payloa
0780: 64 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 0a 2a  d for an entry.*
0790: 2a 20 61 6e 64 20 74 68 65 20 70 72 65 63 65 64  * and the preced
07a0: 69 6e 67 20 70 6f 69 6e 74 65 72 20 61 72 65 20  ing pointer are 
07b0: 63 6f 6d 62 69 6e 65 64 20 74 6f 20 66 6f 72 6d  combined to form
07c0: 20 61 20 22 43 65 6c 6c 22 2e 20 20 45 61 63 68   a "Cell".  Each
07d0: 20 0a 2a 2a 20 70 61 67 65 20 68 61 73 20 61 20   .** page has a 
07e0: 73 6d 61 6c 6c 20 68 65 61 64 65 72 20 77 68 69  small header whi
07f0: 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ch contains the 
0800: 50 74 72 28 4e 2b 31 29 20 70 6f 69 6e 74 65 72  Ptr(N+1) pointer
0810: 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 69 6e   and other.** in
0820: 66 6f 72 6d 61 74 69 6f 6e 20 73 75 63 68 20 61  formation such a
0830: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 6b 65  s the size of ke
0840: 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a  y and data..**.*
0850: 2a 20 46 4f 52 4d 41 54 20 44 45 54 41 49 4c 53  * FORMAT DETAILS
0860: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  .**.** The file 
0870: 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
0880: 70 61 67 65 73 2e 20 20 54 68 65 20 66 69 72 73  pages.  The firs
0890: 74 20 70 61 67 65 20 69 73 20 63 61 6c 6c 65 64  t page is called
08a0: 20 70 61 67 65 20 31 2c 0a 2a 2a 20 74 68 65 20   page 1,.** the 
08b0: 73 65 63 6f 6e 64 20 69 73 20 70 61 67 65 20 32  second is page 2
08c0: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  , and so forth. 
08d0: 20 41 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   A page number o
08e0: 66 20 7a 65 72 6f 20 69 6e 64 69 63 61 74 65 73  f zero indicates
08f0: 0a 2a 2a 20 22 6e 6f 20 73 75 63 68 20 70 61 67  .** "no such pag
0900: 65 22 2e 20 20 54 68 65 20 70 61 67 65 20 73 69  e".  The page si
0910: 7a 65 20 63 61 6e 20 62 65 20 61 6e 79 74 68 69  ze can be anythi
0920: 6e 67 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  ng between 512 a
0930: 6e 64 20 36 35 35 33 36 2e 0a 2a 2a 20 45 61 63  nd 65536..** Eac
0940: 68 20 70 61 67 65 20 63 61 6e 20 62 65 20 65 69  h page can be ei
0950: 74 68 65 72 20 61 20 62 74 72 65 65 20 70 61 67  ther a btree pag
0960: 65 2c 20 61 20 66 72 65 65 6c 69 73 74 20 70 61  e, a freelist pa
0970: 67 65 20 6f 72 20 61 6e 20 6f 76 65 72 66 6c 6f  ge or an overflo
0980: 77 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  w.** page..**.**
0990: 20 54 68 65 20 66 69 72 73 74 20 70 61 67 65 20   The first page 
09a0: 69 73 20 61 6c 77 61 79 73 20 61 20 62 74 72 65  is always a btre
09b0: 65 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72  e page.  The fir
09c0: 73 74 20 31 30 30 20 62 79 74 65 73 20 6f 66 20  st 100 bytes of 
09d0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 70 61 67  the first.** pag
09e0: 65 20 63 6f 6e 74 61 69 6e 20 61 20 73 70 65 63  e contain a spec
09f0: 69 61 6c 20 68 65 61 64 65 72 20 28 74 68 65 20  ial header (the 
0a00: 22 66 69 6c 65 20 68 65 61 64 65 72 22 29 20 74  "file header") t
0a10: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
0a20: 65 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 66  e file..** The f
0a30: 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 66 69 6c  ormat of the fil
0a40: 65 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  e header is as f
0a50: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
0a60: 4f 46 46 53 45 54 20 20 20 53 49 5a 45 20 20 20  OFFSET   SIZE   
0a70: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
0a80: 20 20 20 20 20 30 20 20 20 20 20 20 31 36 20 20       0      16  
0a90: 20 20 20 48 65 61 64 65 72 20 73 74 72 69 6e 67     Header string
0aa0: 3a 20 22 53 51 4c 69 74 65 20 66 6f 72 6d 61 74  : "SQLite format
0ab0: 20 33 5c 30 30 30 22 0a 2a 2a 20 20 20 20 20 31   3\000".**     1
0ac0: 36 20 20 20 20 20 20 20 32 20 20 20 20 20 50 61  6       2     Pa
0ad0: 67 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  ge size in bytes
0ae0: 2e 20 20 0a 2a 2a 20 20 20 20 20 31 38 20 20 20  .  .**     18   
0af0: 20 20 20 20 31 20 20 20 20 20 46 69 6c 65 20 66      1     File f
0b00: 6f 72 6d 61 74 20 77 72 69 74 65 20 76 65 72 73  ormat write vers
0b10: 69 6f 6e 0a 2a 2a 20 20 20 20 20 31 39 20 20 20  ion.**     19   
0b20: 20 20 20 20 31 20 20 20 20 20 46 69 6c 65 20 66      1     File f
0b30: 6f 72 6d 61 74 20 72 65 61 64 20 76 65 72 73 69  ormat read versi
0b40: 6f 6e 0a 2a 2a 20 20 20 20 20 32 30 20 20 20 20  on.**     20    
0b50: 20 20 20 31 20 20 20 20 20 42 79 74 65 73 20 6f     1     Bytes o
0b60: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61  f unused space a
0b70: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
0b80: 68 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 32 31  h page.**     21
0b90: 20 20 20 20 20 20 20 31 20 20 20 20 20 4d 61 78         1     Max
0ba0: 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
0bb0: 64 20 66 72 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  d fraction.**   
0bc0: 20 20 32 32 20 20 20 20 20 20 20 31 20 20 20 20    22       1    
0bd0: 20 4d 69 6e 20 65 6d 62 65 64 64 65 64 20 70 61   Min embedded pa
0be0: 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a  yload fraction.*
0bf0: 2a 20 20 20 20 20 32 33 20 20 20 20 20 20 20 31  *     23       1
0c00: 20 20 20 20 20 4d 69 6e 20 6c 65 61 66 20 70 61       Min leaf pa
0c10: 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a  yload fraction.*
0c20: 2a 20 20 20 20 20 32 34 20 20 20 20 20 20 20 34  *     24       4
0c30: 20 20 20 20 20 46 69 6c 65 20 63 68 61 6e 67 65       File change
0c40: 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 20 20 20 20   counter.**     
0c50: 32 38 20 20 20 20 20 20 20 34 20 20 20 20 20 52  28       4     R
0c60: 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
0c70: 72 65 20 75 73 65 0a 2a 2a 20 20 20 20 20 33 32  re use.**     32
0c80: 20 20 20 20 20 20 20 34 20 20 20 20 20 46 69 72         4     Fir
0c90: 73 74 20 66 72 65 65 6c 69 73 74 20 70 61 67 65  st freelist page
0ca0: 0a 2a 2a 20 20 20 20 20 33 36 20 20 20 20 20 20  .**     36      
0cb0: 20 34 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66   4     Number of
0cc0: 20 66 72 65 65 6c 69 73 74 20 70 61 67 65 73 20   freelist pages 
0cd0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
0ce0: 20 20 20 34 30 20 20 20 20 20 20 36 30 20 20 20     40      60   
0cf0: 20 20 31 35 20 34 2d 62 79 74 65 20 6d 65 74 61    15 4-byte meta
0d00: 20 76 61 6c 75 65 73 20 70 61 73 73 65 64 20 74   values passed t
0d10: 6f 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 0a  o higher layers.
0d20: 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
0d30: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
0d40: 61 72 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 28  are big-endian (
0d50: 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  most significant
0d60: 20 62 79 74 65 20 66 69 72 73 74 29 2e 0a 2a 2a   byte first)..**
0d70: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 63 68 61  .** The file cha
0d80: 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20 69  nge counter is i
0d90: 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 20  ncremented when 
0da0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
0db0: 63 68 61 6e 67 65 64 20 6d 6f 72 65 0a 2a 2a 20  changed more.** 
0dc0: 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e  than once within
0dd0: 20 74 68 65 20 73 61 6d 65 20 73 65 63 6f 6e 64   the same second
0de0: 2e 20 20 54 68 69 73 20 63 6f 75 6e 74 65 72 2c  .  This counter,
0df0: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
0e00: 68 65 0a 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  he.** modificati
0e10: 6f 6e 20 74 69 6d 65 20 6f 66 20 74 68 65 20 66  on time of the f
0e20: 69 6c 65 2c 20 61 6c 6c 6f 77 73 20 6f 74 68 65  ile, allows othe
0e30: 72 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20 6b  r processes to k
0e40: 6e 6f 77 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  now.** when the 
0e50: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
0e60: 20 61 6e 64 20 74 68 75 73 20 77 68 65 6e 20 74   and thus when t
0e70: 68 65 79 20 6e 65 65 64 20 74 6f 20 66 6c 75 73  hey need to flus
0e80: 68 20 74 68 65 69 72 0a 2a 2a 20 63 61 63 68 65  h their.** cache
0e90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 20  ..**.** The max 
0ea0: 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
0eb0: 20 66 72 61 63 74 69 6f 6e 20 69 73 20 74 68 65   fraction is the
0ec0: 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 74   amount of the t
0ed0: 6f 74 61 6c 20 75 73 61 62 6c 65 0a 2a 2a 20 73  otal usable.** s
0ee0: 70 61 63 65 20 69 6e 20 61 20 70 61 67 65 20 74  pace in a page t
0ef0: 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6e 73 75  hat can be consu
0f00: 6d 65 64 20 62 79 20 61 20 73 69 6e 67 6c 65 20  med by a single 
0f10: 63 65 6c 6c 20 66 6f 72 20 73 74 61 6e 64 61 72  cell for standar
0f20: 64 0a 2a 2a 20 42 2d 74 72 65 65 20 28 6e 6f 6e  d.** B-tree (non
0f30: 2d 4c 45 41 46 44 41 54 41 29 20 74 61 62 6c 65  -LEAFDATA) table
0f40: 73 2e 20 20 41 20 76 61 6c 75 65 20 6f 66 20 32  s.  A value of 2
0f50: 35 35 20 6d 65 61 6e 73 20 31 30 30 25 2e 20 20  55 means 100%.  
0f60: 54 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 69  The default.** i
0f70: 73 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6d  s to limit the m
0f80: 61 78 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  aximum cell size
0f90: 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
0fa0: 74 20 34 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66  t 4 cells will f
0fb0: 69 74 0a 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61 67  it.** on one pag
0fc0: 65 2e 20 20 54 68 75 73 20 74 68 65 20 64 65 66  e.  Thus the def
0fd0: 61 75 6c 74 20 6d 61 78 20 65 6d 62 65 64 64 65  ault max embedde
0fe0: 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69  d payload fracti
0ff0: 6f 6e 20 69 73 20 36 34 2e 0a 2a 2a 0a 2a 2a 20  on is 64..**.** 
1000: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66  If the payload f
1010: 6f 72 20 61 20 63 65 6c 6c 20 69 73 20 6c 61 72  or a cell is lar
1020: 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78  ger than the max
1030: 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 6e 20 65   payload, then e
1040: 78 74 72 61 0a 2a 2a 20 70 61 79 6c 6f 61 64 20  xtra.** payload 
1050: 69 73 20 73 70 69 6c 6c 65 64 20 74 6f 20 6f 76  is spilled to ov
1060: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 4f  erflow pages.  O
1070: 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
1080: 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  page is allocate
1090: 64 2c 0a 2a 2a 20 61 73 20 6d 61 6e 79 20 62 79  d,.** as many by
10a0: 74 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20  tes as possible 
10b0: 61 72 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74  are moved into t
10c0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
10d0: 73 20 77 69 74 68 6f 75 74 20 6c 65 74 74 69 6e  s without lettin
10e0: 67 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 73 69  g.** the cell si
10f0: 7a 65 20 64 72 6f 70 20 62 65 6c 6f 77 20 74 68  ze drop below th
1100: 65 20 6d 69 6e 20 65 6d 62 65 64 64 65 64 20 70  e min embedded p
1110: 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 2e  ayload fraction.
1120: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 20 6c  .**.** The min l
1130: 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63  eaf payload frac
1140: 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20 74 68 65  tion is like the
1150: 20 6d 69 6e 20 65 6d 62 65 64 64 65 64 20 70 61   min embedded pa
1160: 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a  yload fraction.*
1170: 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  * except that it
1180: 20 61 70 70 6c 69 65 73 20 74 6f 20 6c 65 61 66   applies to leaf
1190: 20 6e 6f 64 65 73 20 69 6e 20 61 20 4c 45 41 46   nodes in a LEAF
11a0: 44 41 54 41 20 74 72 65 65 2e 20 20 54 68 65 20  DATA tree.  The 
11b0: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 70 61 79 6c 6f  maximum.** paylo
11c0: 61 64 20 66 72 61 63 74 69 6f 6e 20 66 6f 72 20  ad fraction for 
11d0: 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20  a LEAFDATA tree 
11e0: 69 73 20 61 6c 77 61 79 73 20 31 30 30 25 20 28  is always 100% (
11f0: 6f 72 20 32 35 35 29 20 61 6e 64 20 69 74 0a 2a  or 255) and it.*
1200: 2a 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  * not specified 
1210: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
1220: 2a 0a 2a 2a 20 45 61 63 68 20 62 74 72 65 65 20  *.** Each btree 
1230: 70 61 67 65 73 20 69 73 20 64 69 76 69 64 65 64  pages is divided
1240: 20 69 6e 74 6f 20 74 68 72 65 65 20 73 65 63 74   into three sect
1250: 69 6f 6e 73 3a 20 20 54 68 65 20 68 65 61 64 65  ions:  The heade
1260: 72 2c 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 20 70  r, the.** cell p
1270: 6f 69 6e 74 65 72 20 61 72 72 61 79 2c 20 61 6e  ointer array, an
1280: 64 20 74 68 65 20 63 65 6c 6c 20 61 72 65 61 20  d the cell area 
1290: 61 72 65 61 2e 20 20 50 61 67 65 20 31 20 61 6c  area.  Page 1 al
12a0: 73 6f 20 68 61 73 20 61 20 31 30 30 2d 62 79 74  so has a 100-byt
12b0: 65 0a 2a 2a 20 66 69 6c 65 20 68 65 61 64 65 72  e.** file header
12c0: 20 74 68 61 74 20 6f 63 63 75 72 73 20 62 65 66   that occurs bef
12d0: 6f 72 65 20 74 68 65 20 70 61 67 65 20 68 65 61  ore the page hea
12e0: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  der..**.**      
12f0: 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  |---------------
1300: 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 66 69 6c  -|.**      | fil
1310: 65 20 68 65 61 64 65 72 20 20 20 20 7c 20 20 20  e header    |   
1320: 31 30 30 20 62 79 74 65 73 2e 20 20 50 61 67 65  100 bytes.  Page
1330: 20 31 20 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20 20   1 only..**     
1340: 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   |--------------
1350: 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 70 61  --|.**      | pa
1360: 67 65 20 68 65 61 64 65 72 20 20 20 20 7c 20 20  ge header    |  
1370: 20 38 20 62 79 74 65 73 20 66 6f 72 20 6c 65 61   8 bytes for lea
1380: 76 65 73 2e 20 20 31 32 20 62 79 74 65 73 20 66  ves.  12 bytes f
1390: 6f 72 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  or interior node
13a0: 73 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d 2d  s.**      |-----
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 20  -----------|.** 
13c0: 20 20 20 20 20 7c 20 63 65 6c 6c 20 70 6f 69 6e       | cell poin
13d0: 74 65 72 20 20 20 7c 20 20 20 7c 20 20 32 20 62  ter   |   |  2 b
13e0: 79 74 65 73 20 70 65 72 20 63 65 6c 6c 2e 20 20  ytes per cell.  
13f0: 53 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2a  Sorted order..**
1400: 20 20 20 20 20 20 7c 20 61 72 72 61 79 20 20 20        | array   
1410: 20 20 20 20 20 20 20 7c 20 20 20 7c 20 20 47 72         |   |  Gr
1420: 6f 77 73 20 64 6f 77 6e 77 61 72 64 0a 2a 2a 20  ows downward.** 
1430: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1440: 20 20 20 20 20 20 7c 20 20 20 76 0a 2a 2a 20 20        |   v.**  
1450: 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      |-----------
1460: 2d 2d 2d 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c  -----|.**      |
1470: 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 20 20 20   unallocated    
1480: 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 73 70 61 63  |.**      | spac
1490: 65 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20  e          |.** 
14a0: 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       |----------
14b0: 2d 2d 2d 2d 2d 2d 7c 20 20 20 5e 20 20 47 72 6f  ------|   ^  Gro
14c0: 77 73 20 75 70 77 61 72 64 73 0a 2a 2a 20 20 20  ws upwards.**   
14d0: 20 20 20 7c 20 63 65 6c 6c 20 63 6f 6e 74 65 6e     | cell conten
14e0: 74 20 20 20 7c 20 20 20 7c 20 20 41 72 62 69 74  t   |   |  Arbit
14f0: 72 61 72 79 20 6f 72 64 65 72 20 69 6e 74 65 72  rary order inter
1500: 73 70 65 72 73 65 64 20 77 69 74 68 20 66 72 65  spersed with fre
1510: 65 62 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 20  eblocks..**     
1520: 20 7c 20 61 72 65 61 20 20 20 20 20 20 20 20 20   | area         
1530: 20 20 7c 20 20 20 7c 20 20 61 6e 64 20 66 72 65    |   |  and fre
1540: 65 20 73 70 61 63 65 20 66 72 61 67 6d 65 6e 74  e space fragment
1550: 73 2e 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d  s..**      |----
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a  ------------|.**
1570: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 68 65 61  .** The page hea
1580: 64 65 72 73 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  ders looks like 
1590: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 46  this:.**.**   OF
15a0: 46 53 45 54 20 20 20 53 49 5a 45 20 20 20 20 20  FSET   SIZE     
15b0: 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20 20  DESCRIPTION.**  
15c0: 20 20 20 20 30 20 20 20 20 20 20 20 31 20 20 20      0       1   
15d0: 20 20 20 46 6c 61 67 73 2e 20 31 3a 20 69 6e 74     Flags. 1: int
15e0: 6b 65 79 2c 20 32 3a 20 7a 65 72 6f 64 61 74 61  key, 2: zerodata
15f0: 2c 20 34 3a 20 6c 65 61 66 64 61 74 61 2c 20 38  , 4: leafdata, 8
1600: 3a 20 6c 65 61 66 0a 2a 2a 20 20 20 20 20 20 31  : leaf.**      1
1610: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 62 79         2      by
1620: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  te offset to the
1630: 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
1640: 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20  .**      3      
1650: 20 32 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f   2      number o
1660: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 69 73 20  f cells on this 
1670: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 35 20 20  page.**      5  
1680: 20 20 20 20 20 32 20 20 20 20 20 20 66 69 72 73       2      firs
1690: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
16a0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a  ll content area.
16b0: 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
16c0: 31 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66  1      number of
16d0: 20 66 72 61 67 6d 65 6e 74 65 64 20 66 72 65 65   fragmented free
16e0: 20 62 79 74 65 73 0a 2a 2a 20 20 20 20 20 20 38   bytes.**      8
16f0: 20 20 20 20 20 20 20 34 20 20 20 20 20 20 52 69         4      Ri
1700: 67 68 74 20 63 68 69 6c 64 20 28 74 68 65 20 50  ght child (the P
1710: 74 72 28 4e 2b 31 29 20 76 61 6c 75 65 29 2e 20  tr(N+1) value). 
1720: 20 4f 6d 69 74 74 65 64 20 6f 6e 20 6c 65 61 76   Omitted on leav
1730: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  es..**.** The fl
1740: 61 67 73 20 64 65 66 69 6e 65 20 74 68 65 20 66  ags define the f
1750: 6f 72 6d 61 74 20 6f 66 20 74 68 69 73 20 62 74  ormat of this bt
1760: 72 65 65 20 70 61 67 65 2e 20 20 54 68 65 20 6c  ree page.  The l
1770: 65 61 66 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  eaf flag means t
1780: 68 61 74 0a 2a 2a 20 74 68 69 73 20 70 61 67 65  hat.** this page
1790: 20 68 61 73 20 6e 6f 20 63 68 69 6c 64 72 65 6e   has no children
17a0: 2e 20 20 54 68 65 20 7a 65 72 6f 64 61 74 61 20  .  The zerodata 
17b0: 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
17c0: 74 68 69 73 20 70 61 67 65 20 63 61 72 72 69 65  this page carrie
17d0: 73 0a 2a 2a 20 6f 6e 6c 79 20 6b 65 79 73 20 61  s.** only keys a
17e0: 6e 64 20 6e 6f 20 64 61 74 61 2e 20 20 54 68 65  nd no data.  The
17f0: 20 69 6e 74 6b 65 79 20 66 6c 61 67 20 6d 65 61   intkey flag mea
1800: 6e 73 20 74 68 61 74 20 74 68 65 20 6b 65 79 20  ns that the key 
1810: 69 73 20 61 20 69 6e 74 65 67 65 72 0a 2a 2a 20  is a integer.** 
1820: 77 68 69 63 68 20 69 73 20 73 74 6f 72 65 64 20  which is stored 
1830: 69 6e 20 74 68 65 20 6b 65 79 20 73 69 7a 65 20  in the key size 
1840: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 63 65 6c  entry of the cel
1850: 6c 20 68 65 61 64 65 72 20 72 61 74 68 65 72 20  l header rather 
1860: 74 68 61 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 70  than in.** the p
1870: 61 79 6c 6f 61 64 20 61 72 65 61 2e 0a 2a 2a 0a  ayload area..**.
1880: 2a 2a 20 54 68 65 20 63 65 6c 6c 20 70 6f 69 6e  ** The cell poin
1890: 74 65 72 20 61 72 72 61 79 20 62 65 67 69 6e 73  ter array begins
18a0: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 62 79   on the first by
18b0: 74 65 20 61 66 74 65 72 20 74 68 65 20 70 61 67  te after the pag
18c0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 65  e header..** The
18d0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
18e0: 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  ray contains zer
18f0: 6f 20 6f 72 20 6d 6f 72 65 20 32 2d 62 79 74 65  o or more 2-byte
1900: 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
1910: 72 65 0a 2a 2a 20 6f 66 66 73 65 74 73 20 66 72  re.** offsets fr
1920: 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
1930: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
1940: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
1950: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
1960: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54  content area.  T
1970: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73  he cell pointers
1980: 20 6f 63 63 75 72 20 69 6e 20 73 6f 72 74 65 64   occur in sorted
1990: 20 6f 72 64 65 72 2e 20 20 54 68 65 20 73 79 73   order.  The sys
19a0: 74 65 6d 20 73 74 72 69 76 65 73 0a 2a 2a 20 74  tem strives.** t
19b0: 6f 20 6b 65 65 70 20 66 72 65 65 20 73 70 61 63  o keep free spac
19c0: 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  e after the last
19d0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 73 6f   cell pointer so
19e0: 20 74 68 61 74 20 6e 65 77 20 63 65 6c 6c 73 20   that new cells 
19f0: 63 61 6e 0a 2a 2a 20 62 65 20 65 61 73 69 6c 79  can.** be easily
1a00: 20 61 64 64 65 64 20 77 69 74 68 6f 75 74 20 68   added without h
1a10: 61 76 69 6e 67 20 74 6f 20 64 65 66 72 61 67 6d  aving to defragm
1a20: 65 6e 74 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  ent the page..**
1a30: 0a 2a 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74  .** Cell content
1a40: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
1a50: 65 20 76 65 72 79 20 65 6e 64 20 6f 66 20 74 68  e very end of th
1a60: 65 20 70 61 67 65 20 61 6e 64 20 67 72 6f 77 73  e page and grows
1a70: 20 74 6f 77 61 72 64 20 74 68 65 0a 2a 2a 20 62   toward the.** b
1a80: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
1a90: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 55 6e 75 73  page..**.** Unus
1aa0: 65 64 20 73 70 61 63 65 20 77 69 74 68 69 6e 20  ed space within 
1ab0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
1ac0: 20 61 72 65 61 20 69 73 20 63 6f 6c 6c 65 63 74   area is collect
1ad0: 65 64 20 69 6e 74 6f 20 61 20 6c 69 6e 6b 65 64  ed into a linked
1ae0: 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 66 72 65 65   list of.** free
1af0: 62 6c 6f 63 6b 73 2e 20 20 45 61 63 68 20 66 72  blocks.  Each fr
1b00: 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 6c 65  eeblock is at le
1b10: 61 73 74 20 34 20 62 79 74 65 73 20 69 6e 20 73  ast 4 bytes in s
1b20: 69 7a 65 2e 20 20 54 68 65 20 62 79 74 65 20 6f  ize.  The byte o
1b30: 66 66 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20  ffset.** to the 
1b40: 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
1b50: 69 73 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  is given in the 
1b60: 68 65 61 64 65 72 2e 20 20 46 72 65 65 62 6c 6f  header.  Freeblo
1b70: 63 6b 73 20 6f 63 63 75 72 20 69 6e 0a 2a 2a 20  cks occur in.** 
1b80: 69 6e 63 72 65 61 73 69 6e 67 20 6f 72 64 65 72  increasing order
1b90: 2e 20 20 42 65 63 61 75 73 65 20 61 20 66 72 65  .  Because a fre
1ba0: 65 62 6c 6f 63 6b 20 6d 75 73 74 20 62 65 20 61  eblock must be a
1bb0: 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20  t least 4 bytes 
1bc0: 69 6e 20 73 69 7a 65 2c 0a 2a 2a 20 61 6e 79 20  in size,.** any 
1bd0: 67 72 6f 75 70 20 6f 66 20 33 20 6f 72 20 66 65  group of 3 or fe
1be0: 77 65 72 20 75 6e 75 73 65 64 20 62 79 74 65 73  wer unused bytes
1bf0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   in the cell con
1c00: 74 65 6e 74 20 61 72 65 61 20 63 61 6e 6e 6f 74  tent area cannot
1c10: 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
1c20: 20 66 72 65 65 62 6c 6f 63 6b 20 63 68 61 69 6e   freeblock chain
1c30: 2e 20 20 41 20 67 72 6f 75 70 20 6f 66 20 33 20  .  A group of 3 
1c40: 6f 72 20 66 65 77 65 72 20 66 72 65 65 20 62 79  or fewer free by
1c50: 74 65 73 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tes is called.**
1c60: 20 61 20 66 72 61 67 6d 65 6e 74 2e 20 20 54 68   a fragment.  Th
1c70: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1c80: 66 20 62 79 74 65 73 20 69 6e 20 61 6c 6c 20 66  f bytes in all f
1c90: 72 61 67 6d 65 6e 74 73 20 69 73 20 72 65 63 6f  ragments is reco
1ca0: 72 64 65 64 2e 0a 2a 2a 20 69 6e 20 74 68 65 20  rded..** in the 
1cb0: 70 61 67 65 20 68 65 61 64 65 72 20 61 74 20 6f  page header at o
1cc0: 66 66 73 65 74 20 37 2e 0a 2a 2a 0a 2a 2a 20 20  ffset 7..**.**  
1cd0: 20 20 53 49 5a 45 20 20 20 20 44 45 53 43 52 49    SIZE    DESCRI
1ce0: 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 32 20  PTION.**      2 
1cf0: 20 20 20 20 42 79 74 65 20 6f 66 66 73 65 74 20      Byte offset 
1d00: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
1d10: 62 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 20 32 20  block.**      2 
1d20: 20 20 20 20 42 79 74 65 73 20 69 6e 20 74 68 69      Bytes in thi
1d30: 73 20 66 72 65 65 62 6c 6f 63 6b 0a 2a 2a 0a 2a  s freeblock.**.*
1d40: 2a 20 43 65 6c 6c 73 20 61 72 65 20 6f 66 20 76  * Cells are of v
1d50: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 2e 20  ariable length. 
1d60: 20 43 65 6c 6c 73 20 61 72 65 20 73 74 6f 72 65   Cells are store
1d70: 64 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f  d in the cell co
1d80: 6e 74 65 6e 74 20 61 72 65 61 20 61 74 0a 2a 2a  ntent area at.**
1d90: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1da0: 70 61 67 65 2e 20 20 50 6f 69 6e 74 65 72 73 20  page.  Pointers 
1db0: 74 6f 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65  to the cells are
1dc0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   in the cell poi
1dd0: 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 74 68  nter array.** th
1de0: 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  at immediately f
1df0: 6f 6c 6c 6f 77 73 20 74 68 65 20 70 61 67 65 20  ollows the page 
1e00: 68 65 61 64 65 72 2e 20 20 43 65 6c 6c 73 20 69  header.  Cells i
1e10: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
1e20: 79 0a 2a 2a 20 63 6f 6e 74 69 67 75 6f 75 73 20  y.** contiguous 
1e30: 6f 72 20 69 6e 20 6f 72 64 65 72 2c 20 62 75 74  or in order, but
1e40: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
1e50: 72 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 6e  re contiguous an
1e60: 64 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a  d in order..**.*
1e70: 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6d  * Cell content m
1e80: 61 6b 65 73 20 75 73 65 20 6f 66 20 76 61 72 69  akes use of vari
1e90: 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
1ea0: 67 65 72 73 2e 20 20 41 20 76 61 72 69 61 62 6c  gers.  A variabl
1eb0: 65 0a 2a 2a 20 6c 65 6e 67 74 68 20 69 6e 74 65  e.** length inte
1ec0: 67 65 72 20 69 73 20 31 20 74 6f 20 39 20 62 79  ger is 1 to 9 by
1ed0: 74 65 73 20 77 68 65 72 65 20 74 68 65 20 6c 6f  tes where the lo
1ee0: 77 65 72 20 37 20 62 69 74 73 20 6f 66 20 65 61  wer 7 bits of ea
1ef0: 63 68 20 0a 2a 2a 20 62 79 74 65 20 61 72 65 20  ch .** byte are 
1f00: 75 73 65 64 2e 20 20 54 68 65 20 69 6e 74 65 67  used.  The integ
1f10: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1f20: 6c 6c 20 62 79 74 65 73 20 74 68 61 74 20 68 61  ll bytes that ha
1f30: 76 65 20 62 69 74 20 38 20 73 65 74 20 61 6e 64  ve bit 8 set and
1f40: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
1f50: 74 65 20 77 69 74 68 20 62 69 74 20 38 20 63 6c  te with bit 8 cl
1f60: 65 61 72 2e 20 20 54 68 65 20 6d 6f 73 74 20 73  ear.  The most s
1f70: 69 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65 20  ignificant byte 
1f80: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
1f90: 2a 20 61 70 70 65 61 72 73 20 66 69 72 73 74 2e  * appears first.
1fa0: 20 20 41 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e    A variable-len
1fb0: 67 74 68 20 69 6e 74 65 67 65 72 20 6d 61 79 20  gth integer may 
1fc0: 6e 6f 74 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  not be more than
1fd0: 20 39 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a   9 bytes long..*
1fe0: 2a 20 41 73 20 61 20 73 70 65 63 69 61 6c 20 63  * As a special c
1ff0: 61 73 65 2c 20 61 6c 6c 20 38 20 62 79 74 65 73  ase, all 8 bytes
2000: 20 6f 66 20 74 68 65 20 39 74 68 20 62 79 74 65   of the 9th byte
2010: 20 61 72 65 20 75 73 65 64 20 61 73 20 64 61 74   are used as dat
2020: 61 2e 20 20 54 68 69 73 0a 2a 2a 20 61 6c 6c 6f  a.  This.** allo
2030: 77 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ws a 64-bit inte
2040: 67 65 72 20 74 6f 20 62 65 20 65 6e 63 6f 64 65  ger to be encode
2050: 64 20 69 6e 20 39 20 62 79 74 65 73 2e 0a 2a 2a  d in 9 bytes..**
2060: 0a 2a 2a 20 20 20 20 30 78 30 30 20 20 20 20 20  .**    0x00     
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30   becomes  0x0000
2090: 30 30 30 30 0a 2a 2a 20 20 20 20 30 78 37 66 20  0000.**    0x7f 
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 20 20 20 20 20 62 65 63 6f 6d 65 73 20 20 30 78       becomes  0x
20c0: 30 30 30 30 30 30 37 66 0a 2a 2a 20 20 20 20 30  0000007f.**    0
20d0: 78 38 31 20 30 78 30 30 20 20 20 20 20 20 20 20  x81 0x00        
20e0: 20 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73           becomes
20f0: 20 20 30 78 30 30 30 30 30 30 38 30 0a 2a 2a 20    0x00000080.** 
2100: 20 20 20 30 78 38 32 20 30 78 30 30 20 20 20 20     0x82 0x00    
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63               bec
2120: 6f 6d 65 73 20 20 30 78 30 30 30 30 30 31 30 30  omes  0x00000100
2130: 0a 2a 2a 20 20 20 20 30 78 38 30 20 30 78 37 66  .**    0x80 0x7f
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30   becomes  0x0000
2160: 30 30 37 66 0a 2a 2a 20 20 20 20 30 78 38 61 20  007f.**    0x8a 
2170: 30 78 39 31 20 30 78 64 31 20 30 78 61 63 20 30  0x91 0xd1 0xac 0
2180: 78 37 38 20 20 62 65 63 6f 6d 65 73 20 20 30 78  x78  becomes  0x
2190: 31 32 33 34 35 36 37 38 0a 2a 2a 20 20 20 20 30  12345678.**    0
21a0: 78 38 31 20 30 78 38 31 20 30 78 38 31 20 30 78  x81 0x81 0x81 0x
21b0: 38 31 20 30 78 30 31 20 20 62 65 63 6f 6d 65 73  81 0x01  becomes
21c0: 20 20 30 78 31 30 32 30 34 30 38 31 0a 2a 2a 0a    0x10204081.**.
21d0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 6c 65 6e 67  ** Variable leng
21e0: 74 68 20 69 6e 74 65 67 65 72 73 20 61 72 65 20  th integers are 
21f0: 75 73 65 64 20 66 6f 72 20 72 6f 77 69 64 73 20  used for rowids 
2200: 61 6e 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  and to hold the 
2210: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74  number of.** byt
2220: 65 73 20 6f 66 20 6b 65 79 20 61 6e 64 20 64 61  es of key and da
2230: 74 61 20 69 6e 20 61 20 62 74 72 65 65 20 63 65  ta in a btree ce
2240: 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ll..**.** The co
2250: 6e 74 65 6e 74 20 6f 66 20 61 20 63 65 6c 6c 20  ntent of a cell 
2260: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
2270: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20  .**.**    SIZE  
2280: 20 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a    DESCRIPTION.**
2290: 20 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65        4     Page
22a0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c   number of the l
22b0: 65 66 74 20 63 68 69 6c 64 2e 20 4f 6d 69 74 74  eft child. Omitt
22c0: 65 64 20 69 66 20 6c 65 61 66 20 66 6c 61 67 20  ed if leaf flag 
22d0: 69 73 20 73 65 74 2e 0a 2a 2a 20 20 20 20 20 76  is set..**     v
22e0: 61 72 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20  ar    Number of 
22f0: 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 20 4f  bytes of data. O
2300: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 7a 65  mitted if the ze
2310: 72 6f 64 61 74 61 20 66 6c 61 67 20 69 73 20 73  rodata flag is s
2320: 65 74 2e 0a 2a 2a 20 20 20 20 20 76 61 72 20 20  et..**     var  
2330: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
2340: 73 20 6f 66 20 6b 65 79 2e 20 4f 72 20 74 68 65  s of key. Or the
2350: 20 6b 65 79 20 69 74 73 65 6c 66 20 69 66 20 69   key itself if i
2360: 6e 74 6b 65 79 20 66 6c 61 67 20 69 73 20 73 65  ntkey flag is se
2370: 74 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 20 20  t..**      *    
2380: 20 50 61 79 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   Payload.**     
2390: 20 34 20 20 20 20 20 46 69 72 73 74 20 70 61 67   4     First pag
23a0: 65 20 6f 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  e of the overflo
23b0: 77 20 63 68 61 69 6e 2e 20 20 4f 6d 69 74 74 65  w chain.  Omitte
23c0: 64 20 69 66 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  d if no overflow
23d0: 0a 2a 2a 0a 2a 2a 20 4f 76 65 72 66 6c 6f 77 20  .**.** Overflow 
23e0: 70 61 67 65 73 20 66 6f 72 6d 20 61 20 6c 69 6e  pages form a lin
23f0: 6b 65 64 20 6c 69 73 74 2e 20 20 45 61 63 68 20  ked list.  Each 
2400: 70 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20  page except the 
2410: 6c 61 73 74 20 69 73 20 63 6f 6d 70 6c 65 74 65  last is complete
2420: 6c 79 0a 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74  ly.** filled wit
2430: 68 20 64 61 74 61 20 28 70 61 67 65 73 69 7a 65  h data (pagesize
2440: 20 2d 20 34 20 62 79 74 65 73 29 2e 20 20 54 68   - 4 bytes).  Th
2450: 65 20 6c 61 73 74 20 70 61 67 65 20 63 61 6e 20  e last page can 
2460: 68 61 76 65 20 61 73 20 6c 69 74 74 6c 65 0a 2a  have as little.*
2470: 2a 20 61 73 20 31 20 62 79 74 65 20 6f 66 20 64  * as 1 byte of d
2480: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49  ata..**.**    SI
2490: 5a 45 20 20 20 20 44 45 53 43 52 49 50 54 49 4f  ZE    DESCRIPTIO
24a0: 4e 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  N.**      4     
24b0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e  Page number of n
24c0: 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
24d0: 65 0a 2a 2a 20 20 20 20 20 20 2a 20 20 20 20 20  e.**      *     
24e0: 44 61 74 61 0a 2a 2a 0a 2a 2a 20 46 72 65 65 6c  Data.**.** Freel
24f0: 69 73 74 20 70 61 67 65 73 20 63 6f 6d 65 20 69  ist pages come i
2500: 6e 20 74 77 6f 20 73 75 62 74 79 70 65 73 3a 20  n two subtypes: 
2510: 74 72 75 6e 6b 20 70 61 67 65 73 20 61 6e 64 20  trunk pages and 
2520: 6c 65 61 66 20 70 61 67 65 73 2e 20 20 54 68 65  leaf pages.  The
2530: 0a 2a 2a 20 66 69 6c 65 20 68 65 61 64 65 72 20  .** file header 
2540: 70 6f 69 6e 74 73 20 74 6f 20 66 69 72 73 74 20  points to first 
2550: 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  in a linked list
2560: 20 6f 66 20 74 72 75 6e 6b 20 70 61 67 65 2e 20   of trunk page. 
2570: 20 45 61 63 68 20 74 72 75 6e 6b 0a 2a 2a 20 70   Each trunk.** p
2580: 61 67 65 20 70 6f 69 6e 74 73 20 74 6f 20 6d 75  age points to mu
2590: 6c 74 69 70 6c 65 20 6c 65 61 66 20 70 61 67 65  ltiple leaf page
25a0: 73 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  s.  The content 
25b0: 6f 66 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  of a leaf page i
25c0: 73 0a 2a 2a 20 75 6e 73 70 65 63 69 66 69 65 64  s.** unspecified
25d0: 2e 20 20 41 20 74 72 75 6e 6b 20 70 61 67 65 20  .  A trunk page 
25e0: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
25f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20  .**.**    SIZE  
2600: 20 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a    DESCRIPTION.**
2610: 20 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65        4     Page
2620: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 78 74 20   number of next 
2630: 74 72 75 6e 6b 20 70 61 67 65 0a 2a 2a 20 20 20  trunk page.**   
2640: 20 20 20 34 20 20 20 20 20 4e 75 6d 62 65 72 20     4     Number 
2650: 6f 66 20 6c 65 61 66 20 70 6f 69 6e 74 65 72 73  of leaf pointers
2660: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a   on this page.**
2670: 20 20 20 20 20 20 2a 20 20 20 20 20 7a 65 72 6f        *     zero
2680: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 6e   or more pages n
2690: 75 6d 62 65 72 73 20 6f 66 20 6c 65 61 76 65 73  umbers of leaves
26a0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
26b0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
26c0: 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69  ude "pager.h".#i
26d0: 6e 63 6c 75 64 65 20 22 62 74 72 65 65 2e 68 22  nclude "btree.h"
26e0: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22  .#include "os.h"
26f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
2700: 74 2e 68 3e 0a 0a 2f 2a 20 52 6f 75 6e 64 20 75  t.h>../* Round u
2710: 70 20 61 20 6e 75 6d 62 65 72 20 74 6f 20 74 68  p a number to th
2720: 65 20 6e 65 78 74 20 6c 61 72 67 65 72 20 6d 75  e next larger mu
2730: 6c 74 69 70 6c 65 20 6f 66 20 38 2e 20 20 54 68  ltiple of 8.  Th
2740: 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  is is used.** to
2750: 20 66 6f 72 63 65 20 38 2d 62 79 74 65 20 61 6c   force 8-byte al
2760: 69 67 6e 6d 65 6e 74 20 6f 6e 20 36 34 2d 62 69  ignment on 64-bi
2770: 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e  t architectures.
2780: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 4f 55 4e  .*/.#define ROUN
2790: 44 38 28 78 29 20 20 20 28 28 78 2b 37 29 26 7e  D8(x)   ((x+7)&~
27a0: 37 29 0a 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  7).../* The foll
27b0: 6f 77 69 6e 67 20 76 61 6c 75 65 20 69 73 20 74  owing value is t
27c0: 68 65 20 6d 61 78 69 6d 75 6d 20 63 65 6c 6c 20  he maximum cell 
27d0: 73 69 7a 65 20 61 73 73 75 6d 69 6e 67 20 61 20  size assuming a 
27e0: 6d 61 78 69 6d 75 6d 20 70 61 67 65 0a 2a 2a 20  maximum page.** 
27f0: 73 69 7a 65 20 67 69 76 65 20 61 62 6f 76 65 2e  size give above.
2800: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43  .*/.#define MX_C
2810: 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 20 28  ELL_SIZE(pBt)  (
2820: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 38 29  pBt->pageSize-8)
2830: 0a 0a 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  ../* The maximum
2840: 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2850: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67   on a single pag
2860: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2870: 65 2e 20 20 54 68 69 73 0a 2a 2a 20 61 73 73 75  e.  This.** assu
2880: 6d 65 73 20 61 20 6d 69 6e 69 6d 75 6d 20 63 65  mes a minimum ce
2890: 6c 6c 20 73 69 7a 65 20 6f 66 20 33 20 62 79 74  ll size of 3 byt
28a0: 65 73 2e 20 20 53 75 63 68 20 73 6d 61 6c 6c 20  es.  Such small 
28b0: 63 65 6c 6c 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  cells will be.**
28c0: 20 65 78 63 65 65 64 69 6e 67 6c 79 20 72 61 72   exceedingly rar
28d0: 65 2c 20 62 75 74 20 74 68 65 79 20 61 72 65 20  e, but they are 
28e0: 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 23 64 65  possible..*/.#de
28f0: 66 69 6e 65 20 4d 58 5f 43 45 4c 4c 28 70 42 74  fine MX_CELL(pBt
2900: 29 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  ) ((pBt->pageSiz
2910: 65 2d 38 29 2f 33 29 0a 0a 2f 2a 20 46 6f 72 77  e-8)/3)../* Forw
2920: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73  ard declarations
2930: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
2940: 63 74 20 4d 65 6d 50 61 67 65 20 4d 65 6d 50 61  ct MemPage MemPa
2950: 67 65 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ge;../*.** This 
2960: 69 73 20 61 20 6d 61 67 69 63 20 73 74 72 69 6e  is a magic strin
2970: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
2980: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2990: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
29a0: 74 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f  te database in o
29b0: 72 64 65 72 20 74 6f 20 69 64 65 6e 74 69 66 79  rder to identify
29c0: 20 74 68 65 20 66 69 6c 65 20 61 73 20 61 20 72   the file as a r
29d0: 65 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  eal 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 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34    123456789 1234
2a10: 35 36 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  56 */.static con
2a20: 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48 65  st char zMagicHe
2a30: 61 64 65 72 5b 5d 20 3d 20 22 53 51 4c 69 74 65  ader[] = "SQLite
2a40: 20 66 6f 72 6d 61 74 20 33 22 3b 0a 0a 2f 2a 0a   format 3";../*.
2a50: 2a 2a 20 50 61 67 65 20 74 79 70 65 20 66 6c 61  ** Page type fla
2a60: 67 73 2e 20 20 41 6e 20 4f 52 65 64 20 63 6f 6d  gs.  An ORed com
2a70: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73  bination of thes
2a80: 65 20 66 6c 61 67 73 20 61 70 70 65 61 72 20 61  e flags appear a
2a90: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 62  s the.** first b
2aa0: 79 74 65 20 6f 66 20 65 76 65 72 79 20 42 54 72  yte of every BTr
2ab0: 65 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 64 65 66  ee page..*/.#def
2ac0: 69 6e 65 20 50 54 46 5f 49 4e 54 4b 45 59 20 20  ine PTF_INTKEY  
2ad0: 20 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 50    0x01.#define P
2ae0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 20 30 78 30  TF_ZERODATA  0x0
2af0: 32 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 4c 45  2.#define PTF_LE
2b00: 41 46 44 41 54 41 20 20 30 78 30 34 0a 23 64 65  AFDATA  0x04.#de
2b10: 66 69 6e 65 20 50 54 46 5f 4c 45 41 46 20 20 20  fine PTF_LEAF   
2b20: 20 20 20 30 78 30 38 0a 0a 2f 2a 0a 2a 2a 20 41     0x08../*.** A
2b30: 73 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 74  s each page of t
2b40: 68 65 20 66 69 6c 65 20 69 73 20 6c 6f 61 64 65  he file is loade
2b50: 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2c 20 61  d into memory, a
2b60: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2b70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73  e following.** s
2b80: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 65  tructure is appe
2b90: 6e 64 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c  nded and initial
2ba0: 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2e 20 20 54  ized to zero.  T
2bb0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 73 74  his structure st
2bc0: 6f 72 65 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ores.** informat
2bd0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 70 61  ion about the pa
2be0: 67 65 20 74 68 61 74 20 69 73 20 64 65 63 6f 64  ge that is decod
2bf0: 65 64 20 66 72 6f 6d 20 74 68 65 20 72 61 77 20  ed from the raw 
2c00: 66 69 6c 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  file page..**.**
2c10: 20 54 68 65 20 70 50 61 72 65 6e 74 20 66 69 65   The pParent fie
2c20: 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 20 74  ld points back t
2c30: 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2c40: 65 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  e.  This allows 
2c50: 75 73 20 74 6f 0a 2a 2a 20 77 61 6c 6b 20 75 70  us to.** walk up
2c60: 20 74 68 65 20 42 54 72 65 65 20 66 72 6f 6d 20   the BTree from 
2c70: 61 6e 79 20 6c 65 61 66 20 74 6f 20 74 68 65 20  any leaf to the 
2c80: 72 6f 6f 74 2e 20 20 43 61 72 65 20 6d 75 73 74  root.  Care must
2c90: 20 62 65 20 74 61 6b 65 6e 20 74 6f 0a 2a 2a 20   be taken to.** 
2ca0: 75 6e 72 65 66 28 29 20 74 68 65 20 70 61 72 65  unref() the pare
2cb0: 6e 74 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  nt page pointer 
2cc0: 77 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69  when this page i
2cd0: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 66 65  s no longer refe
2ce0: 72 65 6e 63 65 64 2e 0a 2a 2a 20 54 68 65 20 70  renced..** The p
2cf0: 61 67 65 44 65 73 74 72 75 63 74 6f 72 28 29 20  ageDestructor() 
2d00: 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20  routine handles 
2d10: 74 68 61 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 73  that chore..*/.s
2d20: 74 72 75 63 74 20 4d 65 6d 50 61 67 65 20 7b 0a  truct MemPage {.
2d30: 20 20 75 38 20 69 73 49 6e 69 74 3b 20 20 20 20    u8 isInit;    
2d40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2d50: 66 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 69  f previously ini
2d60: 74 69 61 6c 69 7a 65 64 2e 20 4d 55 53 54 20 42  tialized. MUST B
2d70: 45 20 46 49 52 53 54 21 20 2a 2f 0a 20 20 75 38  E FIRST! */.  u8
2d80: 20 69 64 78 53 68 69 66 74 3b 20 20 20 20 20 20   idxShift;      
2d90: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 43 65     /* True if Ce
2da0: 6c 6c 20 69 6e 64 69 63 65 73 20 68 61 76 65 20  ll indices have 
2db0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20  changed */.  u8 
2dc0: 6e 4f 76 65 72 66 6c 6f 77 3b 20 20 20 20 20 20  nOverflow;      
2dd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
2de0: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 62 6f 64  verflow cell bod
2df0: 69 65 73 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 2a  ies in aCell[] *
2e00: 2f 0a 20 20 75 38 20 69 6e 74 4b 65 79 3b 20 20  /.  u8 intKey;  
2e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2e20: 20 69 66 20 69 6e 74 6b 65 79 20 66 6c 61 67 20   if intkey flag 
2e30: 69 73 20 73 65 74 20 2a 2f 0a 20 20 75 38 20 6c  is set */.  u8 l
2e40: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
2e50: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 61 66   /* True if leaf
2e60: 20 66 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a   flag is set */.
2e70: 20 20 75 38 20 7a 65 72 6f 44 61 74 61 3b 20 20    u8 zeroData;  
2e80: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2e90: 66 20 74 61 62 6c 65 20 73 74 6f 72 65 73 20 6b  f table stores k
2ea0: 65 79 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38  eys only */.  u8
2eb0: 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20   leafData;      
2ec0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 61     /* True if ta
2ed0: 62 6c 65 73 20 73 74 6f 72 65 73 20 64 61 74 61  bles stores data
2ee0: 20 6f 6e 20 6c 65 61 76 65 73 20 6f 6e 6c 79 20   on leaves only 
2ef0: 2a 2f 0a 20 20 75 38 20 68 61 73 44 61 74 61 3b  */.  u8 hasData;
2f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2f10: 65 20 69 66 20 74 68 69 73 20 70 61 67 65 20 73  e if this page s
2f20: 74 6f 72 65 73 20 64 61 74 61 20 2a 2f 0a 20 20  tores data */.  
2f30: 75 38 20 68 64 72 4f 66 66 73 65 74 3b 20 20 20  u8 hdrOffset;   
2f40: 20 20 20 20 20 2f 2a 20 31 30 30 20 66 6f 72 20       /* 100 for 
2f50: 70 61 67 65 20 31 2e 20 20 30 20 6f 74 68 65 72  page 1.  0 other
2f60: 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 63 68 69  wise */.  u8 chi
2f70: 6c 64 50 74 72 53 69 7a 65 3b 20 20 20 20 20 2f  ldPtrSize;     /
2f80: 2a 20 30 20 69 66 20 6c 65 61 66 3d 3d 31 2e 20  * 0 if leaf==1. 
2f90: 20 34 20 69 66 20 6c 65 61 66 3d 3d 30 20 2a 2f   4 if leaf==0 */
2fa0: 0a 20 20 75 31 36 20 6d 61 78 4c 6f 63 61 6c 3b  .  u16 maxLocal;
2fb0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
2fc0: 6f 66 20 42 74 72 65 65 2e 6d 61 78 4c 6f 63 61  of Btree.maxLoca
2fd0: 6c 20 6f 72 20 42 74 72 65 65 2e 6d 61 78 4c 65  l or Btree.maxLe
2fe0: 61 66 20 2a 2f 0a 20 20 75 31 36 20 6d 69 6e 4c  af */.  u16 minL
2ff0: 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  ocal;        /* 
3000: 43 6f 70 79 20 6f 66 20 42 74 72 65 65 2e 6d 69  Copy of Btree.mi
3010: 6e 4c 6f 63 61 6c 20 6f 72 20 42 74 72 65 65 2e  nLocal or Btree.
3020: 6d 69 6e 4c 65 61 66 20 2a 2f 0a 20 20 75 31 36  minLeaf */.  u16
3030: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
3040: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 44    /* Index in aD
3050: 61 74 61 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ata of first cel
3060: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75  l pointer */.  u
3070: 31 36 20 69 64 78 50 61 72 65 6e 74 3b 20 20 20  16 idxParent;   
3080: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
3090: 70 61 72 65 6e 74 20 6f 66 20 74 68 69 73 20 6e  parent of this n
30a0: 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 46 72  ode */.  u16 nFr
30b0: 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ee;           /*
30c0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   Number of free 
30d0: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
30e0: 65 20 2a 2f 0a 20 20 75 31 36 20 6e 43 65 6c 6c  e */.  u16 nCell
30f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
3100: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
3110: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 6c 6f 63  n this page, loc
3120: 61 6c 20 61 6e 64 20 6f 76 66 6c 20 2a 2f 0a 20  al and ovfl */. 
3130: 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c   struct _OvflCel
3140: 6c 20 7b 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74  l {   /* Cells t
3150: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  hat will not fit
3160: 20 6f 6e 20 61 44 61 74 61 5b 5d 20 2a 2f 0a 20   on aData[] */. 
3170: 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
3180: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
3190: 65 72 73 20 74 6f 20 74 68 65 20 62 6f 64 79 20  ers to the body 
31a0: 6f 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  of the overflow 
31b0: 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 75 31 36 20  cell */.    u16 
31c0: 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
31d0: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20   /* Insert this 
31e0: 63 65 6c 6c 20 62 65 66 6f 72 65 20 69 64 78 2d  cell before idx-
31f0: 74 68 20 6e 6f 6e 2d 6f 76 65 72 66 6c 6f 77 20  th non-overflow 
3200: 63 65 6c 6c 20 2a 2f 0a 20 20 7d 20 61 4f 76 66  cell */.  } aOvf
3210: 6c 5b 35 5d 3b 0a 20 20 73 74 72 75 63 74 20 42  l[5];.  struct B
3220: 74 72 65 65 20 2a 70 42 74 3b 20 20 20 2f 2a 20  tree *pBt;   /* 
3230: 50 6f 69 6e 74 65 72 20 62 61 63 6b 20 74 6f 20  Pointer back to 
3240: 42 54 72 65 65 20 73 74 72 75 63 74 75 72 65 20  BTree structure 
3250: 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 3b 20  */.  u8 *aData; 
3260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
3270: 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65  nter back to the
3280: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61   start of the pa
3290: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
32a0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
32b0: 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Page number for 
32c0: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 4d  this page */.  M
32d0: 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b  emPage *pParent;
32e0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
32f0: 74 20 6f 66 20 74 68 69 73 20 70 61 67 65 2e 20  t of this page. 
3300: 20 4e 55 4c 4c 20 66 6f 72 20 72 6f 6f 74 20 2a   NULL for root *
3310: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
3320: 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  in-memory image 
3330: 6f 66 20 61 20 64 69 73 6b 20 70 61 67 65 20 68  of a disk page h
3340: 61 73 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  as the auxiliary
3350: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 70 70   information app
3360: 65 6e 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  ended.** to the 
3370: 65 6e 64 2e 20 20 45 58 54 52 41 5f 53 49 5a 45  end.  EXTRA_SIZE
3380: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
3390: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
33a0: 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 0a   needed to hold.
33b0: 2a 2a 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  ** that extra in
33c0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 64  formation..*/.#d
33d0: 65 66 69 6e 65 20 45 58 54 52 41 5f 53 49 5a 45  efine EXTRA_SIZE
33e0: 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
33f0: 0a 0a 2f 2a 0a 2a 2a 20 45 76 65 72 79 74 68 69  ../*.** Everythi
3400: 6e 67 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e  ng we need to kn
3410: 6f 77 20 61 62 6f 75 74 20 61 6e 20 6f 70 65 6e  ow about an open
3420: 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 72   database.*/.str
3430: 75 63 74 20 42 74 72 65 65 20 7b 0a 20 20 50 61  uct Btree {.  Pa
3440: 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20  ger *pPager;    
3450: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
3460: 63 61 63 68 65 20 2a 2f 0a 20 20 42 74 43 75 72  cache */.  BtCur
3470: 73 6f 72 20 2a 70 43 75 72 73 6f 72 3b 20 20 20  sor *pCursor;   
3480: 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c   /* A list of al
3490: 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 2a  l open cursors *
34a0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
34b0: 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 46 69 72  ge1;      /* Fir
34c0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
34d0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
34e0: 69 6e 54 72 61 6e 73 3b 20 20 20 20 20 20 20 20  inTrans;        
34f0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
3500: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
3510: 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f 0a 20 20  n progress */.  
3520: 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20  u8 inStmt;      
3530: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3540: 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74 61   we are in a sta
3550: 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
3560: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 72 65  ction */.  u8 re
3570: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
3580: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
3590: 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20  underlying file 
35a0: 69 73 20 72 65 61 64 6f 6e 6c 79 20 2a 2f 0a 20  is readonly */. 
35b0: 20 75 38 20 6d 61 78 45 6d 62 65 64 46 72 61 63   u8 maxEmbedFrac
35c0: 3b 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75  ;      /* Maximu
35d0: 6d 20 70 61 79 6c 6f 61 64 20 61 73 20 25 20 6f  m payload as % o
35e0: 66 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a  f total page siz
35f0: 65 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 45 6d 62  e */.  u8 minEmb
3600: 65 64 46 72 61 63 3b 20 20 20 20 20 20 2f 2a 20  edFrac;      /* 
3610: 4d 69 6e 69 6d 75 6d 20 70 61 79 6c 6f 61 64 20  Minimum payload 
3620: 61 73 20 25 20 6f 66 20 74 6f 74 61 6c 20 70 61  as % of total pa
3630: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38 20  ge size */.  u8 
3640: 6d 69 6e 4c 65 61 66 46 72 61 63 3b 20 20 20 20  minLeafFrac;    
3650: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65     /* Minimum le
3660: 61 66 20 70 61 79 6c 6f 61 64 20 61 73 20 25 20  af payload as % 
3670: 6f 66 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69  of total page si
3680: 7a 65 20 2a 2f 0a 20 20 75 38 20 70 61 67 65 53  ze */.  u8 pageS
3690: 69 7a 65 46 69 78 65 64 3b 20 20 20 20 20 2f 2a  izeFixed;     /*
36a0: 20 54 72 75 65 20 69 66 20 74 68 65 20 70 61 67   True if the pag
36b0: 65 20 73 69 7a 65 20 63 61 6e 20 6e 6f 20 6c 6f  e size can no lo
36c0: 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 20  nger be changed 
36d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
36e0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
36f0: 4d 0a 20 20 75 38 20 61 75 74 6f 56 61 63 75 75  M.  u8 autoVacuu
3700: 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  m;        /* Tru
3710: 65 20 69 66 20 64 61 74 61 62 61 73 65 20 73 75  e if database su
3720: 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
3730: 75 6d 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 75  um */.#endif.  u
3740: 31 36 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20  16 pageSize;    
3750: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
3760: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e  mber of bytes on
3770: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36   a page */.  u16
3780: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
3790: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
37a0: 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20  usable bytes on 
37b0: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  each page */.  i
37c0: 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 20 20  nt maxLocal;    
37d0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
37e0: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69 6e  local payload in
37f0: 20 6e 6f 6e 2d 4c 45 41 46 44 41 54 41 20 74 61   non-LEAFDATA ta
3800: 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 69  bles */.  int mi
3810: 6e 4c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 20  nLocal;         
3820: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 6f 63 61 6c  /* Minimum local
3830: 20 70 61 79 6c 6f 61 64 20 69 6e 20 6e 6f 6e 2d   payload in non-
3840: 4c 45 41 46 44 41 54 41 20 74 61 62 6c 65 73 20  LEAFDATA tables 
3850: 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 65 61 66  */.  int maxLeaf
3860: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  ;          /* Ma
3870: 78 69 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79 6c  ximum local payl
3880: 6f 61 64 20 69 6e 20 61 20 4c 45 41 46 44 41 54  oad in a LEAFDAT
3890: 41 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  A table */.  int
38a0: 20 6d 69 6e 4c 65 61 66 3b 20 20 20 20 20 20 20   minLeaf;       
38b0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 6f     /* Minimum lo
38c0: 63 61 6c 20 70 61 79 6c 6f 61 64 20 69 6e 20 61  cal payload in a
38d0: 20 4c 45 41 46 44 41 54 41 20 74 61 62 6c 65 20   LEAFDATA table 
38e0: 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72  */.  BusyHandler
38f0: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20   *pBusyHandler; 
3900: 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f    /* Callback fo
3910: 72 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  r when there is 
3920: 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 20  lock contention 
3930: 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 42 74  */.};.typedef Bt
3940: 72 65 65 20 42 74 3b 0a 0a 2f 2a 0a 2a 2a 20 42  ree Bt;../*.** B
3950: 74 72 65 65 2e 69 6e 54 72 61 6e 73 20 6d 61 79  tree.inTrans may
3960: 20 74 61 6b 65 20 6f 6e 65 20 6f 66 20 74 68 65   take one of the
3970: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65   following value
3980: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 52  s..*/.#define TR
3990: 41 4e 53 5f 4e 4f 4e 45 20 20 30 0a 23 64 65 66  ANS_NONE  0.#def
39a0: 69 6e 65 20 54 52 41 4e 53 5f 52 45 41 44 20 20  ine TRANS_READ  
39b0: 31 0a 23 64 65 66 69 6e 65 20 54 52 41 4e 53 5f  1.#define TRANS_
39c0: 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 41  WRITE 2../*.** A
39d0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
39e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
39f0: 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  cture is used to
3a00: 20 68 6f 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f   hold informatio
3a10: 6e 0a 2a 2a 20 61 62 6f 75 74 20 61 20 63 65 6c  n.** about a cel
3a20: 6c 2e 20 20 54 68 65 20 70 61 72 73 65 43 65 6c  l.  The parseCel
3a30: 6c 50 74 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  lPtr() function 
3a40: 66 69 6c 6c 73 20 69 6e 20 74 68 69 73 20 73 74  fills in this st
3a50: 72 75 63 74 75 72 65 0a 2a 2a 20 62 61 73 65 64  ructure.** based
3a60: 20 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   on information 
3a70: 65 78 74 72 61 63 74 20 66 72 6f 6d 20 74 68 65  extract from the
3a80: 20 72 61 77 20 64 69 73 6b 20 70 61 67 65 2e 0a   raw disk page..
3a90: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
3aa0: 74 20 43 65 6c 6c 49 6e 66 6f 20 43 65 6c 6c 49  t CellInfo CellI
3ab0: 6e 66 6f 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c  nfo;.struct Cell
3ac0: 49 6e 66 6f 20 7b 0a 20 20 75 38 20 2a 70 43 65  Info {.  u8 *pCe
3ad0: 6c 6c 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ll;     /* Point
3ae0: 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
3af0: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
3b00: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 3b 20 20  */.  i64 nKey;  
3b10: 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 66      /* The key f
3b20: 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
3b30: 2c 20 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 62  , or number of b
3b40: 79 74 65 73 20 69 6e 20 6b 65 79 20 2a 2f 0a 20  ytes in key */. 
3b50: 20 75 33 32 20 6e 44 61 74 61 3b 20 20 20 20 20   u32 nData;     
3b60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
3b70: 65 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  es of data */.  
3b80: 75 31 36 20 6e 48 65 61 64 65 72 3b 20 20 20 2f  u16 nHeader;   /
3b90: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 63 65  * Size of the ce
3ba0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
3bb0: 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
3bc0: 75 31 36 20 6e 4c 6f 63 61 6c 3b 20 20 20 20 2f  u16 nLocal;    /
3bd0: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  * Amount of payl
3be0: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
3bf0: 20 2a 2f 0a 20 20 75 31 36 20 69 4f 76 65 72 66   */.  u16 iOverf
3c00: 6c 6f 77 3b 20 2f 2a 20 4f 66 66 73 65 74 20 74  low; /* Offset t
3c10: 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  o overflow page 
3c20: 6e 75 6d 62 65 72 2e 20 20 5a 65 72 6f 20 69 66  number.  Zero if
3c30: 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 2a 2f 0a   no overflow */.
3c40: 20 20 75 31 36 20 6e 53 69 7a 65 3b 20 20 20 20    u16 nSize;    
3c50: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
3c60: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 6e 20  cell content on 
3c70: 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
3c80: 70 61 67 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  page */.};../*.*
3c90: 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 61 20  * A cursor is a 
3ca0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 61 72  pointer to a par
3cb0: 74 69 63 75 6c 61 72 20 65 6e 74 72 79 20 69 6e  ticular entry in
3cc0: 20 74 68 65 20 42 54 72 65 65 2e 0a 2a 2a 20 54   the BTree..** T
3cd0: 68 65 20 65 6e 74 72 79 20 69 73 20 69 64 65 6e  he entry is iden
3ce0: 74 69 66 69 65 64 20 62 79 20 69 74 73 20 4d 65  tified by its Me
3cf0: 6d 50 61 67 65 20 61 6e 64 20 74 68 65 20 69 6e  mPage and the in
3d00: 64 65 78 20 69 6e 0a 2a 2a 20 4d 65 6d 50 61 67  dex in.** MemPag
3d10: 65 2e 61 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65  e.aCell[] of the
3d20: 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 72 75 63   entry..*/.struc
3d30: 74 20 42 74 43 75 72 73 6f 72 20 7b 0a 20 20 42  t BtCursor {.  B
3d40: 74 72 65 65 20 2a 70 42 74 3b 20 20 20 20 20 20  tree *pBt;      
3d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3d60: 42 74 72 65 65 20 74 6f 20 77 68 69 63 68 20 74  Btree to which t
3d70: 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
3d80: 67 73 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  gs */.  BtCursor
3d90: 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76 3b   *pNext, *pPrev;
3da0: 20 20 2f 2a 20 46 6f 72 6d 73 20 61 20 6c 69 6e    /* Forms a lin
3db0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
3dc0: 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 69 6e 74  cursors */.  int
3dd0: 20 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69   (*xCompare)(voi
3de0: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
3df0: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
3e00: 64 2a 29 3b 20 2f 2a 20 4b 65 79 20 63 6f 6d 70  d*); /* Key comp
3e10: 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20   func */.  void 
3e20: 2a 70 41 72 67 3b 20 20 20 20 20 20 20 20 20 20  *pArg;          
3e30: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
3e40: 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
3e50: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f  */.  Pgno pgnoRo
3e60: 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ot;            /
3e70: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
3e80: 6f 66 20 74 68 69 73 20 74 72 65 65 20 2a 2f 0a  of this tree */.
3e90: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
3ea0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
3eb0: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
3ec0: 73 20 74 68 65 20 65 6e 74 72 79 20 2a 2f 0a 20  s the entry */. 
3ed0: 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
3ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
3ef0: 64 65 78 20 6f 66 20 74 68 65 20 65 6e 74 72 79  dex of the entry
3f00: 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
3f10: 5b 5d 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  [] */.  CellInfo
3f20: 20 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20   info;          
3f30: 20 20 2f 2a 20 41 20 70 61 72 73 65 20 6f 66 20    /* A parse of 
3f40: 74 68 65 20 63 65 6c 6c 20 77 65 20 61 72 65 20  the cell we are 
3f50: 70 6f 69 6e 74 69 6e 67 20 61 74 20 2a 2f 0a 20  pointing at */. 
3f60: 20 75 38 20 77 72 46 6c 61 67 3b 20 20 20 20 20   u8 wrFlag;     
3f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3f80: 75 65 20 69 66 20 77 72 69 74 61 62 6c 65 20 2a  ue if writable *
3f90: 2f 0a 20 20 75 38 20 69 73 56 61 6c 69 64 3b 20  /.  u8 isValid; 
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3fb0: 20 54 52 55 45 20 69 66 20 70 6f 69 6e 74 73 20   TRUE if points 
3fc0: 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
3fd0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
3fe0: 65 20 54 52 41 43 45 20 6d 61 63 72 6f 20 77 69  e TRACE macro wi
3ff0: 6c 6c 20 70 72 69 6e 74 20 68 69 67 68 2d 6c 65  ll print high-le
4000: 76 65 6c 20 73 74 61 74 75 73 20 69 6e 66 6f 72  vel status infor
4010: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
4020: 0a 2a 2a 20 62 74 72 65 65 20 6f 70 65 72 61 74  .** btree operat
4030: 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 67 6c 6f  ion when the glo
4040: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 73 71 6c  bal variable sql
4050: 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65  ite3_btree_trace
4060: 20 69 73 0a 2a 2a 20 65 6e 61 62 6c 65 64 2e 0a   is.** enabled..
4070: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  */.#if SQLITE_TE
4080: 53 54 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43  ST.# define TRAC
4090: 45 28 58 29 20 20 20 69 66 28 20 73 71 6c 69 74  E(X)   if( sqlit
40a0: 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65 20 29  e3_btree_trace )
40b0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
40c0: 20 20 20 20 20 20 20 20 20 20 7b 20 73 71 6c 69            { sqli
40d0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 58  te3DebugPrintf X
40e0: 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ; fflush(stdout)
40f0: 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ; }.#else.# defi
4100: 6e 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64  ne TRACE(X).#end
4110: 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  if.int sqlite3_b
4120: 74 72 65 65 5f 74 72 61 63 65 3d 30 3b 20 20 2f  tree_trace=0;  /
4130: 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65  * True to enable
4140: 20 74 72 61 63 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a   tracing */../*.
4150: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
4160: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
4170: 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f   int checkReadLo
4180: 63 6b 73 28 42 74 72 65 65 2a 2c 50 67 6e 6f 2c  cks(Btree*,Pgno,
4190: 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a  BtCursor*);../*.
41a0: 2a 2a 20 52 65 61 64 20 6f 72 20 77 72 69 74 65  ** Read or write
41b0: 20 61 20 74 77 6f 2d 20 61 6e 64 20 66 6f 75 72   a two- and four
41c0: 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
41d0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 2e   integer values.
41e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 67  .*/.static u32 g
41f0: 65 74 32 62 79 74 65 28 75 6e 73 69 67 6e 65 64  et2byte(unsigned
4200: 20 63 68 61 72 20 2a 70 29 7b 0a 20 20 72 65 74   char *p){.  ret
4210: 75 72 6e 20 28 70 5b 30 5d 3c 3c 38 29 20 7c 20  urn (p[0]<<8) | 
4220: 70 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75  p[1];.}.static u
4230: 33 32 20 67 65 74 34 62 79 74 65 28 75 6e 73 69  32 get4byte(unsi
4240: 67 6e 65 64 20 63 68 61 72 20 2a 70 29 7b 0a 20  gned char *p){. 
4250: 20 72 65 74 75 72 6e 20 28 70 5b 30 5d 3c 3c 32   return (p[0]<<2
4260: 34 29 20 7c 20 28 70 5b 31 5d 3c 3c 31 36 29 20  4) | (p[1]<<16) 
4270: 7c 20 28 70 5b 32 5d 3c 3c 38 29 20 7c 20 70 5b  | (p[2]<<8) | p[
4280: 33 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  3];.}.static voi
4290: 64 20 70 75 74 32 62 79 74 65 28 75 6e 73 69 67  d put2byte(unsig
42a0: 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 33 32  ned char *p, u32
42b0: 20 76 29 7b 0a 20 20 70 5b 30 5d 20 3d 20 76 3e   v){.  p[0] = v>
42c0: 3e 38 3b 0a 20 20 70 5b 31 5d 20 3d 20 76 3b 0a  >8;.  p[1] = v;.
42d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  }.static void pu
42e0: 74 34 62 79 74 65 28 75 6e 73 69 67 6e 65 64 20  t4byte(unsigned 
42f0: 63 68 61 72 20 2a 70 2c 20 75 33 32 20 76 29 7b  char *p, u32 v){
4300: 0a 20 20 70 5b 30 5d 20 3d 20 76 3e 3e 32 34 3b  .  p[0] = v>>24;
4310: 0a 20 20 70 5b 31 5d 20 3d 20 76 3e 3e 31 36 3b  .  p[1] = v>>16;
4320: 0a 20 20 70 5b 32 5d 20 3d 20 76 3e 3e 38 3b 0a  .  p[2] = v>>8;.
4330: 20 20 70 5b 33 5d 20 3d 20 76 3b 0a 7d 0a 0a 2f    p[3] = v;.}../
4340: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
4350: 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
4360: 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20  variable-length 
4370: 69 6e 74 65 67 65 72 73 2e 20 20 54 68 65 73 65  integers.  These
4380: 20 75 73 65 64 20 74 6f 0a 2a 2a 20 62 65 20 64   used to.** be d
4390: 65 66 69 6e 65 64 20 6c 6f 63 61 6c 6c 79 2c 20  efined locally, 
43a0: 62 75 74 20 6e 6f 77 20 77 65 20 75 73 65 20 74  but now we use t
43b0: 68 65 20 76 61 72 69 6e 74 20 72 6f 75 74 69 6e  he varint routin
43c0: 65 73 20 69 6e 20 74 68 65 20 75 74 69 6c 2e 63  es in the util.c
43d0: 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65  .** file..*/.#de
43e0: 66 69 6e 65 20 67 65 74 56 61 72 69 6e 74 20 20  fine getVarint  
43f0: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
4400: 6e 74 0a 23 64 65 66 69 6e 65 20 67 65 74 56 61  nt.#define getVa
4410: 72 69 6e 74 33 32 20 20 73 71 6c 69 74 65 33 47  rint32  sqlite3G
4420: 65 74 56 61 72 69 6e 74 33 32 0a 23 64 65 66 69  etVarint32.#defi
4430: 6e 65 20 70 75 74 56 61 72 69 6e 74 20 20 20 20  ne putVarint    
4440: 73 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74  sqlite3PutVarint
4450: 0a 0a 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73  ../* The databas
4460: 65 20 70 61 67 65 20 74 68 65 20 50 45 4e 44 49  e page the PENDI
4470: 4e 47 5f 42 59 54 45 20 6f 63 63 75 70 69 65 73  NG_BYTE occupies
4480: 2e 20 54 68 69 73 20 70 61 67 65 20 69 73 20 6e  . This page is n
4490: 65 76 65 72 20 75 73 65 64 2e 0a 2a 2a 20 54 4f  ever used..** TO
44a0: 44 4f 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  DO: This macro i
44b0: 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 79 20  s very similary 
44c0: 74 6f 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  to PAGER_MJ_PGNO
44d0: 28 29 20 69 6e 20 70 61 67 65 72 2e 63 2e 20 54  () in pager.c. T
44e0: 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 70 6f  hey.** should po
44f0: 73 73 69 62 6c 79 20 62 65 20 63 6f 6e 73 6f 6c  ssibly be consol
4500: 69 64 61 74 65 64 20 28 70 72 65 73 75 6d 61 62  idated (presumab
4510: 6c 79 20 69 6e 20 70 61 67 65 72 2e 68 29 2e 0a  ly in pager.h)..
4520: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 45 4e 44 49  */.#define PENDI
4530: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
4540: 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  ) ((PENDING_BYTE
4550: 2f 28 70 42 74 29 2d 3e 70 61 67 65 53 69 7a 65  /(pBt)->pageSize
4560: 29 2b 31 29 0a 0a 23 69 66 6e 64 65 66 20 53 51  )+1)..#ifndef SQ
4570: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
4580: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  CUUM./*.** These
4590: 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20 74   macros define t
45a0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
45b0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
45c0: 6e 74 72 79 20 66 6f 72 20 61 20 0a 2a 2a 20 64  ntry for a .** d
45d0: 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68  atabase page. Th
45e0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
45f0: 20 74 6f 20 65 61 63 68 20 69 73 20 74 68 65 20   to each is the 
4600: 6e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  number of usable
4610: 0a 2a 2a 20 62 79 74 65 73 20 6f 6e 20 65 61 63  .** bytes on eac
4620: 68 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  h page of the da
4630: 74 61 62 61 73 65 20 28 6f 66 74 65 6e 20 31 30  tabase (often 10
4640: 32 34 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  24). The second 
4650: 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
4660: 75 6d 62 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70  umber to look up
4670: 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20   in the pointer 
4680: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  map..**.** PTRMA
4690: 50 5f 50 41 47 45 4e 4f 20 72 65 74 75 72 6e 73  P_PAGENO returns
46a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
46b0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
46c0: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
46d0: 70 61 67 65 20 74 68 61 74 20 73 74 6f 72 65 73  page that stores
46e0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 70 6f   the required po
46f0: 69 6e 74 65 72 2e 20 50 54 52 4d 41 50 5f 50 54  inter. PTRMAP_PT
4700: 52 4f 46 46 53 45 54 20 72 65 74 75 72 6e 73 0a  ROFFSET returns.
4710: 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  ** the offset of
4720: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
4730: 61 70 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ap entry..**.** 
4740: 49 66 20 74 68 65 20 70 67 6e 6f 20 61 72 67 75  If the pgno argu
4750: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 50  ment passed to P
4760: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20 69 73 20  TRMAP_PAGENO is 
4770: 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
4780: 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 70 67 6e 6f  ge,.** then pgno
4790: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 53 6f   is returned. So
47a0: 20 28 70 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50   (pgno==PTRMAP_P
47b0: 41 47 45 4e 4f 28 70 67 73 7a 2c 20 70 67 6e 6f  AGENO(pgsz, pgno
47c0: 29 29 20 63 61 6e 20 62 65 0a 2a 2a 20 75 73 65  )) can be.** use
47d0: 64 20 74 6f 20 74 65 73 74 20 69 66 20 70 67 6e  d to test if pgn
47e0: 6f 20 69 73 20 61 20 70 6f 69 6e 74 65 72 2d 6d  o is a pointer-m
47f0: 61 70 20 70 61 67 65 2e 20 50 54 52 4d 41 50 5f  ap page. PTRMAP_
4800: 49 53 50 41 47 45 20 69 6d 70 6c 65 6d 65 6e 74  ISPAGE implement
4810: 73 0a 2a 2a 20 74 68 69 73 20 74 65 73 74 2e 0a  s.** this test..
4820: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41  */.#define PTRMA
4830: 50 5f 50 41 47 45 4e 4f 28 70 67 73 7a 2c 20 70  P_PAGENO(pgsz, p
4840: 67 6e 6f 29 20 28 28 28 70 67 6e 6f 2d 32 29 2f  gno) (((pgno-2)/
4850: 28 70 67 73 7a 2f 35 2b 31 29 29 2a 28 70 67 73  (pgsz/5+1))*(pgs
4860: 7a 2f 35 2b 31 29 2b 32 29 0a 23 64 65 66 69 6e  z/5+1)+2).#defin
4870: 65 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  e PTRMAP_PTROFFS
4880: 45 54 28 70 67 73 7a 2c 20 70 67 6e 6f 29 20 28  ET(pgsz, pgno) (
4890: 28 28 70 67 6e 6f 2d 32 29 25 28 70 67 73 7a 2f  ((pgno-2)%(pgsz/
48a0: 35 2b 31 29 2d 31 29 2a 35 29 0a 23 64 65 66 69  5+1)-1)*5).#defi
48b0: 6e 65 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ne PTRMAP_ISPAGE
48c0: 28 70 67 73 7a 2c 20 70 67 6e 6f 29 20 28 50 54  (pgsz, pgno) (PT
48d0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 67 73 7a  RMAP_PAGENO(pgsz
48e0: 2c 70 67 6e 6f 29 3d 3d 70 67 6e 6f 29 0a 0a 2f  ,pgno)==pgno)../
48f0: 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
4900: 20 6d 61 70 20 69 73 20 61 20 6c 6f 6f 6b 75 70   map is a lookup
4910: 20 74 61 62 6c 65 20 74 68 61 74 20 69 64 65 6e   table that iden
4920: 74 69 66 69 65 73 20 74 68 65 20 70 61 72 65 6e  tifies the paren
4930: 74 20 70 61 67 65 20 66 6f 72 0a 2a 2a 20 65 61  t page for.** ea
4940: 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e  ch child page in
4950: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4960: 6c 65 2e 20 20 54 68 65 20 70 61 72 65 6e 74 20  le.  The parent 
4970: 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
4980: 20 74 68 61 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e   that.** contain
4990: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
49a0: 68 65 20 63 68 69 6c 64 2e 20 20 45 76 65 72 79  he child.  Every
49b0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
49c0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  abase contains.*
49d0: 2a 20 30 20 6f 72 20 31 20 70 61 72 65 6e 74 20  * 0 or 1 parent 
49e0: 70 61 67 65 73 2e 20 20 28 49 6e 20 74 68 69 73  pages.  (In this
49f0: 20 63 6f 6e 74 65 78 74 20 27 64 61 74 61 62 61   context 'databa
4a00: 73 65 20 70 61 67 65 27 20 72 65 66 65 72 73 0a  se page' refers.
4a10: 2a 2a 20 74 6f 20 61 6e 79 20 70 61 67 65 20 74  ** to any page t
4a20: 68 61 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  hat is not part 
4a30: 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  of the pointer m
4a40: 61 70 20 69 74 73 65 6c 66 2e 29 20 20 45 61 63  ap itself.)  Eac
4a50: 68 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a  h pointer map.**
4a60: 20 65 6e 74 72 79 20 63 6f 6e 73 69 73 74 73 20   entry consists 
4a70: 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  of a single byte
4a80: 20 27 74 79 70 65 27 20 61 6e 64 20 61 20 34 20   'type' and a 4 
4a90: 62 79 74 65 20 70 61 72 65 6e 74 20 70 61 67 65  byte parent page
4aa0: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 54 68 65 20   number..** The 
4ab0: 50 54 52 4d 41 50 5f 58 58 58 20 69 64 65 6e 74  PTRMAP_XXX ident
4ac0: 69 66 69 65 72 73 20 62 65 6c 6f 77 20 61 72 65  ifiers below are
4ad0: 20 74 68 65 20 76 61 6c 69 64 20 74 79 70 65 73   the valid types
4ae0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 75 72 70  ..**.** The purp
4af0: 6f 73 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ose of the point
4b00: 65 72 20 6d 61 70 20 69 73 20 74 6f 20 66 61 63  er map is to fac
4b10: 69 6c 69 74 79 20 6d 6f 76 69 6e 67 20 70 61 67  ility moving pag
4b20: 65 73 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 70  es from one.** p
4b30: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 66  osition in the f
4b40: 69 6c 65 20 74 6f 20 61 6e 6f 74 68 65 72 20 61  ile to another a
4b50: 73 20 70 61 72 74 20 6f 66 20 61 75 74 6f 76 61  s part of autova
4b60: 63 75 75 6d 2e 20 20 57 68 65 6e 20 61 20 70 61  cuum.  When a pa
4b70: 67 65 0a 2a 2a 20 69 73 20 6d 6f 76 65 64 2c 20  ge.** is moved, 
4b80: 74 68 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 69  the pointer in i
4b90: 74 73 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  ts parent must b
4ba0: 65 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69  e updated to poi
4bb0: 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 77  nt to the.** new
4bc0: 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 20   location.  The 
4bd0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 75  pointer map is u
4be0: 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  sed to locate th
4bf0: 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 71 75  e parent page qu
4c00: 69 63 6b 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  ickly..**.** PTR
4c10: 4d 41 50 5f 52 4f 4f 54 50 41 47 45 3a 20 54 68  MAP_ROOTPAGE: Th
4c20: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
4c30: 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 2e 20  is a root-page. 
4c40: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
4c50: 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
4c60: 20 20 20 20 20 20 20 20 20 20 20 75 73 65 64 20             used 
4c70: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
4c80: 0a 2a 2a 20 50 54 52 4d 41 50 5f 46 52 45 45 50  .** PTRMAP_FREEP
4c90: 41 47 45 3a 20 54 68 65 20 64 61 74 61 62 61 73  AGE: The databas
4ca0: 65 20 70 61 67 65 20 69 73 20 61 6e 20 75 6e 75  e page is an unu
4cb0: 73 65 64 20 28 66 72 65 65 29 20 70 61 67 65 2e  sed (free) page.
4cc0: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
4cd0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
4ce0: 20 20 20 20 20 20 69 73 20 6e 6f 74 20 75 73 65        is not use
4cf0: 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
4d00: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
4d10: 52 46 4c 4f 57 31 3a 20 54 68 65 20 64 61 74 61  RFLOW1: The data
4d20: 62 61 73 65 20 70 61 67 65 20 69 73 20 74 68 65  base page is the
4d30: 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 61   first page in a
4d40: 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20 20 20 20   list of .**    
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
4d60: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
4d70: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
4d80: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 61  dentifies the pa
4d90: 67 65 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ge that.**      
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
4db0: 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 77  tains the cell w
4dc0: 69 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ith a pointer to
4dd0: 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
4de0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
4df0: 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 54 68 65  P_OVERFLOW2: The
4e00: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
4e10: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  s the second or 
4e20: 6c 61 74 65 72 20 70 61 67 65 20 69 6e 20 61 20  later page in a 
4e30: 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  list of.**      
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
4e50: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
4e60: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 64 65   page-number ide
4e70: 6e 74 69 66 69 65 73 20 74 68 65 20 70 72 65 76  ntifies the prev
4e80: 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ious.**         
4e90: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 69            page i
4ea0: 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  n the overflow p
4eb0: 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  age list..**.** 
4ec0: 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 54 68  PTRMAP_BTREE: Th
4ed0: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
4ee0: 69 73 20 61 20 6e 6f 6e 2d 72 6f 6f 74 20 62 74  is a non-root bt
4ef0: 72 65 65 20 70 61 67 65 2e 20 54 68 65 20 70 61  ree page. The pa
4f00: 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  ge number.**    
4f10: 20 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74             ident
4f20: 69 66 69 65 73 20 74 68 65 20 70 61 72 65 6e 74  ifies the parent
4f30: 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 74 72   page in the btr
4f40: 65 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ee..*/.#define P
4f50: 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 31  TRMAP_ROOTPAGE 1
4f60: 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f  .#define PTRMAP_
4f70: 46 52 45 45 50 41 47 45 20 32 0a 23 64 65 66 69  FREEPAGE 2.#defi
4f80: 6e 65 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ne PTRMAP_OVERFL
4f90: 4f 57 31 20 33 0a 23 64 65 66 69 6e 65 20 50 54  OW1 3.#define PT
4fa0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 34  RMAP_OVERFLOW2 4
4fb0: 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f  .#define PTRMAP_
4fc0: 42 54 52 45 45 20 35 0a 0a 2f 2a 0a 2a 2a 20 57  BTREE 5../*.** W
4fd0: 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
4fe0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
4ff0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
5000: 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74  outine updates t
5010: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
5020: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75  ntry for page nu
5030: 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f  mber 'key'.** so
5040: 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f   that it maps to
5050: 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e   type 'eType' an
5060: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
5070: 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20  mber 'pgno'..** 
5080: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
5090: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
50a0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
50b0: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
50c0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
50d0: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28  c int ptrmapPut(
50e0: 42 74 72 65 65 20 2a 70 42 74 2c 20 50 67 6e 6f  Btree *pBt, Pgno
50f0: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
5100: 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20  Pgno parent){.  
5110: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
5120: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
5130: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ap page */.  Pgn
5140: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 2f 2a 20  o iPtrmap;   /* 
5150: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
5160: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
5170: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
5180: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f   /* Offset in po
5190: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
51a0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
51b0: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
51c0: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
51d0: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  key==0 ){.    re
51e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
51f0: 55 50 54 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  UPT;.  }.  iPtrm
5200: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
5210: 4e 4f 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  NO(pBt->usableSi
5220: 7a 65 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  ze, key);.  rc =
5230: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
5240: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
5250: 50 74 72 6d 61 70 2c 20 28 76 6f 69 64 20 2a 2a  Ptrmap, (void **
5260: 29 26 70 50 74 72 6d 61 70 29 3b 0a 20 20 69 66  )&pPtrmap);.  if
5270: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
5290: 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
52a0: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
52b0: 54 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  T(pBt->usableSiz
52c0: 65 2c 20 6b 65 79 29 3b 0a 0a 20 20 69 66 28 20  e, key);..  if( 
52d0: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
52e0: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
52f0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
5300: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
5310: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
5320: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
5330: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
5340: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
5350: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
5360: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
5370: 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 69 66 28  Ptrmap);.    if(
5380: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5390: 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b  {.      pPtrmap[
53a0: 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b  offset] = eType;
53b0: 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
53c0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
53d0: 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20  1], parent);.   
53e0: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
53f0: 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 74  3pager_unref(pPt
5400: 72 6d 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  rmap);.  return 
5410: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
5420: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
5430: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
5440: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5450: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
5460: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
5470: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
5480: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
5490: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
54a0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
54b0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
54c0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
54d0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
54e0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
54f0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
5500: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
5510: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
5520: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
5530: 61 70 47 65 74 28 42 74 72 65 65 20 2a 70 42 74  apGet(Btree *pBt
5540: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a  , Pgno key, u8 *
5550: 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50  pEType, Pgno *pP
5560: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 50 74 72  gno){.  int iPtr
5570: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
5580: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69  inter map page i
5590: 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50  ndex */.  u8 *pP
55a0: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
55b0: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
55c0: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f   data */.  int o
55d0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
55e0: 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79   Offset of entry
55f0: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
5600: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
5610: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
5620: 5f 50 41 47 45 4e 4f 28 70 42 74 2d 3e 75 73 61  _PAGENO(pBt->usa
5630: 62 6c 65 53 69 7a 65 2c 20 6b 65 79 29 3b 0a 20  bleSize, key);. 
5640: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
5650: 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61 67  er_get(pBt->pPag
5660: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 28 76 6f  er, iPtrmap, (vo
5670: 69 64 20 2a 2a 29 26 70 50 74 72 6d 61 70 29 3b  id **)&pPtrmap);
5680: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
5690: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
56a0: 20 7d 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50   }..  offset = P
56b0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
56c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2c  pBt->usableSize,
56d0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 70 45 54   key);.  if( pET
56e0: 79 70 65 20 29 20 2a 70 45 54 79 70 65 20 3d 20  ype ) *pEType = 
56f0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
5700: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
5710: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
5720: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
5730: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
5740: 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 74 72  pager_unref(pPtr
5750: 6d 61 70 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  map);.  if( *pET
5760: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
5770: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
5780: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65  TE_CORRUPT;.  re
5790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
57a0: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
57b0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
57c0: 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  UUM */../*.** Gi
57d0: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
57e0: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
57f0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
5800: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
5810: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
5820: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
5830: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
5840: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
5850: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
5860: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
5870: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
5880: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
5890: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
58a0: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
58b0: 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
58c0: 75 38 20 2a 66 69 6e 64 43 65 6c 6c 28 4d 65 6d  u8 *findCell(Mem
58d0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
58e0: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 64   iCell){.  u8 *d
58f0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
5900: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43  ta;.  assert( iC
5910: 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell>=0 );.  asse
5920: 72 74 28 20 69 43 65 6c 6c 3c 67 65 74 32 62 79  rt( iCell<get2by
5930: 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
5940: 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 20 29 3b  hdrOffset+3]) );
5950: 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61 20 2b  .  return data +
5960: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5970: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
5980: 74 2b 32 2a 69 43 65 6c 6c 5d 29 3b 0a 7d 0a 0a  t+2*iCell]);.}..
5990: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72  /*.** This a mor
59a0: 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f  e complex versio
59b0: 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20  n of findCell() 
59c0: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
59d0: 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  * pages that do 
59e0: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
59f0: 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73   cells.  See ins
5a00: 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ert.*/.static u8
5a10: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
5a20: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
5a30: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
5a40: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
5a50: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
5a60: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
5a70: 20 20 20 20 69 6e 74 20 6b 3b 0a 09 73 74 72 75      int k;..stru
5a80: 63 74 20 4d 65 6d 50 61 67 65 3a 3a 5f 4f 76 66  ct MemPage::_Ovf
5a90: 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20  lCell *pOvfl;.  
5aa0: 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65    pOvfl = &pPage
5ab0: 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  ->aOvfl[i];.    
5ac0: 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a  k = pOvfl->idx;.
5ad0: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
5ae0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
5af0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
5b00: 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e    return pOvfl->
5b10: 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pCell;.      }. 
5b20: 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20       iCell--;.  
5b30: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5b40: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
5b50: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   iCell);.}../*.*
5b60: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
5b70: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
5b80: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
5b90: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
5ba0: 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74    There.** are t
5bb0: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
5bc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 70  his function.  p
5bd0: 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73  arseCell() takes
5be0: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 0a 2a 2a   a cell index.**
5bf0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
5c00: 72 67 75 6d 65 6e 74 20 61 6e 64 20 70 61 72 73  rgument and pars
5c10: 65 43 65 6c 6c 50 74 72 28 29 20 74 61 6b 65 73  eCellPtr() takes
5c20: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5c30: 65 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 74 68 65  e.** body of the
5c40: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
5c50: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
5c60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 72  .static void par
5c70: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
5c80: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
5c90: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
5ca0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
5cb0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5cd0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
5ce0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
5cf0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
5d00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
5d10: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
5d20: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  e */.){.  int n;
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
5d50: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
5d60: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
5d70: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
5d80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5d90: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
5da0: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 70   payload */..  p
5db0: 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43  Info->pCell = pC
5dc0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ell;.  assert( p
5dd0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
5de0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
5df0: 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e  );.  n = pPage->
5e00: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
5e10: 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70  assert( n==4-4*p
5e20: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
5e30: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
5e40: 74 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67  ta ){.    n += g
5e50: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
5e60: 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29  l[n], &nPayload)
5e70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
5e80: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d  Payload = 0;.  }
5e90: 0a 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e  .  n += getVarin
5ea0: 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36  t(&pCell[n], (u6
5eb0: 34 20 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79  4 *)&pInfo->nKey
5ec0: 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61  );.  pInfo->nHea
5ed0: 64 65 72 20 3d 20 6e 3b 0a 20 20 70 49 6e 66 6f  der = n;.  pInfo
5ee0: 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f  ->nData = nPaylo
5ef0: 61 64 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ad;.  if( !pPage
5f00: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
5f10: 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 70 49 6e 66  nPayload += pInf
5f20: 6f 2d 3e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  o->nKey;.  }.  i
5f30: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
5f40: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
5f50: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
5f60: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
5f70: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
5f80: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
5f90: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
5fa0: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
5fb0: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
5fc0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
5fd0: 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20     int nSize;   
5fe0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
5ff0: 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  size of cell con
6000: 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  tent in bytes */
6010: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
6020: 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  al = nPayload;. 
6030: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
6040: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 6e 53 69  low = 0;.    nSi
6050: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
6060: 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  n;.    if( nSize
6070: 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  <4 ){.      nSiz
6080: 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a  e = 4;        /*
6090: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
60a0: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d  ze is 4 */.    }
60b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
60c0: 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c  e = nSize;.  }el
60d0: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
60e0: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
60f0: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
6100: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
6110: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
6120: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
6130: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
6140: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
6150: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
6160: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
6170: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
6180: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
6190: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
61a0: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
61b0: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
61c0: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
61d0: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
61e0: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
61f0: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
6200: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
6210: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
6220: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
6230: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
6240: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
6250: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
6260: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
6270: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
6280: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
6290: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
62a0: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
62b0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
62c0: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
62d0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
62e0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
62f0: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
6300: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
6310: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
6320: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
6330: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
6340: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
6350: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
6360: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
6370: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
6380: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
6390: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
63a0: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
63b0: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
63c0: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
63d0: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
63e0: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
63f0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
6400: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
6410: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
6420: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
6430: 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20  al = surplus;.  
6440: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
6450: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d  Info->nLocal = m
6460: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
6470: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
6480: 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  low = pInfo->nLo
6490: 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e  cal + n;.    pIn
64a0: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66  fo->nSize = pInf
64b0: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34  o->iOverflow + 4
64c0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
64d0: 6f 69 64 20 70 61 72 73 65 43 65 6c 6c 28 0a 20  oid parseCell(. 
64e0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
64f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
6500: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6510: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43  cell */.  int iC
6520: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
6530: 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e    /* The cell in
6540: 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c  dex.  First cell
6550: 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49   is 0 */.  CellI
6560: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
6570: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
6580: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
6590: 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74  ){.  parseCellPt
65a0: 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  r(pPage, findCel
65b0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c  l(pPage, iCell),
65c0: 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pInfo);.}../*.*
65d0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
65e0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
65f0: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
6600: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
6610: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
6620: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
6630: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
6640: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
6650: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
6660: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
6670: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
6680: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
6690: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
66a0: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
66b0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
66c0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
66d0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 65  UG.static int ce
66e0: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
66f0: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
6700: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
6710: 66 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28  fo;.  parseCell(
6720: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69  pPage, iCell, &i
6730: 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nfo);.  return i
6740: 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e  nfo.nSize;.}.#en
6750: 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 63  dif.static int c
6760: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
6770: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
6780: 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  Cell){.  CellInf
6790: 6f 20 69 6e 66 6f 3b 0a 20 20 70 61 72 73 65 43  o info;.  parseC
67a0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
67b0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72  ell, &info);.  r
67c0: 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65  eturn info.nSize
67d0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
67e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
67f0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
6800: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
6810: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
6820: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
6830: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
6840: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
6850: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
6860: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
6870: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
6880: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
6890: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
68a0: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
68b0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
68c0: 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c  ll){.  if( pCell
68d0: 20 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f   ){.    CellInfo
68e0: 20 69 6e 66 6f 3b 0a 20 20 20 20 70 61 72 73 65   info;.    parse
68f0: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
6900: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
6910: 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74    if( (info.nDat
6920: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
6930: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69  ?0:info.nKey))>i
6940: 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
6950: 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
6960: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
6970: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
6980: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
6990: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
69a0: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
69b0: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
69c0: 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  ge->pgno);.    }
69d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
69e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a  LITE_OK;.}./*.**
69f0: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74   If the cell wit
6a00: 68 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e  h index iCell on
6a10: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
6a20: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
6a30: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
6a40: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
6a50: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
6a60: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
6a70: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
6a80: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
6a90: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66  int ptrmapPutOvf
6aa0: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
6ab0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
6ac0: 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 70 43 65  u8 *pCell;.  pCe
6ad0: 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  ll = findOverflo
6ae0: 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  wCell(pPage, iCe
6af0: 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74  ll);.  return pt
6b00: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
6b10: 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a  Page, pCell);.}.
6b20: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
6b30: 6f 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  o sanity checkin
6b40: 67 20 6f 6e 20 61 20 70 61 67 65 2e 20 20 54 68  g on a page.  Th
6b50: 72 6f 77 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  row an exception
6b60: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 0a   if anything is.
6b70: 2a 2a 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2a  ** not right..**
6b80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6b90: 20 69 73 20 75 73 65 64 20 66 6f 72 20 69 6e 74   is used for int
6ba0: 65 72 6e 61 6c 20 65 72 72 6f 72 20 63 68 65 63  ernal error chec
6bb0: 6b 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 74 20 69  king only.  It i
6bc0: 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 66 72 6f  s omitted.** fro
6bd0: 6d 20 6d 6f 73 74 20 62 75 69 6c 64 73 2e 0a 2a  m most builds..*
6be0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 42 54  /.#if defined(BT
6bf0: 52 45 45 5f 44 45 42 55 47 29 20 26 26 20 21 64  REE_DEBUG) && !d
6c00: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
6c10: 26 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20  & 0.static void 
6c20: 5f 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 4d  _pageIntegrity(M
6c30: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
6c40: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
6c50: 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20  ;.  u8 *data;.  
6c60: 69 6e 74 20 69 2c 20 6a 2c 20 69 64 78 2c 20 63  int i, j, idx, c
6c70: 2c 20 70 63 2c 20 68 64 72 2c 20 6e 46 72 65 65  , pc, hdr, nFree
6c80: 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  ;.  int cellOffs
6c90: 65 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c  et;.  int nCell,
6ca0: 20 63 65 6c 6c 4c 69 6d 69 74 3b 0a 20 20 75 38   cellLimit;.  u8
6cb0: 20 2a 75 73 65 64 3b 0a 0a 20 20 75 73 65 64 20   *used;..  used 
6cc0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
6cd0: 77 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  w( pPage->pBt->p
6ce0: 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  ageSize );.  if(
6cf0: 20 75 73 65 64 3d 3d 30 20 29 20 72 65 74 75 72   used==0 ) retur
6d00: 6e 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  n;.  usableSize 
6d10: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
6d20: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  ableSize;.  asse
6d30: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
6d40: 3d 3d 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68  ==&((unsigned ch
6d50: 61 72 2a 29 70 50 61 67 65 29 5b 2d 70 50 61 67  ar*)pPage)[-pPag
6d60: 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
6d70: 5d 20 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ] );.  hdr = pPa
6d80: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
6d90: 20 61 73 73 65 72 74 28 20 68 64 72 3d 3d 28 70   assert( hdr==(p
6da0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
6db0: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
6dc0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
6dd0: 6f 3d 3d 73 71 6c 69 74 65 33 70 61 67 65 72 5f  o==sqlite3pager_
6de0: 70 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  pagenumber(pPage
6df0: 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 63 20  ->aData) );.  c 
6e00: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 68  = pPage->aData[h
6e10: 64 72 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  dr];.  if( pPage
6e20: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
6e30: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
6e40: 65 61 66 20 3d 3d 20 28 28 63 20 26 20 50 54 46  eaf == ((c & PTF
6e50: 5f 4c 45 41 46 29 21 3d 30 29 20 29 3b 0a 20 20  _LEAF)!=0) );.  
6e60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
6e70: 3e 7a 65 72 6f 44 61 74 61 20 3d 3d 20 28 28 63  >zeroData == ((c
6e80: 20 26 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29   & PTF_ZERODATA)
6e90: 21 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  !=0) );.    asse
6ea0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  rt( pPage->leafD
6eb0: 61 74 61 20 3d 3d 20 28 28 63 20 26 20 50 54 46  ata == ((c & PTF
6ec0: 5f 4c 45 41 46 44 41 54 41 29 21 3d 30 29 20 29  _LEAFDATA)!=0) )
6ed0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
6ee0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 3d 20 28  age->intKey == (
6ef0: 28 63 20 26 20 28 50 54 46 5f 49 4e 54 4b 45 59  (c & (PTF_INTKEY
6f00: 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 29 29 21  |PTF_LEAFDATA))!
6f10: 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
6f20: 74 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  t( pPage->hasDat
6f30: 61 20 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20  a ==.           
6f40: 20 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44    !(pPage->zeroD
6f50: 61 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e  ata || (!pPage->
6f60: 6c 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c  leaf && pPage->l
6f70: 65 61 66 44 61 74 61 29 29 20 29 3b 0a 20 20 20  eafData)) );.   
6f80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6f90: 63 65 6c 6c 4f 66 66 73 65 74 3d 3d 70 50 61 67  cellOffset==pPag
6fa0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 31 32 2d  e->hdrOffset+12-
6fb0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
6fc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
6fd0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
6fe0: 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
6ff0: 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20  ta[hdr+3]) );.  
7000: 7d 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  }.  data = pPage
7010: 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 73 65  ->aData;.  memse
7020: 74 28 75 73 65 64 2c 20 30 2c 20 75 73 61 62 6c  t(used, 0, usabl
7030: 65 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 69 3d  eSize);.  for(i=
7040: 30 3b 20 69 3c 68 64 72 2b 31 30 2d 70 50 61 67  0; i<hdr+10-pPag
7050: 65 2d 3e 6c 65 61 66 2a 34 3b 20 69 2b 2b 29 20  e->leaf*4; i++) 
7060: 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 6e  used[i] = 1;.  n
7070: 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 63 20 3d  Free = 0;.  pc =
7080: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7090: 68 64 72 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65  hdr+1]);.  while
70a0: 28 20 70 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  ( pc ){.    int 
70b0: 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  size;.    assert
70c0: 28 20 70 63 3e 30 20 26 26 20 70 63 3c 75 73 61  ( pc>0 && pc<usa
70d0: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
70e0: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
70f0: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
7100: 20 20 20 61 73 73 65 72 74 28 20 70 63 2b 73 69     assert( pc+si
7110: 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze<=usableSize )
7120: 3b 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73  ;.    nFree += s
7130: 69 7a 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  ize;.    for(i=p
7140: 63 3b 20 69 3c 70 63 2b 73 69 7a 65 3b 20 69 2b  c; i<pc+size; i+
7150: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
7160: 28 20 75 73 65 64 5b 69 5d 3d 3d 30 20 29 3b 0a  ( used[i]==0 );.
7170: 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20        used[i] = 
7180: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 63 20  1;.    }.    pc 
7190: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
71a0: 5b 70 63 5d 29 3b 0a 20 20 7d 0a 20 20 69 64 78  [pc]);.  }.  idx
71b0: 20 3d 20 30 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20   = 0;.  nCell = 
71c0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
71d0: 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c 4c 69  dr+3]);.  cellLi
71e0: 6d 69 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  mit = get2byte(&
71f0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
7200: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
7210: 73 49 6e 69 74 3d 3d 30 20 0a 20 20 20 20 20 20  sInit==0 .      
7220: 20 20 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 46 72     || pPage->nFr
7230: 65 65 3d 3d 6e 46 72 65 65 2b 64 61 74 61 5b 68  ee==nFree+data[h
7240: 64 72 2b 37 5d 2b 63 65 6c 6c 4c 69 6d 69 74 2d  dr+7]+cellLimit-
7250: 28 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  (cellOffset+2*nC
7260: 65 6c 6c 29 20 29 3b 0a 20 20 63 65 6c 6c 4f 66  ell) );.  cellOf
7270: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
7280: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 66 6f 72 28  llOffset;.  for(
7290: 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
72a0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65  +){.    int size
72b0: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
72c0: 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  yte(&data[cellOf
72d0: 66 73 65 74 2b 32 2a 69 5d 29 3b 0a 20 20 20 20  fset+2*i]);.    
72e0: 61 73 73 65 72 74 28 20 70 63 3e 30 20 26 26 20  assert( pc>0 && 
72f0: 70 63 3c 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc<usableSize-4 
7300: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65  );.    size = ce
7310: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64  llSize(pPage, &d
7320: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 61 73  ata[pc]);.    as
7330: 73 65 72 74 28 20 70 63 2b 73 69 7a 65 3c 3d 75  sert( pc+size<=u
7340: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
7350: 20 66 6f 72 28 6a 3d 70 63 3b 20 6a 3c 70 63 2b   for(j=pc; j<pc+
7360: 73 69 7a 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  size; j++){.    
7370: 20 20 61 73 73 65 72 74 28 20 75 73 65 64 5b 6a    assert( used[j
7380: 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 75 73  ]==0 );.      us
7390: 65 64 5b 6a 5d 20 3d 20 31 3b 0a 20 20 20 20 7d  ed[j] = 1;.    }
73a0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 63 65 6c  .  }.  for(i=cel
73b0: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b  lOffset+2*nCell;
73c0: 20 69 3c 63 65 6c 6c 69 6d 69 74 3b 20 69 2b 2b   i<cellimit; i++
73d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 75  ){.    assert( u
73e0: 73 65 64 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 20  sed[i]==0 );.   
73f0: 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20   used[i] = 1;.  
7400: 7d 0a 20 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20  }.  nFree = 0;. 
7410: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 75 73 61 62   for(i=0; i<usab
7420: 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  leSize; i++){.  
7430: 20 20 61 73 73 65 72 74 28 20 75 73 65 64 5b 69    assert( used[i
7440: 5d 3c 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ]<=1 );.    if( 
7450: 75 73 65 64 5b 69 5d 3d 3d 30 20 29 20 6e 46 72  used[i]==0 ) nFr
7460: 65 65 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ee++;.  }.  asse
7470: 72 74 28 20 6e 46 72 65 65 3d 3d 64 61 74 61 5b  rt( nFree==data[
7480: 68 64 72 2b 37 5d 20 29 3b 0a 20 20 73 71 6c 69  hdr+7] );.  sqli
7490: 74 65 46 72 65 65 28 75 73 65 64 29 3b 0a 7d 0a  teFree(used);.}.
74a0: 23 64 65 66 69 6e 65 20 70 61 67 65 49 6e 74 65  #define pageInte
74b0: 67 72 69 74 79 28 58 29 20 5f 70 61 67 65 49 6e  grity(X) _pageIn
74c0: 74 65 67 72 69 74 79 28 58 29 0a 23 65 6c 73 65  tegrity(X).#else
74d0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 49 6e  .# define pageIn
74e0: 74 65 67 72 69 74 79 28 58 29 0a 23 65 6e 64 69  tegrity(X).#endi
74f0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  f../*.** Defragm
7500: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
7510: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
7520: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
7530: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  ** beginning of 
7540: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
7550: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
7560: 6f 6c 6c 65 63 74 65 64 20 0a 2a 2a 20 69 6e 74  ollected .** int
7570: 6f 20 6f 6e 65 20 62 69 67 20 46 72 65 65 42 6c  o one big FreeBl
7580: 6b 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  k at the end of 
7590: 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
75a0: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
75b0: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
75c0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75e0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
75f0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
7600: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7610: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
7620: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
7630: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20  /.  int addr;   
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7650: 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
7660: 74 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c  t byte after cel
7670: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
7680: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76a0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
76b0: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
76c0: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
76e0: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
76f0: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
7700: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
7710: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
7720: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
7730: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
7740: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
7750: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
7760: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
7770: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
7780: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
7790: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
77a0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
77b0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
77c0: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
77d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
77e0: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
77f0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
7800: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
7810: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
7820: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
7830: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
7840: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
7850: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
7860: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
7870: 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67  sert( sqlite3pag
7880: 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70  er_iswriteable(p
7890: 50 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a  Page->aData) );.
78a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
78b0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
78c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
78d0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
78e0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
78f0: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
7900: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
7910: 77 3d 3d 30 20 29 3b 0a 20 20 74 65 6d 70 20 3d  w==0 );.  temp =
7920: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
7930: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  *)sqliteMalloc( 
7940: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
7950: 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 74 65  Size );.  if( te
7960: 6d 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  mp==0 ) return S
7970: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64  QLITE_NOMEM;.  d
7980: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
7990: 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
79a0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
79b0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
79c0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
79d0: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
79e0: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
79f0: 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74  ( nCell==get2byt
7a00: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20  e(&data[hdr+3]) 
7a10: 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  );.  usableSize 
7a20: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
7a30: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20  ableSize;.  brk 
7a40: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
7a50: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
7a60: 70 79 28 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26  py(&temp[brk], &
7a70: 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c  data[brk], usabl
7a80: 65 53 69 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20  eSize - brk);.  
7a90: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
7aa0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
7ab0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
7ac0: 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f  u8 *pAddr;     /
7ad0: 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  * The i-th cell 
7ae0: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  pointer */.    p
7af0: 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c  Addr = &data[cel
7b00: 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a  lOffset + i*2];.
7b10: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
7b20: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 61 73  e(pAddr);.    as
7b30: 73 65 72 74 28 20 70 63 3c 70 50 61 67 65 2d 3e  sert( pc<pPage->
7b40: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7b50: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65  );.    size = ce
7b60: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
7b70: 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20   &temp[pc]);.   
7b80: 20 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20   brk -= size;.  
7b90: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 62    memcpy(&data[b
7ba0: 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20  rk], &temp[pc], 
7bb0: 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62  size);.    put2b
7bc0: 79 74 65 28 70 41 64 64 72 2c 20 62 72 6b 29 3b  yte(pAddr, brk);
7bd0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 62  .  }.  assert( b
7be0: 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32  rk>=cellOffset+2
7bf0: 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32  *nCell );.  put2
7c00: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
7c10: 5d 2c 20 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b  ], brk);.  data[
7c20: 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+1] = 0;.  da
7c30: 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20  ta[hdr+2] = 0;. 
7c40: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
7c50: 3b 0a 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f  ;.  addr = cellO
7c60: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20  ffset+2*nCell;. 
7c70: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64   memset(&data[ad
7c80: 64 72 5d 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72  dr], 0, brk-addr
7c90: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
7ca0: 74 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  temp);.  return 
7cb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
7cc0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
7cd0: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
7ce0: 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  e on a page..**.
7cf0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
7d00: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
7d10: 61 44 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66  aData[] of the f
7d20: 69 72 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20  irst byte of.** 
7d30: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
7d40: 6f 6e 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20  on. Or return 0 
7d50: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  if there is not 
7d60: 65 6e 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73  enough free.** s
7d70: 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
7d80: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
7d90: 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65  allocation reque
7da0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
7db0: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
7dc0: 42 79 74 65 73 20 6f 66 20 66 72 65 65 20 73 70  Bytes of free sp
7dd0: 61 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  ace but does not
7de0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74   contain.** nByt
7df0: 65 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73  es of contiguous
7e00: 20 66 72 65 65 20 73 70 61 63 65 2c 20 74 68 65   free space, the
7e10: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
7e20: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20  utomatically.** 
7e30: 63 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e  calls defragemen
7e40: 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f  tPage() to conso
7e50: 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20  lidate all free 
7e60: 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a  space before .**
7e70: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
7e80: 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74  new chunk..*/.st
7e90: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
7ea0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
7eb0: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
7ec0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
7ed0: 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69  c, hdr;.  int si
7ee0: 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b  ze;.  int nFrag;
7ef0: 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e  .  int top;.  in
7f00: 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63  t nCell;.  int c
7f10: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73  ellOffset;.  uns
7f20: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
7f30: 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50  ;.  .  data = pP
7f40: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73  age->aData;.  as
7f50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67  sert( sqlite3pag
7f60: 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 64  er_iswriteable(d
7f70: 61 74 61 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ata) );.  assert
7f80: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
7f90: 20 20 69 66 28 20 6e 42 79 74 65 3c 34 20 29 20    if( nByte<4 ) 
7fa0: 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28  nByte = 4;.  if(
7fb0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42   pPage->nFree<nB
7fc0: 79 74 65 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f  yte || pPage->nO
7fd0: 76 65 72 66 6c 6f 77 3e 30 20 29 20 72 65 74 75  verflow>0 ) retu
7fe0: 72 6e 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  rn 0;.  pPage->n
7ff0: 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20  Free -= nByte;. 
8000: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
8010: 72 4f 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61  rOffset;..  nFra
8020: 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b  g = data[hdr+7];
8030: 0a 20 20 69 66 28 20 6e 46 72 61 67 3c 36 30 20  .  if( nFrag<60 
8040: 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  ){.    /* Search
8050: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f   the freelist lo
8060: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74  oking for a slot
8070: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
8080: 61 74 69 73 66 79 20 74 68 65 0a 20 20 20 20 2a  atisfy the.    *
8090: 2a 20 73 70 61 63 65 20 72 65 71 75 65 73 74 2e  * space request.
80a0: 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 68   */.    addr = h
80b0: 64 72 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28  dr+1;.    while(
80c0: 20 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28   (pc = get2byte(
80d0: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20  &data[addr]))>0 
80e0: 29 7b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20  ){.      size = 
80f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
8100: 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  c+2]);.      if(
8110: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
8120: 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65          if( size
8130: 3c 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20  <nByte+4 ){.    
8140: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
8150: 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b  ta[addr], &data[
8160: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
8170: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
8180: 20 6e 46 72 61 67 20 2b 20 73 69 7a 65 20 2d 20   nFrag + size - 
8190: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20  nByte;.         
81a0: 20 72 65 74 75 72 6e 20 70 63 3b 0a 20 20 20 20   return pc;.    
81b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
81c0: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
81d0: 61 74 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d  ata[pc+2], size-
81e0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
81f0: 20 20 72 65 74 75 72 6e 20 70 63 20 2b 20 73 69    return pc + si
8200: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
8210: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8220: 20 20 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20      addr = pc;. 
8230: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
8240: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
8250: 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62  rom the gap in b
8260: 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20  etween the cell 
8270: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20  pointer array.  
8280: 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ** and the cell 
8290: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20  content area..  
82a0: 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  */.  top = get2b
82b0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
82c0: 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74  );.  nCell = get
82d0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
82e0: 33 5d 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  3]);.  cellOffse
82f0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
8300: 66 66 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72  ffset;.  if( nFr
8310: 61 67 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66  ag>=60 || cellOf
8320: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e  fset + 2*nCell >
8330: 20 74 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a   top - nByte ){.
8340: 20 20 20 20 69 66 28 20 64 65 66 72 61 67 6d 65      if( defragme
8350: 6e 74 50 61 67 65 28 70 50 61 67 65 29 20 29 20  ntPage(pPage) ) 
8360: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f  return 0;.    to
8370: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
8380: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a  ta[hdr+5]);.  }.
8390: 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a    top -= nByte;.
83a0: 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66    assert( cellOf
83b0: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c  fset + 2*nCell <
83c0: 3d 20 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62  = top );.  put2b
83d0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
83e0: 2c 20 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e  , top);.  return
83f0: 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   top;.}../*.** R
8400: 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20  eturn a section 
8410: 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  of the pPage->aD
8420: 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ata to the freel
8430: 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  ist..** The firs
8440: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65  t byte of the ne
8450: 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  w free block is 
8460: 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61  pPage->aDisk[sta
8470: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
8480: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
8490: 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73   is "size" bytes
84a0: 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20  ..**.** Most of 
84b0: 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20  the effort here 
84c0: 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63  is involved in c
84d0: 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e  oalesing adjacen
84e0: 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73  t.** free blocks
84f0: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62   into a single b
8500: 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a  ig free block..*
8510: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
8520: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
8530: 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72  *pPage, int star
8540: 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20  t, int size){.  
8550: 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e  int addr, pbegin
8560: 2c 20 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65  , hdr;.  unsigne
8570: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
8580: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20  Page->aData;..  
8590: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
85a0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
85b0: 74 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t( sqlite3pager_
85c0: 69 73 77 72 69 74 65 61 62 6c 65 28 64 61 74 61  iswriteable(data
85d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
85e0: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
85f0: 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d  Offset+6+(pPage-
8600: 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20  >leaf?0:4) );.  
8610: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
8620: 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70   size)<=pPage->p
8630: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
8640: 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c 34 20 29  ;.  if( size<4 )
8650: 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 20 20 2f 2a   size = 4;..  /*
8660: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
8670: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
8680: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
8690: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20  blocks */.  hdr 
86a0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
86b0: 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72  et;.  addr = hdr
86c0: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
86d0: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
86e0: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c  e(&data[addr]))<
86f0: 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e  start && pbegin>
8700: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
8710: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
8720: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8730: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
8740: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a   pbegin>addr );.
8750: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
8760: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
8770: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
8780: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8790: 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  4 );.  assert( p
87a0: 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62  begin>addr || pb
87b0: 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74  egin==0 );.  put
87c0: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
87d0: 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74  ], start);.  put
87e0: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
87f0: 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70  t], pbegin);.  p
8800: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
8810: 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20  art+2], size);. 
8820: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
8830: 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61   size;..  /* Coa
8840: 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66  lesce adjacent f
8850: 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ree blocks */.  
8860: 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64  addr = pPage->hd
8870: 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77  rOffset + 1;.  w
8880: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
8890: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
88a0: 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20  ddr]))>0 ){.    
88b0: 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65  int pnext, psize
88c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
88d0: 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20  egin>addr );.   
88e0: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c   assert( pbegin<
88f0: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
8900: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
8910: 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74   pnext = get2byt
8920: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29  e(&data[pbegin])
8930: 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65  ;.    psize = ge
8940: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
8950: 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  gin+2]);.    if(
8960: 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20   pbegin + psize 
8970: 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20  + 3 >= pnext && 
8980: 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pnext>0 ){.     
8990: 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78   int frag = pnex
89a0: 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a  t - (pbegin+psiz
89b0: 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
89c0: 28 20 66 72 61 67 3c 3d 64 61 74 61 5b 70 50 61  ( frag<=data[pPa
89d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d  ge->hdrOffset+7]
89e0: 20 29 3b 0a 20 20 20 20 20 20 64 61 74 61 5b 70   );.      data[p
89f0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
8a00: 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20 20 20 20  7] -= frag;.    
8a10: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
8a20: 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74 32 62 79  [pbegin], get2by
8a30: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29  te(&data[pnext])
8a40: 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  );.      put2byt
8a50: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
8a60: 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32 62 79 74  ], pnext+get2byt
8a70: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d  e(&data[pnext+2]
8a80: 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20 20 20 7d  )-pbegin);.    }
8a90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72  else{.      addr
8aa0: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d   = pbegin;.    }
8ab0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
8ac0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
8ad0: 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20  rea begins with 
8ae0: 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d  a freeblock, rem
8af0: 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  ove it. */.  if(
8b00: 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61   data[hdr+1]==da
8b10: 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74  ta[hdr+5] && dat
8b20: 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68  a[hdr+2]==data[h
8b30: 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74  dr+6] ){.    int
8b40: 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e   top;.    pbegin
8b50: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8b60: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d  a[hdr+1]);.    m
8b70: 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b  emcpy(&data[hdr+
8b80: 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e  1], &data[pbegin
8b90: 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d  ], 2);.    top =
8ba0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8bb0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 75 74  hdr+5]);.    put
8bc0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
8bd0: 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74 32 62 79  5], top + get2by
8be0: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
8bf0: 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  2]));.  }.}../*.
8c00: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
8c10: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
8c20: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
8c30: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
8c40: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
8c50: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
8c60: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
8c70: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
8c80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8c90: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d   decodeFlags(Mem
8ca0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
8cb0: 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74   flagByte){.  Bt
8cc0: 72 65 65 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  ree *pBt;     /*
8cd0: 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
8ce0: 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
8cf0: 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
8d00: 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
8d10: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
8d20: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74   );.  pPage->int
8d30: 4b 65 79 20 3d 20 28 66 6c 61 67 42 79 74 65 20  Key = (flagByte 
8d40: 26 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  & (PTF_INTKEY|PT
8d50: 46 5f 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b  F_LEAFDATA))!=0;
8d60: 0a 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61  .  pPage->zeroDa
8d70: 74 61 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26  ta = (flagByte &
8d80: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d   PTF_ZERODATA)!=
8d90: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  0;.  pPage->leaf
8da0: 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50   = (flagByte & P
8db0: 54 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70  TF_LEAF)!=0;.  p
8dc0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
8dd0: 7a 65 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c  ze = 4*(pPage->l
8de0: 65 61 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d  eaf==0);.  pBt =
8df0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
8e00: 66 28 20 66 6c 61 67 42 79 74 65 20 26 20 50 54  f( flagByte & PT
8e10: 46 5f 4c 45 41 46 44 41 54 41 20 29 7b 0a 20 20  F_LEAFDATA ){.  
8e20: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74    pPage->leafDat
8e30: 61 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  a = 1;.    pPage
8e40: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
8e50: 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
8e60: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
8e70: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
8e80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
8e90: 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 30 3b  e->leafData = 0;
8ea0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
8eb0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
8ec0: 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  ocal;.    pPage-
8ed0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
8ee0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  >minLocal;.  }. 
8ef0: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
8f00: 3d 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44  = !(pPage->zeroD
8f10: 61 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e  ata || (!pPage->
8f20: 6c 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c  leaf && pPage->l
8f30: 65 61 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a  eafData));.}../*
8f40: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
8f50: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
8f60: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
8f70: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
8f80: 20 54 68 65 20 70 50 61 72 65 6e 74 20 70 61 72   The pParent par
8f90: 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 61  ameter must be a
8fa0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
8fb0: 4d 65 6d 50 61 67 65 20 77 68 69 63 68 0a 2a 2a  MemPage which.**
8fc0: 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f   is the parent o
8fd0: 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  f the page being
8fe0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
8ff0: 68 65 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20  he root of a.** 
9000: 42 54 72 65 65 20 68 61 73 20 6e 6f 20 70 61 72  BTree has no par
9010: 65 6e 74 20 61 6e 64 20 73 6f 20 66 6f 72 20 74  ent and so for t
9020: 68 61 74 20 70 61 67 65 2c 20 70 50 61 72 65 6e  hat page, pParen
9030: 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52  t==NULL..**.** R
9040: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
9050: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
9060: 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
9070: 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
9080: 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
9090: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
90a0: 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
90b0: 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
90c0: 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
90d0: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
90e0: 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
90f0: 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
9100: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
9110: 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
9120: 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
9130: 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
9140: 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
9150: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9160: 69 6e 74 20 69 6e 69 74 50 61 67 65 28 0a 20 20  int initPage(.  
9170: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9180: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
9190: 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c  ge to be initial
91a0: 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ized */.  MemPag
91b0: 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20  e *pParent      
91c0: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e 20   /* The parent. 
91d0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
91e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20  /.){.  int pc;  
91f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
9200: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
9210: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
9220: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  ->aData[] */.  i
9230: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
9240: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
9250: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
9260: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20   header */.  u8 
9270: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
9280: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
9290: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74  e->aData */.  Bt
92a0: 72 65 65 20 2a 70 42 74 3b 20 20 20 20 20 20 20  ree *pBt;       
92b0: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
92c0: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
92d0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
92e0: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
92f0: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
9300: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
9310: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
9320: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
9330: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
9340: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
9350: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
9360: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f  nFree;         /
9370: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
9380: 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  ed bytes on the 
9390: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  page */.  int to
93a0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
93b0: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
93c0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
93d0: 72 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20  rea */..  pBt = 
93e0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73  pPage->pBt;.  as
93f0: 73 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a  sert( pBt!=0 );.
9400: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
9410: 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  t==0 || pParent-
9420: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61  >pBt==pBt );.  a
9430: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
9440: 6e 6f 3d 3d 73 71 6c 69 74 65 33 70 61 67 65 72  no==sqlite3pager
9450: 5f 70 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  _pagenumber(pPag
9460: 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 61  e->aData) );.  a
9470: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
9480: 61 74 61 20 3d 3d 20 26 28 28 75 6e 73 69 67 6e  ata == &((unsign
9490: 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 29 5b  ed char*)pPage)[
94a0: 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20  -pBt->pageSize] 
94b0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
94c0: 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74  pParent!=pParent
94d0: 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72   && (pPage->pPar
94e0: 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d  ent!=0 || pPage-
94f0: 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20 20  >isInit) ){.    
9500: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70 61  /* The parent pa
9510: 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
9520: 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74 68  change unless th
9530: 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
9540: 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
9550: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20  SQLITE_CORRUPT; 
9560: 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50 54 20  /* bkpt-CORRUPT 
9570: 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  */.  }.  if( pPa
9580: 67 65 2d 3e 69 73 49 6e 69 74 20 29 20 72 65 74  ge->isInit ) ret
9590: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
95a0: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
95b0: 65 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 65 6e  ent==0 && pParen
95c0: 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  t!=0 ){.    pPag
95d0: 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61  e->pParent = pPa
95e0: 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
95f0: 33 70 61 67 65 72 5f 72 65 66 28 70 50 61 72 65  3pager_ref(pPare
9600: 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d 0a  nt->aData);.  }.
9610: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
9620: 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61  drOffset;.  data
9630: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
9640: 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  .  decodeFlags(p
9650: 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29  Page, data[hdr])
9660: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
9670: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67  flow = 0;.  pPag
9680: 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b  e->idxShift = 0;
9690: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
96a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
96b0: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
96c0: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
96d0: 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
96e0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
96f0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
9700: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9710: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67  pPage->nCell = g
9720: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
9730: 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61  r+3]);.  if( pPa
9740: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
9750: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  L(pBt) ){.    /*
9760: 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
9770: 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
9780: 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
9790: 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
97a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
97b0: 5f 43 4f 52 52 55 50 54 3b 20 2f 2a 20 62 6b 70  _CORRUPT; /* bkp
97c0: 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 7d  t-CORRUPT */.  }
97d0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
97e0: 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e  ell==0 && pParen
97f0: 74 21 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d  t!=0 && pParent-
9800: 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20  >pgno!=1 ){.    
9810: 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d 75 73  /* All pages mus
9820: 74 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20  t have at least 
9830: 6f 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65 70 74  one cell, except
9840: 20 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73 20   for root pages 
9850: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
9860: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 2f 2a  LITE_CORRUPT; /*
9870: 20 62 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f   bkpt-CORRUPT */
9880: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
9890: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
98a0: 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
98b0: 61 67 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65  age */.  pc = ge
98c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
98d0: 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20  +1]);.  nFree = 
98e0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
98f0: 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20  p - (cellOffset 
9900: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
9910: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3e 30  );.  while( pc>0
9920: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74   ){.    int next
9930: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  , size;.    if( 
9940: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
9950: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
9960: 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68   block is off th
9970: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  e page */.      
9980: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9990: 52 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d  RRUPT;  /* bkpt-
99a0: 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 20 20 7d  CORRUPT */.    }
99b0: 0a 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32  .    next = get2
99c0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
99d0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
99e0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
99f0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e  );.    if( next>
9a00: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
9a10: 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ze+3 ){.      /*
9a20: 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73   Free blocks mus
9a30: 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e  t be in accendin
9a40: 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
9a50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9a60: 4f 52 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74  ORRUPT;  /* bkpt
9a70: 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 20 20  -CORRUPT */.    
9a80: 7d 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73  }.    nFree += s
9a90: 69 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65  ize;.    pc = ne
9aa0: 78 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  xt;.  }.  pPage-
9ab0: 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a  >nFree = nFree;.
9ac0: 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61    if( nFree>=usa
9ad0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f  bleSize ){.    /
9ae0: 2a 20 46 72 65 65 20 73 70 61 63 65 20 63 61 6e  * Free space can
9af0: 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c  not exceed total
9b00: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
9b10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9b20: 43 4f 52 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70  CORRUPT;  /* bkp
9b30: 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 7d  t-CORRUPT */.  }
9b40: 0a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ..  pPage->isIni
9b50: 74 20 3d 20 31 3b 0a 20 20 70 61 67 65 49 6e 74  t = 1;.  pageInt
9b60: 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20  egrity(pPage);. 
9b70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9b80: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
9b90: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
9ba0: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
9bb0: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
9bc0: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
9bd0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
9be0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
9bf0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
9c00: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
9c10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9c20: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
9c30: 61 74 61 3b 0a 20 20 42 74 72 65 65 20 2a 70 42  ata;.  Btree *pB
9c40: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
9c50: 20 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67    int hdr = pPag
9c60: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
9c70: 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  int first;..  as
9c80: 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67  sert( sqlite3pag
9c90: 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 64 61  er_pagenumber(da
9ca0: 74 61 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ta)==pPage->pgno
9cb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26 64   );.  assert( &d
9cc0: 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
9cd0: 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65 64 20  e] == (unsigned 
9ce0: 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a 20  char*)pPage );. 
9cf0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9d00: 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c  pager_iswriteabl
9d10: 65 28 64 61 74 61 29 20 29 3b 0a 20 20 6d 65 6d  e(data) );.  mem
9d20: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
9d30: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
9d40: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64 61 74  ze - hdr);.  dat
9d50: 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a  a[hdr] = flags;.
9d60: 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20    first = hdr + 
9d70: 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54  8 + 4*((flags&PT
9d80: 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d  F_LEAF)==0);.  m
9d90: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
9da0: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
9db0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
9dc0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
9dd0: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
9de0: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
9df0: 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75  ->nFree = pBt->u
9e00: 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
9e10: 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  t;.  decodeFlags
9e20: 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  (pPage, flags);.
9e30: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
9e40: 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67  et = hdr;.  pPag
9e50: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
9e60: 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e  first;.  pPage->
9e70: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
9e80: 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
9e90: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e   = 0;.  pPage->n
9ea0: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
9eb0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
9ec0: 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70   pageIntegrity(p
9ed0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
9ee0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
9ef0: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
9f00: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
9f10: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
9f20: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
9f30: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
9f40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
9f50: 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 42 74  tPage(Btree *pBt
9f60: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d  , Pgno pgno, Mem
9f70: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 29 7b 0a  Page **ppPage){.
9f80: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
9f90: 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
9fa0: 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
9fb0: 67 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ge;.  rc = sqlit
9fc0: 65 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d  e3pager_get(pBt-
9fd0: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
9fe0: 76 6f 69 64 2a 2a 29 26 61 44 61 74 61 29 3b 0a  void**)&aData);.
9ff0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a000: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20  n rc;.  pPage = 
a010: 28 4d 65 6d 50 61 67 65 2a 29 26 61 44 61 74 61  (MemPage*)&aData
a020: 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b  [pBt->pageSize];
a030: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
a040: 3d 20 61 44 61 74 61 3b 0a 20 20 70 50 61 67 65  = aData;.  pPage
a050: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
a060: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
a070: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
a080: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70  ffset = pPage->p
a090: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
a0a0: 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50  ;.  *ppPage = pP
a0b0: 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
a0c0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
a0d0: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
a0e0: 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  m the pager and 
a0f0: 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20  initialize it.  
a100: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
a110: 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e  is just a conven
a120: 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72  ience wrapper ar
a130: 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61  ound separate ca
a140: 6c 6c 73 20 74 6f 0a 2a 2a 20 67 65 74 50 61 67  lls to.** getPag
a150: 65 28 29 20 61 6e 64 20 69 6e 69 74 50 61 67 65  e() and initPage
a160: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
a170: 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
a180: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 2c 20  (.  Btree *pBt, 
a190: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a1a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
a1b0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
a1c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a1d0: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
a1e0: 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
a1f0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
a200: 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
a210: 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
a220: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
a230: 65 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  ent     /* Paren
a240: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  t of the page */
a250: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
a260: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
a270: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a280: 5f 43 4f 52 52 55 50 54 3b 20 20 2f 2a 20 62 6b  _CORRUPT;  /* bk
a290: 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20  pt-CORRUPT */.  
a2a0: 7d 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67 65  }.  rc = getPage
a2b0: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
a2c0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
a2d0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
a2e0: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
a2f0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 6e 69   ){.    rc = ini
a300: 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c 20 70  tPage(*ppPage, p
a310: 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 72  Parent);.  }.  r
a320: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a330: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
a340: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
a350: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
a360: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
a370: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 67 65 74 50  .** call to getP
a380: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
a390: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
a3a0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
a3b0: 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
a3c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a3d0: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
a3e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
a3f0: 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Bt );.    assert
a400: 28 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  ( &pPage->aData[
a410: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
a420: 53 69 7a 65 5d 3d 3d 28 75 6e 73 69 67 6e 65 64  Size]==(unsigned
a430: 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a   char*)pPage );.
a440: 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
a450: 5f 75 6e 72 65 66 28 70 50 61 67 65 2d 3e 61 44  _unref(pPage->aD
a460: 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ata);.  }.}../*.
a470: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a480: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
a490: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
a4a0: 6e 74 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  nt for a page.**
a4b0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
a4c0: 57 65 20 6e 65 65 64 20 74 6f 20 75 6e 72 65 66  We need to unref
a4d0: 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69   the pParent poi
a4e0: 6e 74 65 72 20 77 68 65 6e 20 74 68 61 74 0a 2a  nter when that.*
a4f0: 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73 74  * happens..*/.st
a500: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 44 65  atic void pageDe
a510: 73 74 72 75 63 74 6f 72 28 76 6f 69 64 20 2a 70  structor(void *p
a520: 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65 53 69  Data, int pageSi
a530: 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ze){.  MemPage *
a540: 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
a550: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
a560: 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
a570: 28 4d 65 6d 50 61 67 65 2a 29 26 28 28 63 68 61  (MemPage*)&((cha
a580: 72 2a 29 70 44 61 74 61 29 5b 70 61 67 65 53 69  r*)pData)[pageSi
a590: 7a 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ze];.  if( pPage
a5a0: 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ->pParent ){.   
a5b0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
a5c0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
a5d0: 6e 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  nt;.    pPage->p
a5e0: 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  Parent = 0;.    
a5f0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 72  releasePage(pPar
a600: 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ent);.  }.  pPag
a610: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 7d  e->isInit = 0;.}
a620: 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
a630: 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
a640: 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
a650: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
a660: 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
a670: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
a680: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
a690: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
a6a0: 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
a6b0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
a6c0: 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
a6d0: 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
a6e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a6f0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
a700: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
a710: 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
a720: 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
a730: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
a740: 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
a750: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
a760: 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
a770: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
a780: 69 6e 69 74 28 76 6f 69 64 20 2a 70 44 61 74 61  init(void *pData
a790: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b  , int pageSize){
a7a0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a7b0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61  e;.  assert( (pa
a7c0: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
a7d0: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
a7e0: 50 61 67 65 2a 29 26 28 28 63 68 61 72 2a 29 70  Page*)&((char*)p
a7f0: 44 61 74 61 29 5b 70 61 67 65 53 69 7a 65 5d 3b  Data)[pageSize];
a800: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
a810: 49 6e 69 74 20 29 7b 0a 20 20 20 20 70 50 61 67  Init ){.    pPag
a820: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
a830: 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61 67     initPage(pPag
a840: 65 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  e, pPage->pParen
a850: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
a860: 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
a870: 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
a880: 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
a890: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
a8a0: 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
a8b0: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
a8c0: 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  ** a new databas
a8d0: 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20  e with a random 
a8e0: 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e  name is created.
a8f0: 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20    This randomly 
a900: 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73  named.** databas
a910: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
a920: 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69  eleted when sqli
a930: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
a940: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e  is called..*/.in
a950: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
a960: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
a970: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
a980: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
a990: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
a9a0: 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
a9b0: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
a9c0: 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
a9d0: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
a9e0: 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
a9f0: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
aa00: 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
aa10: 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
aa20: 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a   */.){.  Btree *
aa30: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
aa40: 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20   int nReserve;. 
aa50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
aa60: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a  DbHeader[100];..
aa70: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    /*.  ** The fo
aa80: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
aa90: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
aaa0: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
aab0: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
aac0: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
aad0: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
aae0: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
aaf0: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
ab00: 20 72 65 73 75 6c 74 0a 20 20 2a 2a 20 77 68 65   result.  ** whe
ab10: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
ab20: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
ab30: 74 65 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  tecture..  */.  
ab40: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
ab50: 36 34 29 3d 3d 38 20 29 3b 0a 20 20 61 73 73 65  64)==8 );.  asse
ab60: 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d  rt( sizeof(u64)=
ab70: 3d 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =8 );.  assert( 
ab80: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
ab90: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
aba0: 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
abb0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
abc0: 67 6e 6f 29 3d 3d 34 20 29 3b 0a 0a 20 20 70 42  gno)==4 );..  pB
abd0: 74 20 3d 20 28 42 74 72 65 65 20 2a 29 73 71 6c  t = (Btree *)sql
abe0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
abf0: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 69 66 28  f(*pBt) );.  if(
ac00: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   pBt==0 ){.    *
ac10: 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 20  ppBtree = 0;.   
ac20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
ac30: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  OMEM;.  }.  rc =
ac40: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
ac50: 65 6e 28 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  en(&pBt->pPager,
ac60: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 45 58 54 52   zFilename, EXTR
ac70: 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 29 3b 0a  A_SIZE, flags);.
ac80: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ac90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
aca0: 42 74 2d 3e 70 50 61 67 65 72 20 29 20 73 71 6c  Bt->pPager ) sql
acb0: 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
acc0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
acd0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42 74    sqliteFree(pBt
ace0: 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
acf0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
ad00: 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rc;.  }.  sqlite
ad10: 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72  3pager_set_destr
ad20: 75 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67 65  uctor(pBt->pPage
ad30: 72 2c 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  r, pageDestructo
ad40: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67  r);.  sqlite3pag
ad50: 65 72 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28  er_set_reiniter(
ad60: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
ad70: 65 52 65 69 6e 69 74 29 3b 0a 20 20 70 42 74 2d  eReinit);.  pBt-
ad80: 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
ad90: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
ada0: 0a 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  .  pBt->readOnly
adb0: 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
adc0: 69 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  isreadonly(pBt->
add0: 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
ade0: 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69 6c  e3pager_read_fil
adf0: 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
ae00: 67 65 72 2c 20 73 69 7a 65 6f 66 28 7a 44 62 48  ger, sizeof(zDbH
ae10: 65 61 64 65 72 29 2c 20 7a 44 62 48 65 61 64 65  eader), zDbHeade
ae20: 72 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53  r);.  pBt->pageS
ae30: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
ae40: 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a  zDbHeader[16]);.
ae50: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
ae60: 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
ae70: 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
ae80: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
ae90: 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
aea0: 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
aeb0: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
aec0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
aed0: 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
aee0: 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
aef0: 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46    pBt->maxEmbedF
af00: 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a 20 32  rac = 64;   /* 2
af10: 35 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6d  5% */.    pBt->m
af20: 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 33 32  inEmbedFrac = 32
af30: 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a  ;   /* 12.5% */.
af40: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66      pBt->minLeaf
af50: 46 72 61 63 20 3d 20 33 32 3b 20 20 20 20 2f 2a  Frac = 32;    /*
af60: 20 31 32 2e 35 25 20 2a 2f 0a 23 69 66 6e 64 65   12.5% */.#ifnde
af70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
af80: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20  TOVACUUM.    /* 
af90: 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  If the magic nam
afa0: 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c  e ":memory:" wil
afb0: 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d  l create an in-m
afc0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
afd0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 64 6f 20 6e  then.    ** do n
afe0: 6f 74 20 73 65 74 20 74 68 65 20 61 75 74 6f 2d  ot set the auto-
aff0: 76 61 63 75 75 6d 20 66 6c 61 67 2c 20 65 76 65  vacuum flag, eve
b000: 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  n if SQLITE_DEFA
b010: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  ULT_AUTOVACUUM. 
b020: 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2e 20 4f     ** is true. O
b030: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
b040: 2c 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  , if SQLITE_OMIT
b050: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
b060: 65 6e 20 64 65 66 69 6e 65 64 2c 0a 20 20 20 20  en defined,.    
b070: 2a 2a 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  ** then ":memory
b080: 3a 22 20 69 73 20 6a 75 73 74 20 61 20 72 65 67  :" is just a reg
b090: 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
b0a0: 52 65 73 70 65 63 74 20 74 68 65 20 61 75 74 6f  Respect the auto
b0b0: 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 64  -vacuum.    ** d
b0c0: 65 66 61 75 6c 74 20 69 6e 20 74 68 69 73 20 63  efault in this c
b0d0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  ase..    */.#ifn
b0e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b0f0: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28  MEMORYDB.    if(
b100: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74   zFilename && st
b110: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
b120: 3a 6d 65 6d 6f 72 79 3a 22 29 20 29 7b 0a 23 65  :memory:") ){.#e
b130: 6c 73 65 0a 20 20 20 20 69 66 28 20 7a 46 69 6c  lse.    if( zFil
b140: 65 6e 61 6d 65 20 29 7b 0a 23 65 6e 64 69 66 0a  ename ){.#endif.
b150: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
b160: 61 63 75 75 6d 20 3d 20 53 51 4c 49 54 45 5f 44  acuum = SQLITE_D
b170: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
b180: 4d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  M;.    }.#endif.
b190: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
b1a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
b1b0: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
b1c0: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 70 42 74  der[20];.    pBt
b1d0: 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d  ->maxEmbedFrac =
b1e0: 20 7a 44 62 48 65 61 64 65 72 5b 32 31 5d 3b 0a   zDbHeader[21];.
b1f0: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65      pBt->minEmbe
b200: 64 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65  dFrac = zDbHeade
b210: 72 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d 3e  r[22];.    pBt->
b220: 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20 7a 44  minLeafFrac = zD
b230: 62 48 65 61 64 65 72 5b 32 33 5d 3b 0a 20 20 20  bHeader[23];.   
b240: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
b250: 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
b260: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
b270: 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d  OVACUUM.    pBt-
b280: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
b290: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
b2a0: 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
b2b0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  0);.#endif.  }. 
b2c0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
b2d0: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
b2e0: 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 61   - nReserve;.  a
b2f0: 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
b300: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
b310: 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
b320: 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
b330: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61  e */.  sqlite3pa
b340: 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65  ger_set_pagesize
b350: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
b360: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
b370: 2a 70 70 42 74 72 65 65 20 3d 20 70 42 74 3b 0a  *ppBtree = pBt;.
b380: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b390: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
b3a0: 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
b3b0: 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
b3c0: 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
b3d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
b3e0: 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
b3f0: 70 42 74 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  pBt){.  while( p
b400: 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Bt->pCursor ){. 
b410: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
b420: 6c 6f 73 65 43 75 72 73 6f 72 28 70 42 74 2d 3e  loseCursor(pBt->
b430: 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  pCursor);.  }.  
b440: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f  sqlite3pager_clo
b450: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
b460: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42  .  sqliteFree(pB
b470: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
b480: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b490: 20 43 68 61 6e 67 65 20 74 68 65 20 62 75 73 79   Change the busy
b4a0: 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63   handler callbac
b4b0: 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  k function..*/.i
b4c0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
b4d0: 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 42 74  etBusyHandler(Bt
b4e0: 72 65 65 20 2a 70 42 74 2c 20 42 75 73 79 48 61  ree *pBt, BusyHa
b4f0: 6e 64 6c 65 72 20 2a 70 48 61 6e 64 6c 65 72 29  ndler *pHandler)
b500: 7b 0a 20 20 70 42 74 2d 3e 70 42 75 73 79 48 61  {.  pBt->pBusyHa
b510: 6e 64 6c 65 72 20 3d 20 70 48 61 6e 64 6c 65 72  ndler = pHandler
b520: 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
b530: 5f 73 65 74 5f 62 75 73 79 68 61 6e 64 6c 65 72  _set_busyhandler
b540: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 48  (pBt->pPager, pH
b550: 61 6e 64 6c 65 72 29 3b 0a 20 20 72 65 74 75 72  andler);.  retur
b560: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b570: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
b580: 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
b590: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c  mber of pages al
b5a0: 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63  lowed in the cac
b5b0: 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  he..**.** The ma
b5c0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
b5d0: 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73  cache pages is s
b5e0: 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75  et to the absolu
b5f0: 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d  te.** value of m
b600: 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67  xPage.  If mxPag
b610: 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
b620: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a  he pager will.**
b630: 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72   operate asynchr
b640: 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c  onously - it wil
b650: 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f  l not stop to do
b660: 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20   fsync()s.** to 
b670: 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77  insure data is w
b680: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69  ritten to the di
b690: 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72  sk surface befor
b6a0: 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  e.** continuing.
b6b0: 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73    Transactions s
b6c0: 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e  till work if syn
b6d0: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
b6e0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
b6f0: 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  base cannot be c
b700: 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73  orrupted if this
b710: 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73   program.** cras
b720: 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65  hes.  But if the
b730: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
b740: 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65  m crashes or the
b750: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75  re is.** an abru
b760: 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  pt power failure
b770: 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75   when synchronou
b780: 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61  s is off, the da
b790: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20  tabase.** could 
b7a0: 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
b7b0: 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75  consistent and u
b7c0: 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61  nrecoverable sta
b7d0: 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f  te..** Synchrono
b7e0: 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  us is on by defa
b7f0: 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20  ult so database 
b800: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f  corruption is no
b810: 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20  t.** normally a 
b820: 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  worry..*/.int sq
b830: 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
b840: 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 42  heSize(Btree *pB
b850: 74 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  t, int mxPage){.
b860: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73    sqlite3pager_s
b870: 65 74 5f 63 61 63 68 65 73 69 7a 65 28 70 42 74  et_cachesize(pBt
b880: 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
b890: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
b8a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b8b0: 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
b8c0: 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
b8d0: 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
b8e0: 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
b8f0: 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
b900: 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
b910: 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
b920: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
b930: 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
b940: 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
b950: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
b960: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
b970: 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
b980: 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
b990: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
b9a0: 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
b9b0: 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
b9c0: 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
b9d0: 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
b9e0: 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
b9f0: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
ba00: 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
ba10: 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
ba20: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
ba30: 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
ba40: 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
ba50: 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
ba60: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
ba70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
ba80: 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
ba90: 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66  lite3BtreeSetSaf
baa0: 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a  etyLevel(Btree *
bab0: 70 42 74 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b  pBt, int level){
bac0: 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
bad0: 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c  set_safety_level
bae0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
baf0: 76 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  vel);.  return S
bb00: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
bb10: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
bb20: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
bb30: 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
bb40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
bb50: 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
bb60: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
bb70: 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
bb80: 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
bb90: 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
bba0: 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   per page..**.**
bbb0: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
bbc0: 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
bbd0: 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
bbe0: 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
bbf0: 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
bc00: 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
bc10: 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
bc20: 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
bc30: 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
bc40: 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
bc50: 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
bc60: 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
bc70: 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
bc80: 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
bc90: 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
bca0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
bcb0: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
bcc0: 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
bcd0: 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
bce0: 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
bcf0: 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
bd00: 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
bd10: 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
bd20: 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
bd30: 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
bd40: 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
bd50: 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
bd60: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
bd70: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
bd80: 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
bd90: 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
bda0: 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ft unchanged..*/
bdb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
bdc0: 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eSetPageSize(Btr
bdd0: 65 65 20 2a 70 42 74 2c 20 69 6e 74 20 70 61 67  ee *pBt, int pag
bde0: 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
bdf0: 72 76 65 29 7b 0a 20 20 69 66 28 20 70 42 74 2d  rve){.  if( pBt-
be00: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29  >pageSizeFixed )
be10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
be20: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
be30: 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  }.  if( nReserve
be40: 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72  <0 ){.    nReser
be50: 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ve = pBt->pageSi
be60: 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
be70: 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Size;.  }.  if( 
be80: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
be90: 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
bea0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
beb0: 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67  &&.        ((pag
bec0: 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
bed0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e)==0 ){.    ass
bee0: 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
bef0: 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42   7)==0 );.    pB
bf00: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 73 71  t->pageSize = sq
bf10: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70  lite3pager_set_p
bf20: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
bf30: 67 65 72 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  ger, pageSize);.
bf40: 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c    }.  pBt->usabl
bf50: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
bf60: 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
bf70: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
bf80: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
bf90: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
bfa0: 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
bfb0: 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
bfc0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
bfd0: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 42 74 29  Size(Btree *pBt)
bfe0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
bff0: 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20  pageSize;.}.int 
c000: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
c010: 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 42  eserve(Btree *pB
c020: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  t){.  return pBt
c030: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
c040: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a  ->usableSize;.}.
c050: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
c060: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
c070: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
c080: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c090: 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
c0a0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
c0b0: 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
c0c0: 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
c0d0: 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
c0e0: 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
c0f0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
c100: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
c110: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
c120: 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
c130: 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
c140: 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
c150: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
c160: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
c170: 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
c180: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
c190: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
c1a0: 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
c1b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
c1c0: 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
c1d0: 28 42 74 72 65 65 20 2a 70 42 74 2c 20 69 6e 74  (Btree *pBt, int
c1e0: 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
c1f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
c200: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
c210: 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
c220: 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 69 66  ONLY;.#else.  if
c230: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
c240: 69 78 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  ixed ){.    retu
c250: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
c260: 4c 59 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 61  LY;.  }.  pBt->a
c270: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 61 75 74  utoVacuum = (aut
c280: 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 20 20  oVacuum?1:0);.  
c290: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c2a0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
c2b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
c2c0: 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
c2d0: 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
c2e0: 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
c2f0: 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
c300: 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
c310: 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
c320: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
c330: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
c340: 65 65 20 2a 70 42 74 29 7b 0a 23 69 66 64 65 66  ee *pBt){.#ifdef
c350: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
c360: 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
c370: 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75   0;.#else.  retu
c380: 72 6e 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rn pBt->autoVacu
c390: 75 6d 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  um;.#endif.}.../
c3a0: 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
c3b0: 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
c3c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
c3d0: 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
c3e0: 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
c3f0: 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
c400: 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
c410: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
c420: 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
c430: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
c440: 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
c450: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
c460: 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
c470: 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
c480: 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
c490: 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
c4a0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
c4b0: 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
c4c0: 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
c4d0: 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
c4e0: 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
c4f0: 2e 20 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  .  SQLITE_PROTOC
c500: 4f 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OL is returned.*
c510: 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  * if there is a 
c520: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
c530: 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   violation..*/.s
c540: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
c550: 72 65 65 28 42 74 72 65 65 20 2a 70 42 74 29 7b  ree(Btree *pBt){
c560: 0a 20 20 69 6e 74 20 72 63 2c 20 70 61 67 65 53  .  int rc, pageS
c570: 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ize;.  MemPage *
c580: 70 50 61 67 65 31 3b 0a 20 20 69 66 28 20 70 42  pPage1;.  if( pB
c590: 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74 75  t->pPage1 ) retu
c5a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c5b0: 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
c5c0: 2c 20 31 2c 20 26 70 50 61 67 65 31 29 3b 0a 20  , 1, &pPage1);. 
c5d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c5e0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
c5f0: 20 20 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65    ..  /* Do some
c600: 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
c610: 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
c620: 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
c630: 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
c640: 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
c650: 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 53  . .  */.  rc = S
c660: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
c670: 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65 72  if( sqlite3pager
c680: 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  _pagecount(pBt->
c690: 70 50 61 67 65 72 29 3e 30 20 29 7b 0a 20 20 20  pPager)>0 ){.   
c6a0: 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
c6b0: 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
c6c0: 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
c6d0: 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
c6e0: 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
c6f0: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
c700: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
c710: 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
c720: 31 20 7c 7c 20 70 61 67 65 31 5b 31 39 5d 3e 31  1 || page1[19]>1
c730: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
c740: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
c750: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
c760: 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
c770: 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20  &page1[16]);.   
c780: 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
c790: 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20  1)&pageSize)!=0 
c7a0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
c7b0: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
c7c0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
c7d0: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
c7e0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
c7f0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
c800: 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
c810: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65  sableSize = page
c820: 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d  Size - page1[20]
c830: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 75  ;.    if( pBt->u
c840: 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b  sableSize<500 ){
c850: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
c860: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
c870: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6d 61     }.    pBt->ma
c880: 78 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67  xEmbedFrac = pag
c890: 65 31 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d  e1[21];.    pBt-
c8a0: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20  >minEmbedFrac = 
c8b0: 70 61 67 65 31 5b 32 32 5d 3b 0a 20 20 20 20 70  page1[22];.    p
c8c0: 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20  Bt->minLeafFrac 
c8d0: 3d 20 70 61 67 65 31 5b 32 33 5d 3b 0a 23 69 66  = page1[23];.#if
c8e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c8f0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
c900: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
c910: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
c920: 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
c930: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
c940: 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
c950: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
c960: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
c970: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
c980: 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
c990: 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
c9a0: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
c9b0: 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
c9c0: 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
c9d0: 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
c9e0: 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
c9f0: 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
ca00: 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
ca10: 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
ca20: 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
ca30: 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
ca40: 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
ca50: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
ca60: 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
ca70: 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
ca80: 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
ca90: 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
caa0: 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
cab0: 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
cac0: 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
cad0: 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
cae0: 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
caf0: 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
cb00: 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61  te poiner, a hea
cb10: 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20  der which is as 
cb20: 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20  much as.  ** 17 
cb30: 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f  bytes long, 0 to
cb40: 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c   N bytes of payl
cb50: 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69  oad, and an opti
cb60: 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72  onal 4 byte over
cb70: 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70  flow.  ** page p
cb80: 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ointer..  */.  p
cb90: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28  Bt->maxLocal = (
cba0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
cbb0: 31 32 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65  12)*pBt->maxEmbe
cbc0: 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  dFrac/255 - 23;.
cbd0: 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
cbe0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
cbf0: 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45  ze-12)*pBt->minE
cc00: 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32  mbedFrac/255 - 2
cc10: 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61  3;.  pBt->maxLea
cc20: 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  f = pBt->usableS
cc30: 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d  ize - 35;.  pBt-
cc40: 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d  >minLeaf = (pBt-
cc50: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
cc60: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
cc70: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 69 66 28  /255 - 23;.  if(
cc80: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70   pBt->minLocal>p
cc90: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20  Bt->maxLocal || 
cca0: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20  pBt->maxLocal<0 
ccb0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  ){.    goto page
ccc0: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
ccd0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
cce0: 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
ccf0: 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
cd00: 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
cd10: 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
cd20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cd30: 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
cd40: 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
cd50: 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
cd60: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
cd70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
cd80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
cd90: 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c  ine works like l
cda0: 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65 70  ockBtree() excep
cdb0: 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69  t that it also i
cdc0: 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75  nvokes the.** bu
cdd0: 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
cde0: 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e  here is lock con
cdf0: 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  tention..*/.stat
ce00: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
ce10: 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65 20  WithRetry(Btree 
ce20: 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
ce30: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
ce40: 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 3d  f( pBt->inTrans=
ce50: 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
ce60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
ce70: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
ce80: 42 74 2c 20 30 29 3b 0a 20 20 20 20 70 42 74 2d  Bt, 0);.    pBt-
ce90: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
cea0: 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _NONE;.  }.  ret
ceb0: 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20  urn rc;.}.      
cec0: 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72   ../*.** If ther
ced0: 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
cee0: 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
cef0: 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
cf00: 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
cf10: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
cf20: 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
cf30: 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
cf40: 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
cf50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
cf60: 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
cf70: 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
cf80: 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
cf90: 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
cfa0: 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
cfb0: 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
cfc0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
cfd0: 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  any outstanding 
cfe0: 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f  cursors, this ro
cff0: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
d000: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
d010: 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
d020: 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74  n in progress, t
d030: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
d040: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
d050: 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72  c void unlockBtr
d060: 65 65 49 66 55 6e 75 73 65 64 28 42 74 72 65 65  eeIfUnused(Btree
d070: 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42   *pBt){.  if( pB
d080: 74 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  t->inTrans==TRAN
d090: 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
d0a0: 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74  Cursor==0 && pBt
d0b0: 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
d0c0: 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67     if( pBt->pPag
d0d0: 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a  e1->aData==0 ){.
d0e0: 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
d0f0: 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67  Page = pBt->pPag
d100: 65 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  e1;.      pPage-
d110: 3e 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 26  >aData = (u8 *)&
d120: 28 28 63 68 61 72 2a 29 70 50 61 67 65 29 5b 2d  ((char*)pPage)[-
d130: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
d140: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74        pPage->pBt
d150: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 70 50   = pBt;.      pP
d160: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20  age->pgno = 1;. 
d170: 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
d180: 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
d190: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
d1a0: 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  e1 = 0;.    pBt-
d1b0: 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  >inStmt = 0;.  }
d1c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
d1d0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
d1e0: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
d1f0: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
d200: 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a  f the.** file..*
d210: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
d220: 44 61 74 61 62 61 73 65 28 42 74 72 65 65 20 2a  Database(Btree *
d230: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
d240: 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *pP1;.  unsigned
d250: 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69   char *data;.  i
d260: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 73 71 6c  nt rc;.  if( sql
d270: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
d280: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
d290: 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >0 ) return SQLI
d2a0: 54 45 5f 4f 4b 3b 0a 20 20 70 50 31 20 3d 20 70  TE_OK;.  pP1 = p
d2b0: 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
d2c0: 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
d2d0: 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
d2e0: 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
d2f0: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 64  te3pager_write(d
d300: 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ata);.  if( rc )
d310: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
d320: 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69  mcpy(data, zMagi
d330: 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  cHeader, sizeof(
d340: 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a  zMagicHeader));.
d350: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
d360: 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d  (zMagicHeader)==
d370: 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  16 );.  put2byte
d380: 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d  (&data[16], pBt-
d390: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
d3a0: 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
d3b0: 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[19] = 1;.  da
d3c0: 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61  ta[20] = pBt->pa
d3d0: 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
d3e0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61  ableSize;.  data
d3f0: 5b 32 31 5d 20 3d 20 70 42 74 2d 3e 6d 61 78 45  [21] = pBt->maxE
d400: 6d 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61  mbedFrac;.  data
d410: 5b 32 32 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 45  [22] = pBt->minE
d420: 6d 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61  mbedFrac;.  data
d430: 5b 32 33 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  [23] = pBt->minL
d440: 65 61 66 46 72 61 63 3b 0a 20 20 6d 65 6d 73 65  eafFrac;.  memse
d450: 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
d460: 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
d470: 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
d480: 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
d490: 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
d4a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
d4b0: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
d4c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
d4d0: 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
d4e0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
d4f0: 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
d500: 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 31 29 3b  a[36 + 4*4], 1);
d510: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
d520: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d530: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
d540: 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
d550: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
d560: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
d570: 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
d580: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
d590: 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
d5a0: 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
d5b0: 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
d5c0: 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
d5d0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
d5e0: 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
d5f0: 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
d600: 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
d610: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
d620: 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
d630: 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
d640: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
d650: 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
d660: 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
d670: 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
d680: 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
d690: 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
d6a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
d6b0: 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
d6c0: 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
d6d0: 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
d6e0: 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
d6f0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
d700: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
d710: 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
d720: 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
d730: 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
d740: 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
d750: 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
d760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
d770: 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
d780: 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
d790: 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
d7a0: 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
d7b0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
d7c0: 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
d7d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
d7e0: 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
d7f0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
d800: 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
d810: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
d820: 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
d830: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
d840: 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
d850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
d860: 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
d870: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
d880: 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
d890: 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
d8a0: 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
d8b0: 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
d8c0: 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
d8d0: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
d8e0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
d8f0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
d900: 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
d910: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
d920: 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
d930: 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
d940: 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
d950: 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
d960: 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
d970: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
d980: 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
d990: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
d9a0: 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
d9b0: 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
d9c0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
d9d0: 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
d9e0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
d9f0: 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
da00: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
da10: 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
da20: 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
da30: 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
da40: 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
da50: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
da60: 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
da70: 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
da80: 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
da90: 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
daa0: 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
dab0: 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
dac0: 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
dad0: 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
dae0: 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
daf0: 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
db00: 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
db10: 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
db20: 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
db30: 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
db40: 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
db50: 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
db60: 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
db70: 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
db80: 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
db90: 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
dba0: 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
dbb0: 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
dbc0: 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
dbd0: 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
dbe0: 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 42 74  Trans(Btree *pBt
dbf0: 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
dc00: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
dc10: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 75 73 79 20  _OK;.  int busy 
dc20: 3d 20 30 3b 0a 20 20 42 75 73 79 48 61 6e 64 6c  = 0;.  BusyHandl
dc30: 65 72 20 2a 70 48 3b 0a 0a 20 20 2f 2a 20 49 66  er *pH;..  /* If
dc40: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
dc50: 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
dc60: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
dc70: 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
dc80: 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
dc90: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
dca0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
dcb0: 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
dcc0: 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
dcd0: 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
dce0: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  pBt->inTrans==TR
dcf0: 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 42  ANS_WRITE || (pB
dd00: 74 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  t->inTrans==TRAN
dd10: 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
dd20: 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
dd30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
dd40: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
dd50: 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
dd60: 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
dd70: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
dd80: 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e  e */.  if( pBt->
dd90: 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c  readOnly && wrfl
dda0: 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
ddb0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
ddc0: 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20  ;.  }..  do {.  
ddd0: 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
dde0: 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  1==0 ){.      rc
ddf0: 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
de00: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
de10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
de20: 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
de30: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
de40: 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 42 74  3pager_begin(pBt
de50: 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  ->pPage1->aData,
de60: 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20   wrflag>1);.    
de70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
de80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
de90: 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
dea0: 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pBt);.      }.  
deb0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
dec0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ded0: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
dee0: 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
def0: 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
df00: 45 41 44 29 3b 0a 20 20 20 20 20 20 69 66 28 20  EAD);.      if( 
df10: 77 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e  wrflag ) pBt->in
df20: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Stmt = 0;.    }e
df30: 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  lse{.      unloc
df40: 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
df50: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
df60: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
df70: 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
df80: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
df90: 20 26 26 0a 20 20 20 20 20 20 28 70 48 20 3d 20   &&.      (pH = 
dfa0: 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  pBt->pBusyHandle
dfb0: 72 29 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20  r)!=0 && .      
dfc0: 70 48 2d 3e 78 46 75 6e 63 20 26 26 20 70 48 2d  pH->xFunc && pH-
dfd0: 3e 78 46 75 6e 63 28 70 48 2d 3e 70 41 72 67 2c  >xFunc(pH->pArg,
dfe0: 20 62 75 73 79 2b 2b 29 0a 20 20 29 3b 0a 20 20   busy++).  );.  
dff0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
e000: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e010: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
e020: 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
e030: 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
e040: 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
e050: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
e060: 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
e070: 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
e080: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
e090: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
e0a0: 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
e0b0: 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
e0c0: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
e0d0: 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
e0e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
e0f0: 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
e100: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
e110: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
e140: 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
e150: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e170: 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
e180: 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
e190: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
e1a0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
e1b0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
e1c0: 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 72 65 65   code */.  Btree
e1d0: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
e1e0: 42 74 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74  Bt;.  int isInit
e1f0: 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
e200: 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
e210: 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
e220: 0a 0a 20 20 69 6e 69 74 50 61 67 65 28 70 50 61  ..  initPage(pPa
e230: 67 65 2c 20 30 29 3b 0a 20 20 6e 43 65 6c 6c 20  ge, 0);.  nCell 
e240: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
e250: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
e260: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
e270: 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
e280: 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
e290: 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
e2a0: 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
e2b0: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
e2c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e2d0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74  {.      goto set
e2e0: 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
e2f0: 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ut;.    }..    i
e300: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
e310: 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
e320: 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
e330: 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
e340: 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
e350: 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
e360: 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
e370: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
e380: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
e390: 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
e3a0: 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d  rmaps_out;.    }
e3b0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
e3c0: 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
e3d0: 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
e3e0: 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
e3f0: 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
e400: 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
e410: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
e420: 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
e430: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
e440: 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  gno);.  }..set_c
e450: 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
e460: 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
e470: 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
e480: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e490: 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
e4a0: 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68 20  on pPage, which 
e4b0: 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f  is guarenteed to
e4c0: 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
e4d0: 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f  , not an overflo
e4e0: 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61 20  w.** page, is a 
e4f0: 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
e500: 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68  iFrom. Modify th
e510: 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68  is pointer so th
e520: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
e530: 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65  ** iTo. Paramete
e540: 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65  r eType describe
e550: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f  s the type of po
e560: 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64 69  inter to be modi
e570: 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c  fied, as .** fol
e580: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  lows:.**.** PTRM
e590: 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50  AP_BTREE:     pP
e5a0: 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
e5b0: 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
e5c0: 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69   points at a chi
e5d0: 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ld .**          
e5e0: 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66           page of
e5f0: 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
e600: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20  RMAP_OVERFLOW1: 
e610: 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
e620: 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
e630: 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  er points at an 
e640: 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20  overflow.**     
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
e660: 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ge pointed to by
e670: 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c   one of the cell
e680: 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  s on pPage..**.*
e690: 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
e6a0: 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20  W2: pPage is an 
e6b0: 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54  overflow-page. T
e6c0: 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
e6d0: 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a  s at the next.**
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
e700: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
e710: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69  .static int modi
e720: 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65  fyPagePointer(Me
e730: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67  mPage *pPage, Pg
e740: 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69  no iFrom, Pgno i
e750: 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20  To, u8 eType){. 
e760: 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
e770: 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
e780: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
e790: 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
e7a0: 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
e7b0: 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
e7c0: 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
e7d0: 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
e7e0: 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
e7f0: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
e800: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e810: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  T;.    }.    put
e820: 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
e830: 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
e840: 65 7b 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 69  e{.    int isIni
e850: 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
e860: 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69  sInit;.    int i
e870: 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
e880: 0a 0a 20 20 20 20 69 6e 69 74 50 61 67 65 28 70  ..    initPage(p
e890: 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43  Page, 0);.    nC
e8a0: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
e8b0: 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
e8c0: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
e8d0: 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
e8e0: 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
e8f0: 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
e900: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
e910: 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
e920: 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
e930: 6f 3b 0a 20 20 20 20 20 20 20 20 70 61 72 73 65  o;.        parse
e940: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
e950: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
e960: 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
e970: 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
e980: 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
e990: 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
e9a0: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
e9b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
e9c0: 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
e9d0: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
e9e0: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
e9f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ea00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
ea10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ea20: 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
ea30: 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
ea40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
ea50: 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
ea60: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
ea70: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
ea80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
ea90: 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
eaa0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
eab0: 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
eac0: 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
ead0: 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
eae0: 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
eaf0: 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
eb00: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
eb10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
eb20: 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UPT;.      }.   
eb30: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
eb40: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
eb50: 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
eb60: 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
eb70: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
eb80: 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
eb90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
eba0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
ebb0: 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
ebc0: 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
ebd0: 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
ebe0: 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
ebf0: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
ec00: 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
ec10: 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
ec20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ec30: 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
ec40: 42 74 72 65 65 20 2a 70 42 74 2c 20 20 20 20 20  Btree *pBt,     
ec50: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
ec60: 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
ec70: 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
ec80: 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
ec90: 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
eca0: 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
ecb0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
ecc0: 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
ecd0: 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
ece0: 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
ecf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
ed00: 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
ed10: 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
ed20: 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
ed30: 72 65 65 50 61 67 65 20 20 20 20 20 20 20 20 20  reePage         
ed40: 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
ed50: 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
ed60: 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  e to */.){.  Mem
ed70: 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
ed80: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
ed90: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
eda0: 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
edb0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
edc0: 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
edd0: 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
ede0: 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
edf0: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
ee00: 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
ee10: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
ee20: 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
ee30: 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
ee40: 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
ee50: 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
ee60: 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
ee70: 47 45 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  GE );..  /* Move
ee80: 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
ee90: 6f 6d 20 69 74 27 73 20 63 75 72 72 65 6e 74 20  om it's current 
eea0: 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
eeb0: 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
eec0: 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
eed0: 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
eee0: 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
eef0: 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
ef00: 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
ef10: 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
ef20: 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
ef30: 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
ef40: 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
ef50: 5f 6d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  _movepage(pPager
ef60: 2c 20 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  , pDbPage->aData
ef70: 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
ef80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ef90: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
efa0: 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
efb0: 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
efc0: 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
efd0: 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
efe0: 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
eff0: 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
f000: 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
f010: 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
f020: 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
f030: 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
f040: 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
f050: 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
f060: 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
f070: 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
f080: 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
f090: 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
f0a0: 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
f0b0: 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
f0c0: 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
f0d0: 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
f0e0: 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
f0f0: 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
f100: 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
f110: 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
f120: 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
f130: 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
f140: 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
f150: 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
f160: 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
f170: 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
f180: 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
f190: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
f1a0: 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
f1b0: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
f1c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f1d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f1e0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
f1f0: 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
f200: 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
f210: 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
f220: 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
f230: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
f240: 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
f250: 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
f260: 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
f270: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
f280: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f290: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
f2a0: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
f2b0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
f2c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
f2d0: 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
f2e0: 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
f2f0: 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
f300: 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
f310: 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
f320: 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
f330: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
f340: 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
f350: 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
f360: 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
f370: 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
f380: 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
f390: 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
f3a0: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
f3b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f3c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f3d0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
f3e0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
f3f0: 74 65 28 70 50 74 72 50 61 67 65 2d 3e 61 44 61  te(pPtrPage->aDa
f400: 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ta);.    if( rc!
f410: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f420: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
f430: 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
f440: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f450: 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
f460: 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
f470: 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
f480: 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
f490: 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
f4a0: 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
f4b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f4c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
f4d0: 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
f4e0: 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
f4f0: 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a 20 20  e, iPtrPage);.  
f500: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
f510: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
f520: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
f530: 65 71 75 69 72 65 64 20 62 79 20 61 75 74 6f 56  equired by autoV
f540: 61 63 75 75 6d 43 6f 6d 6d 69 74 28 29 2e 20 2a  acuumCommit(). *
f550: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
f560: 6f 63 61 74 65 50 61 67 65 28 42 74 72 65 65 20  ocatePage(Btree 
f570: 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
f580: 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
f590: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ;../*.** This ro
f5a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
f5b0: 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
f5c0: 70 61 67 65 72 5f 63 6f 6d 6d 69 74 20 77 68 65  pager_commit whe
f5d0: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
f5e0: 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66  ** is commited f
f5f0: 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
f600: 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  m database..*/.s
f610: 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
f620: 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 72 65 65  cuumCommit(Btree
f630: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 6e 54 72   *pBt, Pgno *nTr
f640: 75 6e 63 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  unc){.  Pager *p
f650: 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
f660: 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 46 72 65  ger;.  Pgno nFre
f670: 65 4c 69 73 74 3b 20 20 20 2f 2a 20 4e 75 6d 62  eList;   /* Numb
f680: 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 6d 61  er of pages rema
f690: 69 6e 69 6e 67 20 6f 6e 20 74 68 65 20 66 72 65  ining on the fre
f6a0: 65 2d 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 6e 74  e-list. */.  int
f6b0: 20 6e 50 74 72 4d 61 70 3b 20 20 20 20 20 20 2f   nPtrMap;      /
f6c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  * Number of poin
f6d0: 74 65 72 2d 6d 61 70 20 70 61 67 65 73 20 64 65  ter-map pages de
f6e0: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 50  allocated */.  P
f6f0: 67 6e 6f 20 6f 72 69 67 53 69 7a 65 3b 20 20 2f  gno origSize;  /
f700: 2a 20 50 61 67 65 73 20 69 6e 20 74 68 65 20 64  * Pages in the d
f710: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
f720: 20 20 50 67 6e 6f 20 66 69 6e 53 69 7a 65 3b 20    Pgno finSize; 
f730: 20 20 2f 2a 20 50 61 67 65 73 20 69 6e 20 74 68    /* Pages in th
f740: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
f750: 61 66 74 65 72 20 74 72 75 6e 63 61 74 69 6f 6e  after truncation
f760: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
f770: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
f780: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 65  n code */.  u8 e
f790: 54 79 70 65 3b 0a 20 20 69 6e 74 20 70 67 73 7a  Type;.  int pgsz
f7a0: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
f7b0: 3b 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20  ;  /* Page size 
f7c0: 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
f7d0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
f7e0: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
f7f0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
f800: 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  e page to move *
f810: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
f820: 4d 65 6d 50 61 67 65 20 3d 20 30 3b 20 20 20 2f  MemPage = 0;   /
f830: 2a 20 22 22 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  * "" */.  Pgno i
f840: 50 74 72 50 61 67 65 3b 20 20 20 20 20 20 20 20  PtrPage;        
f850: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
f860: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
f870: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 44 62 50   pointer to iDbP
f880: 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
f890: 72 65 65 50 61 67 65 3b 20 20 20 20 20 20 20 20  reePage;        
f8a0: 20 20 20 20 2f 2a 20 54 68 65 20 66 72 65 65 2d      /* The free-
f8b0: 6c 69 73 74 20 70 61 67 65 20 74 6f 20 6d 6f 76  list page to mov
f8c0: 65 20 69 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e iDbPage to */.
f8d0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
f8e0: 4d 65 6d 50 61 67 65 20 3d 20 30 3b 20 2f 2a 20  MemPage = 0; /* 
f8f0: 22 22 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e  "" */..#ifndef N
f900: 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66  DEBUG.  int nRef
f910: 20 3d 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72   = *sqlite3pager
f920: 5f 73 74 61 74 73 28 70 50 61 67 65 72 29 3b 0a  _stats(pPager);.
f930: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
f940: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
f950: 6d 20 29 3b 0a 20 20 69 66 28 20 50 54 52 4d 41  m );.  if( PTRMA
f960: 50 5f 49 53 50 41 47 45 28 70 67 73 7a 2c 20 73  P_ISPAGE(pgsz, s
f970: 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
f980: 63 6f 75 6e 74 28 70 50 61 67 65 72 29 29 20 29  count(pPager)) )
f990: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
f9a0: 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ITE_CORRUPT;.  }
f9b0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
f9c0: 74 20 68 6f 77 20 6d 61 6e 79 20 66 72 65 65 2d  t how many free-
f9d0: 70 61 67 65 73 20 61 72 65 20 69 6e 20 74 68 65  pages are in the
f9e0: 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
f9f0: 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
fa00: 66 72 65 65 20 70 61 67 65 73 2c 20 74 68 65 6e  free pages, then
fa10: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
fa20: 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
fa30: 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
fa40: 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
fa50: 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
fa60: 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
fa70: 30 20 29 7b 0a 20 20 20 20 2a 6e 54 72 75 6e 63  0 ){.    *nTrunc
fa80: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
fa90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
faa0: 0a 20 20 6f 72 69 67 53 69 7a 65 20 3d 20 73 71  .  origSize = sq
fab0: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
fac0: 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
fad0: 6e 50 74 72 4d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrMap = (nFree
fae0: 4c 69 73 74 2d 6f 72 69 67 53 69 7a 65 2b 50 54  List-origSize+PT
faf0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 67 73 7a  RMAP_PAGENO(pgsz
fb00: 2c 20 6f 72 69 67 53 69 7a 65 29 2b 70 67 73 7a  , origSize)+pgsz
fb10: 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20  /5)/(pgsz/5);.  
fb20: 66 69 6e 53 69 7a 65 20 3d 20 6f 72 69 67 53 69  finSize = origSi
fb30: 7a 65 20 2d 20 6e 46 72 65 65 4c 69 73 74 20 2d  ze - nFreeList -
fb40: 20 6e 50 74 72 4d 61 70 3b 0a 20 20 69 66 28 20   nPtrMap;.  if( 
fb50: 6f 72 69 67 53 69 7a 65 3e 50 45 4e 44 49 4e 47  origSize>PENDING
fb60: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
fb70: 26 26 20 66 69 6e 53 69 7a 65 3c 3d 50 45 4e 44  && finSize<=PEND
fb80: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
fb90: 74 29 20 29 7b 0a 20 20 20 20 66 69 6e 53 69 7a  t) ){.    finSiz
fba0: 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 50 54 52  e--;.    if( PTR
fbb0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2d 3e  MAP_ISPAGE(pBt->
fbc0: 75 73 61 62 6c 65 53 69 7a 65 2c 20 66 69 6e 53  usableSize, finS
fbd0: 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 66 69  ize) ){.      fi
fbe0: 6e 53 69 7a 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nSize--;.    }. 
fbf0: 20 7d 0a 20 20 54 52 41 43 45 28 28 22 41 55 54   }.  TRACE(("AUT
fc00: 4f 56 41 43 55 55 4d 3a 20 42 65 67 69 6e 20 28  OVACUUM: Begin (
fc10: 64 62 20 73 69 7a 65 20 25 64 2d 3e 25 64 29 5c  db size %d->%d)\
fc20: 6e 22 2c 20 6f 72 69 67 53 69 7a 65 2c 20 66 69  n", origSize, fi
fc30: 6e 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 56  nSize));..  /* V
fc40: 61 72 69 61 62 6c 65 20 27 66 69 6e 53 69 7a 65  ariable 'finSize
fc50: 27 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69  ' will be the si
fc60: 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
fc70: 6e 20 70 61 67 65 73 20 61 66 74 65 72 0a 20 20  n pages after.  
fc80: 2a 2a 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  ** the auto-vacu
fc90: 75 6d 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64  um has completed
fca0: 20 28 74 68 65 20 63 75 72 72 65 6e 74 20 66 69   (the current fi
fcb0: 6c 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68  le size minus th
fcc0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
fcd0: 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
fce0: 65 65 20 6c 69 73 74 29 2e 20 4c 6f 6f 70 20 74  ee list). Loop t
fcf0: 68 72 6f 75 67 68 20 74 68 65 20 70 61 67 65 73  hrough the pages
fd00: 20 74 68 61 74 20 6c 69 65 20 62 65 79 6f 6e 64   that lie beyond
fd10: 0a 20 20 2a 2a 20 74 68 69 73 20 6d 61 72 6b 2c  .  ** this mark,
fd20: 20 61 6e 64 20 69 66 20 74 68 65 79 20 61 72 65   and if they are
fd30: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 6e 20   not already on 
fd40: 74 68 65 20 66 72 65 65 20 6c 69 73 74 2c 20 6d  the free list, m
fd50: 6f 76 65 20 74 68 65 6d 0a 20 20 2a 2a 20 74 6f  ove them.  ** to
fd60: 20 61 20 66 72 65 65 20 70 61 67 65 20 65 61 72   a free page ear
fd70: 6c 69 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  lier in the file
fd80: 20 28 73 6f 6d 65 77 68 65 72 65 20 62 65 66 6f   (somewhere befo
fd90: 72 65 20 66 69 6e 53 69 7a 65 29 2e 0a 20 20 2a  re finSize)..  *
fda0: 2f 0a 20 20 66 6f 72 28 20 69 44 62 50 61 67 65  /.  for( iDbPage
fdb0: 3d 66 69 6e 53 69 7a 65 2b 31 3b 20 69 44 62 50  =finSize+1; iDbP
fdc0: 61 67 65 3c 3d 6f 72 69 67 53 69 7a 65 3b 20 69  age<=origSize; i
fdd0: 44 62 50 61 67 65 2b 2b 20 29 7b 0a 20 20 20 20  DbPage++ ){.    
fde0: 2f 2a 20 49 66 20 69 44 62 50 61 67 65 20 69 73  /* If iDbPage is
fdf0: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
fe00: 61 67 65 2c 20 6f 72 20 74 68 65 20 70 65 6e 64  age, or the pend
fe10: 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2c 20 73  ing-byte page, s
fe20: 6b 69 70 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  kip it. */.    i
fe30: 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
fe40: 28 70 67 73 7a 2c 20 69 44 62 50 61 67 65 29 20  (pgsz, iDbPage) 
fe50: 7c 7c 20 69 44 62 50 61 67 65 3d 3d 50 45 4e 44  || iDbPage==PEND
fe60: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
fe70: 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  t) ){.      cont
fe80: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
fe90: 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
fea0: 70 42 74 2c 20 69 44 62 50 61 67 65 2c 20 26 65  pBt, iDbPage, &e
feb0: 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
fec0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
fed0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
fee0: 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20  utovacuum_out;. 
fef0: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
ff00: 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
ff10: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
ff20: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
ff30: 20 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75    goto autovacuu
ff40: 6d 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  m_out;.    }..  
ff50: 20 20 2f 2a 20 49 66 20 69 44 62 50 61 67 65 20    /* If iDbPage 
ff60: 69 73 20 66 72 65 65 2c 20 64 6f 20 6e 6f 74 20  is free, do not 
ff70: 73 77 61 70 20 69 74 2e 20 20 2a 2f 0a 20 20 20  swap it.  */.   
ff80: 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
ff90: 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
ffa0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
ffb0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
ffc0: 74 50 61 67 65 28 70 42 74 2c 20 69 44 62 50 61  tPage(pBt, iDbPa
ffd0: 67 65 2c 20 26 70 44 62 4d 65 6d 50 61 67 65 29  ge, &pDbMemPage)
ffe0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
fff0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
10000 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 0a  utovacuum_out;..
10010 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
10020 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
10030 20 66 72 65 65 2d 6c 69 73 74 20 74 68 61 74 20   free-list that 
10040 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
10050 74 20 74 68 65 20 65 6e 64 20 0a 20 20 20 20 2a  t the end .    *
10060 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 41  * of the file. A
10070 20 70 61 67 65 20 63 61 6e 20 62 65 20 70 75 6c   page can be pul
10080 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
10090 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 20   list using the 
100a0 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  .    ** allocate
100b0 50 61 67 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a  Page() routine..
100c0 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 7b 0a 20      */.    do{. 
100d0 20 20 20 20 20 69 66 28 20 70 46 72 65 65 4d 65       if( pFreeMe
100e0 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  mPage ){.       
100f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
10100 65 65 4d 65 6d 50 61 67 65 29 3b 0a 20 20 20 20  eeMemPage);.    
10110 20 20 20 20 70 46 72 65 65 4d 65 6d 50 61 67 65      pFreeMemPage
10120 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
10130 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
10140 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
10150 65 4d 65 6d 50 61 67 65 2c 20 26 69 46 72 65 65  eMemPage, &iFree
10160 50 61 67 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Page, 0, 0);.   
10170 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10190 72 65 6c 65 61 73 65 50 61 67 65 28 70 44 62 4d  releasePage(pDbM
101a0 65 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  emPage);.       
101b0 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d   goto autovacuum
101c0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
101d0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
101e0 65 50 61 67 65 3c 3d 6f 72 69 67 53 69 7a 65 20  ePage<=origSize 
101f0 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  );.    }while( i
10200 46 72 65 65 50 61 67 65 3e 66 69 6e 53 69 7a 65  FreePage>finSize
10210 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   );.    releaseP
10220 61 67 65 28 70 46 72 65 65 4d 65 6d 50 61 67 65  age(pFreeMemPage
10230 29 3b 0a 20 20 20 20 70 46 72 65 65 4d 65 6d 50  );.    pFreeMemP
10240 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63  age = 0;..    rc
10250 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
10260 70 42 74 2c 20 70 44 62 4d 65 6d 50 61 67 65 2c  pBt, pDbMemPage,
10270 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
10280 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
10290 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 44    releasePage(pD
102a0 62 4d 65 6d 50 61 67 65 29 3b 0a 20 20 20 20 69  bMemPage);.    i
102b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
102c0 20 29 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75   ) goto autovacu
102d0 75 6d 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  um_out;.  }..  /
102e0 2a 20 54 68 65 20 65 6e 74 69 72 65 20 66 72 65  * The entire fre
102f0 65 2d 6c 69 73 74 20 68 61 73 20 62 65 65 6e 20  e-list has been 
10300 73 77 61 70 70 65 64 20 74 6f 20 74 68 65 20 65  swapped to the e
10310 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
10320 53 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65  So.  ** truncate
10330 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10340 6c 65 20 74 6f 20 66 69 6e 53 69 7a 65 20 70 61  le to finSize pa
10350 67 65 73 20 61 6e 64 20 63 6f 6e 73 69 64 65 72  ges and consider
10360 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 2d 6c   the.  ** free-l
10370 69 73 74 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a  ist empty..  */.
10380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
10390 67 65 72 5f 77 72 69 74 65 28 70 42 74 2d 3e 70  ger_write(pBt->p
103a0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
103b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
103c0 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76 61  OK ) goto autova
103d0 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 70 75 74 34  cuum_out;.  put4
103e0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
103f0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
10400 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 42  ;.  put4byte(&pB
10410 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
10420 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20  [36], 0);.  if( 
10430 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
10440 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f  goto autovacuum_
10450 6f 75 74 3b 0a 20 20 2a 6e 54 72 75 6e 63 20 3d  out;.  *nTrunc =
10460 20 66 69 6e 53 69 7a 65 3b 0a 0a 61 75 74 6f 76   finSize;..autov
10470 61 63 75 75 6d 5f 6f 75 74 3a 0a 20 20 61 73 73  acuum_out:.  ass
10480 65 72 74 28 20 6e 52 65 66 3d 3d 2a 73 71 6c 69  ert( nRef==*sqli
10490 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28 70  te3pager_stats(p
104a0 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66 28 20  Pager) );.  if( 
104b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
104c0 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
104d0 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
104e0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
104f0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
10500 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
10510 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
10520 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
10530 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  s..**.** This wi
10540 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
10550 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
10560 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
10570 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
10580 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
10590 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
105a0 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
105b0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
105c0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
105d0 72 65 65 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  ree *pBt){.  int
105e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
105f0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
10600 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
10610 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
10620 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
10630 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
10640 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e   }.  pBt->inTran
10650 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
10660 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
10670 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  0;.  unlockBtree
10680 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
10690 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
106a0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
106b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
106c0 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63  umber of write-c
106d0 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
106e0 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  his handle. This
106f0 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
10700 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
10710 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
10720 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
10730 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
10740 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73  ** defined..*/.s
10750 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57  tatic int countW
10760 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 72 65  riteCursors(Btre
10770 65 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  e *pBt){.  BtCur
10780 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
10790 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
107a0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
107b0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
107c0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
107d0 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29  ( pCur->wrFlag )
107e0 20 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75   r++;.  }.  retu
107f0 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
10800 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
10810 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 64  ST./*.** Print d
10820 65 62 75 67 67 69 6e 67 20 69 6e 66 6f 72 6d 61  ebugging informa
10830 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 63  tion about all c
10840 75 72 73 6f 72 73 20 74 6f 20 73 74 61 6e 64 61  ursors to standa
10850 72 64 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 76 6f  rd output..*/.vo
10860 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
10870 75 72 73 6f 72 4c 69 73 74 28 42 74 72 65 65 20  ursorList(Btree 
10880 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
10890 72 20 2a 70 43 75 72 3b 0a 20 20 66 6f 72 28 70  r *pCur;.  for(p
108a0 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
108b0 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
108c0 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 4d  r->pNext){.    M
108d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
108e0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
108f0 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 70   char *zMode = p
10900 43 75 72 2d 3e 77 72 46 6c 61 67 20 3f 20 22 72  Cur->wrFlag ? "r
10910 77 22 20 3a 20 22 72 6f 22 3b 0a 20 20 20 20 73  w" : "ro";.    s
10920 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
10930 66 28 22 43 55 52 53 4f 52 20 25 70 20 72 6f 6f  f("CURSOR %p roo
10940 74 65 64 20 61 74 20 25 34 64 28 25 73 29 20 63  ted at %4d(%s) c
10950 75 72 72 65 6e 74 6c 79 20 61 74 20 25 64 2e 25  urrently at %d.%
10960 64 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70  d%s\n",.       p
10970 43 75 72 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  Cur, pCur->pgnoR
10980 6f 6f 74 2c 20 7a 4d 6f 64 65 2c 0a 20 20 20 20  oot, zMode,.    
10990 20 20 20 70 50 61 67 65 20 3f 20 70 50 61 67 65     pPage ? pPage
109a0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 70 43 75 72  ->pgno : 0, pCur
109b0 2d 3e 69 64 78 2c 0a 20 20 20 20 20 20 20 70 43  ->idx,.       pC
109c0 75 72 2d 3e 69 73 56 61 6c 69 64 20 3f 20 22 22  ur->isValid ? ""
109d0 20 3a 20 22 20 65 6f 66 22 0a 20 20 20 20 29 3b   : " eof".    );
109e0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
109f0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
10a00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
10a10 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
10a20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
10a30 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
10a40 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
10a50 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
10a60 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
10a70 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
10a80 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
10a90 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
10aa0 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
10ab0 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
10ac0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
10ad0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
10ae0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
10af0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
10b00 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
10b10 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
10b20 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
10b30 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
10b40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
10b50 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
10b60 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
10b70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
10b80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
10b90 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
10ba0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
10bb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
10bc0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
10bd0 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
10be0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
10bf0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
10c00 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
10c10 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
10c20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
10c30 67 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  getPage() on pag
10c40 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
10c50 65 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  e sure pPage1->a
10c60 44 61 74 61 20 69 73 0a 20 20 20 20 2a 2a 20 73  Data is.    ** s
10c70 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
10c80 0a 20 20 20 20 69 66 28 20 67 65 74 50 61 67 65  .    if( getPage
10c90 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
10ca0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
10cb0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
10cc0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
10cd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
10ce0 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70  ntWriteCursors(p
10cf0 42 74 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  Bt)==0 );.  }.  
10d00 70 42 74 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54  pBt->inTrans = T
10d10 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74  RANS_NONE;.  pBt
10d20 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
10d30 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
10d40 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75  sed(pBt);.  retu
10d50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10d60 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
10d70 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
10d80 2e 20 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  .  The subtransa
10d90 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e  ction can.** can
10da0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
10db0 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
10dc0 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
10dd0 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75  ction..** You mu
10de0 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
10df0 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 73 74  action before st
10e00 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
10e10 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20  saction..** The 
10e20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
10e30 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
10e40 63 61 6c 6c 79 20 69 66 20 74 68 65 20 6d 61 69  cally if the mai
10e50 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  n transaction.**
10e60 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
10e70 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  s back..**.** On
10e80 6c 79 20 6f 6e 65 20 73 75 62 74 72 61 6e 73 61  ly one subtransa
10e90 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
10ea0 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20  ive at a time.  
10eb0 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74  It is an error t
10ec0 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72  o try.** to star
10ed0 74 20 61 20 6e 65 77 20 73 75 62 74 72 61 6e 73  t a new subtrans
10ee0 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65  action if anothe
10ef0 72 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  r subtransaction
10f00 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
10f10 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ve..**.** Statem
10f20 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
10f30 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
10f40 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
10f50 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
10f60 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
10f70 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
10f80 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
10f90 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
10fa0 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
10fb0 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
10fc0 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
10fd0 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
10fe0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
10ff0 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
11000 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
11010 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
11020 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
11030 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
11040 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74  e3BtreeBeginStmt
11050 28 42 74 72 65 65 20 2a 70 42 74 29 7b 0a 20 20  (Btree *pBt){.  
11060 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 28 70  int rc;.  if( (p
11070 42 74 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41  Bt->inTrans!=TRA
11080 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74  NS_WRITE) || pBt
11090 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20  ->inStmt ){.    
110a0 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64  return pBt->read
110b0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
110c0 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
110d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
110e0 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
110f0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
11100 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
11110 62 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  begin(pBt->pPage
11120 72 29 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d  r);.  pBt->inStm
11130 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
11140 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc;.}.../*.** Co
11150 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e  mmit the statmen
11160 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
11170 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72   currently in pr
11180 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a  ogress.  If no.*
11190 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  * subtransaction
111a0 20 69 73 20 61 63 74 69 76 65 2c 20 74 68 69 73   is active, this
111b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
111c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
111d0 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65  CommitStmt(Btree
111e0 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
111f0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53  ;.  if( pBt->inS
11200 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61  tmt && !pBt->rea
11210 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20  dOnly ){.    rc 
11220 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  = sqlite3pager_s
11230 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 42 74 2d 3e  tmt_commit(pBt->
11240 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
11250 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
11260 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  E_OK;.  }.  pBt-
11270 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 72  >inStmt = 0;.  r
11280 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11290 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
112a0 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
112b0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
112c0 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73    If no subtrans
112d0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74  action.** is act
112e0 69 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ive this routine
112f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
11300 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  ** All cursors w
11310 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
11320 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
11330 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
11340 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63  pt.** to use a c
11350 75 72 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f  ursor that was o
11360 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
11370 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
11380 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72  ration.** will r
11390 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f  esult in an erro
113a0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
113b0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
113c0 6d 74 28 42 74 72 65 65 20 2a 70 42 74 29 7b 0a  mt(Btree *pBt){.
113d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
113e0 70 42 74 2d 3e 69 6e 53 74 6d 74 3d 3d 30 20 7c  pBt->inStmt==0 |
113f0 7c 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  | pBt->readOnly 
11400 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
11410 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OK;.  rc = sqlit
11420 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c  e3pager_stmt_rol
11430 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
11440 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f  r);.  assert( co
11450 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
11460 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 70 42 74  pBt)==0 );.  pBt
11470 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
11480 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11490 0a 2a 2a 20 44 65 66 61 75 6c 74 20 6b 65 79 20  .** Default key 
114a0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
114b0 69 6f 6e 20 74 6f 20 62 65 20 75 73 65 64 20 69  ion to be used i
114c0 66 20 6e 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  f no comparison 
114d0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  function.** is s
114e0 70 65 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20  pecified on the 
114f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
11500 6f 72 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74  or() call..*/.st
11510 61 74 69 63 20 69 6e 74 20 64 66 6c 74 43 6f 6d  atic int dfltCom
11520 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  pare(.  void *No
11530 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 20 20  tUsed,          
11540 20 20 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20     /* User data 
11550 69 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  is not used */. 
11560 20 69 6e 74 20 6e 31 2c 20 63 6f 6e 73 74 20 76   int n1, const v
11570 6f 69 64 20 2a 70 31 2c 20 20 20 20 2f 2a 20 46  oid *p1,    /* F
11580 69 72 73 74 20 6b 65 79 20 74 6f 20 63 6f 6d 70  irst key to comp
11590 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c  are */.  int n2,
115a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 32 20   const void *p2 
115b0 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6b 65      /* Second ke
115c0 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  y to compare */.
115d0 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20  ){.  int c;.  c 
115e0 3d 20 6d 65 6d 63 6d 70 28 70 31 2c 20 70 32 2c  = memcmp(p1, p2,
115f0 20 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32   n1<n2 ? n1 : n2
11600 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  );.  if( c==0 ){
11610 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32  .    c = n1 - n2
11620 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
11630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
11640 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
11650 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
11660 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
11670 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
11680 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20 61 63  .  The act of ac
11690 71 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72  quiring a cursor
116a0 20 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63   gets a read loc
116b0 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74  k on .** the dat
116c0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
116d0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20  * If wrFlag==0, 
116e0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
116f0 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
11700 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a   for reading..**
11710 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74   If wrFlag==1, t
11720 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
11730 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
11740 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a  eading or for.**
11750 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
11760 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
11770 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73   writing are als
11780 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a  o met.  These.**
11790 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
117a0 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
117b0 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f   met in order fo
117c0 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  r writing to.** 
117d0 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
117e0 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
117f0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
11800 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
11810 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20  ag==1.**.** 2:  
11820 4e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  No other cursors
11830 20 6d 61 79 20 62 65 20 6f 70 65 6e 20 77 69 74   may be open wit
11840 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
11850 68 65 20 73 61 6d 65 20 74 61 62 6c 65 0a 2a 2a  he same table.**
11860 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
11870 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
11880 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
11890 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
118a0 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
118b0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
118c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
118d0 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 32 20  .** Condition 2 
118e0 77 61 72 72 61 6e 74 73 20 66 75 72 74 68 65 72  warrants further
118f0 20 64 69 73 63 75 73 73 69 6f 6e 2e 20 20 49 66   discussion.  If
11900 20 61 6e 79 20 63 75 72 73 6f 72 20 69 73 20 6f   any cursor is o
11910 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 61 20 74 61  pened.** on a ta
11920 62 6c 65 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ble with wrFlag=
11930 3d 30 2c 20 74 68 61 74 20 70 72 65 76 65 6e 74  =0, that prevent
11940 73 20 61 6c 6c 20 6f 74 68 65 72 20 63 75 72 73  s all other curs
11950 6f 72 73 20 66 72 6f 6d 0a 2a 2a 20 77 72 69 74  ors from.** writ
11960 69 6e 67 20 74 6f 20 74 68 61 74 20 74 61 62 6c  ing to that tabl
11970 65 2e 20 20 54 68 69 73 20 69 73 20 61 20 6b 69  e.  This is a ki
11980 6e 64 20 6f 66 20 22 72 65 61 64 2d 6c 6f 63 6b  nd of "read-lock
11990 22 2e 20 20 57 68 65 6e 20 61 20 63 75 72 73 6f  ".  When a curso
119a0 72 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 77  r.** is opened w
119b0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 74  ith wrFlag==0 it
119c0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
119d0 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 77 69  hat the table wi
119e0 6c 6c 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  ll not.** change
119f0 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   as long as the 
11a00 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 2e 20  cursor is open. 
11a10 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
11a20 20 63 75 72 73 6f 72 20 74 6f 0a 2a 2a 20 64 6f   cursor to.** do
11a30 20 61 20 73 65 71 75 65 6e 74 69 61 6c 20 73 63   a sequential sc
11a40 61 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  an of the table 
11a50 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
11a60 6f 20 77 6f 72 72 79 20 61 62 6f 75 74 0a 2a 2a  o worry about.**
11a70 20 65 6e 74 72 69 65 73 20 62 65 69 6e 67 20 69   entries being i
11a80 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
11a90 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 73 63  ed during the sc
11aa0 61 6e 2e 20 20 43 75 72 73 6f 72 73 20 73 68 6f  an.  Cursors sho
11ab0 75 6c 64 0a 2a 2a 20 62 65 20 6f 70 65 6e 65 64  uld.** be opened
11ac0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
11ad0 6f 6e 6c 79 20 69 66 20 74 68 69 73 20 72 65 61  only if this rea
11ae0 64 2d 6c 6f 63 6b 20 70 72 6f 70 65 72 74 79 20  d-lock property 
11af0 69 73 20 6e 65 65 64 65 64 2e 0a 2a 2a 20 54 68  is needed..** Th
11b00 61 74 20 69 73 20 74 6f 20 73 61 79 2c 20 63 75  at is to say, cu
11b10 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 62 65 20  rsors should be 
11b20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
11b30 61 67 3d 3d 30 20 6f 6e 6c 79 20 69 66 20 74 68  ag==0 only if th
11b40 65 79 0a 2a 2a 20 69 6e 74 65 6e 64 20 74 6f 20  ey.** intend to 
11b50 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 42  use the sqlite3B
11b60 74 72 65 65 4e 65 78 74 28 29 20 73 79 73 74 65  treeNext() syste
11b70 6d 20 63 61 6c 6c 2e 20 20 41 6c 6c 20 6f 74 68  m call.  All oth
11b80 65 72 20 63 75 72 73 6f 72 73 0a 2a 2a 20 73 68  er cursors.** sh
11b90 6f 75 6c 64 20 62 65 20 6f 70 65 6e 65 64 20 77  ould be opened w
11ba0 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 20 65 76  ith wrFlag==1 ev
11bb0 65 6e 20 69 66 20 74 68 65 79 20 6e 65 76 65 72  en if they never
11bc0 20 72 65 61 6c 6c 79 20 69 6e 74 65 6e 64 0a 2a   really intend.*
11bd0 2a 20 74 6f 20 77 72 69 74 65 2e 0a 2a 2a 20 0a  * to write..** .
11be0 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
11bf0 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
11c00 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
11c10 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
11c20 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
11c30 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
11c40 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
11c50 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
11c60 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
11c70 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
11c80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61  .**.** The compa
11c90 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6d  rison function m
11ca0 75 73 74 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ust be logically
11cb0 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 65 76   the same for ev
11cc0 65 72 79 20 63 75 72 73 6f 72 0a 2a 2a 20 6f 6e  ery cursor.** on
11cd0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61   a particular ta
11ce0 62 6c 65 2e 20 20 43 68 61 6e 67 69 6e 67 20 74  ble.  Changing t
11cf0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
11d00 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  nction will resu
11d10 6c 74 0a 2a 2a 20 69 6e 20 69 6e 63 6f 72 72 65  lt.** in incorre
11d20 63 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  ct operations.  
11d30 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  If the compariso
11d40 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55  n function is NU
11d50 4c 4c 2c 20 61 0a 2a 2a 20 64 65 66 61 75 6c 74  LL, a.** default
11d60 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
11d70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 54  tion is used.  T
11d80 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
11d90 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 6c 77  nction is.** alw
11da0 61 79 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20  ays ignored for 
11db0 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2e 0a 2a  INTKEY tables..*
11dc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11dd0 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
11de0 65 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  e *pBt,         
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
11e10 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
11e20 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
11e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e40 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
11e50 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
11e60 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
11e70 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e90 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
11ea0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
11eb0 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29  */.  int (*xCmp)
11ec0 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
11ed0 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
11ee0 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4b 65 79 20   void*), /* Key 
11ef0 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 20  Comparison func 
11f00 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c  */.  void *pArg,
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f30 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
11f40 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
11f50 20 42 74 43 75 72 73 6f 72 20 2a 2a 70 70 43 75   BtCursor **ppCu
11f60 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11f80 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
11f90 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
11fa0 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
11fb0 20 2a 70 43 75 72 3b 0a 0a 20 20 2a 70 70 43 75   *pCur;..  *ppCu
11fc0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 77 72 46  r = 0;.  if( wrF
11fd0 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  lag ){.    if( p
11fe0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
11ff0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12000 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
12010 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63    }.    if( chec
12020 6b 52 65 61 64 4c 6f 63 6b 73 28 70 42 74 2c 20  kReadLocks(pBt, 
12030 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20  iTable, 0) ){.  
12040 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12050 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a  E_LOCKED;.    }.
12060 20 20 7d 0a 20 20 69 66 28 20 70 42 74 2d 3e 70    }.  if( pBt->p
12070 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
12080 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69  rc = lockBtreeWi
12090 74 68 52 65 74 72 79 28 70 42 74 29 3b 0a 20 20  thRetry(pBt);.  
120a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
120b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
120c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
120d0 7d 0a 20 20 70 43 75 72 20 3d 20 28 42 74 43 75  }.  pCur = (BtCu
120e0 72 73 6f 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  rsor *)sqliteMal
120f0 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
12100 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
12110 43 75 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Cur==0 ){.    rc
12120 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
12130 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
12140 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
12150 6e 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70  n;.  }.  pCur->p
12160 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
12170 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
12180 70 50 61 67 65 20 3d 20 30 3b 20 20 2f 2a 20 46  pPage = 0;  /* F
12190 6f 72 20 65 78 69 74 2d 68 61 6e 64 6c 65 72 2c  or exit-handler,
121a0 20 69 6e 20 63 61 73 65 20 67 65 74 41 6e 64 49   in case getAndI
121b0 6e 69 74 50 61 67 65 28 29 20 66 61 69 6c 73 2e  nitPage() fails.
121c0 20 2a 2f 0a 20 20 69 66 28 20 69 54 61 62 6c 65   */.  if( iTable
121d0 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 70 61  ==1 && sqlite3pa
121e0 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42  ger_pagecount(pB
121f0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b  t->pPager)==0 ){
12200 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12210 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f  _EMPTY;.    goto
12220 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
12230 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  xception;.  }.  
12240 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
12250 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
12260 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
12270 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
12280 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12290 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  {.    goto creat
122a0 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
122b0 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  on;.  }.  pCur->
122c0 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70 20  xCompare = xCmp 
122d0 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f 6d  ? xCmp : dfltCom
122e0 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70 41  pare;.  pCur->pA
122f0 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 70 43 75  rg = pArg;.  pCu
12300 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
12310 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77  pCur->wrFlag = w
12320 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 69  rFlag;.  pCur->i
12330 64 78 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  dx = 0;.  memset
12340 28 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 30 2c  (&pCur->info, 0,
12350 20 73 69 7a 65 6f 66 28 70 43 75 72 2d 3e 69 6e   sizeof(pCur->in
12360 66 6f 29 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4e  fo));.  pCur->pN
12370 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
12380 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  or;.  if( pCur->
12390 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75  pNext ){.    pCu
123a0 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
123b0 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 43  = pCur;.  }.  pC
123c0 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  ur->pPrev = 0;. 
123d0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
123e0 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 69 73  pCur;.  pCur->is
123f0 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 2a 70 70  Valid = 0;.  *pp
12400 43 75 72 20 3d 20 70 43 75 72 3b 0a 20 20 72 65  Cur = pCur;.  re
12410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12420 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65  .create_cursor_e
12430 78 63 65 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20  xception:.  if( 
12440 70 43 75 72 20 29 7b 0a 20 20 20 20 72 65 6c 65  pCur ){.    rele
12450 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50  asePage(pCur->pP
12460 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  age);.    sqlite
12470 46 72 65 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Free(pCur);.  }.
12480 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
12490 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65  nused(pBt);.  re
124a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
124b0 30 20 20 2f 2a 20 4e 6f 74 20 55 73 65 64 20 2a  0  /* Not Used *
124c0 2f 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  /./*.** Change t
124d0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
124e0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
124f0 69 6f 6e 20 75 73 65 64 20 62 79 20 61 20 63 75  ion used by a cu
12500 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
12510 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 6f 6d  lite3BtreeSetCom
12520 70 61 72 65 28 0a 20 20 42 74 43 75 72 73 6f 72  pare(.  BtCursor
12530 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 54   *pCur,     /* T
12540 68 65 20 63 75 72 73 6f 72 20 74 6f 20 77 68 6f  he cursor to who
12550 73 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  se comparison fu
12560 6e 63 74 69 6f 6e 20 69 73 20 63 68 61 6e 67 65  nction is change
12570 64 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 6d 70  d */.  int(*xCmp
12580 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
12590 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
125a0 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4e 65 77  t void*), /* New
125b0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
125c0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
125d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
125e0 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
125f0 43 6d 70 28 29 20 2a 2f 0a 29 7b 0a 20 20 70 43  Cmp() */.){.  pC
12600 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78  ur->xCompare = x
12610 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c  Cmp ? xCmp : dfl
12620 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72  tCompare;.  pCur
12630 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 7d  ->pArg = pArg;.}
12640 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
12650 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
12660 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
12670 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12680 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
12690 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
126a0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
126b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
126c0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
126d0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
126e0 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d  {.  Btree *pBt =
126f0 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 69 66   pCur->pBt;.  if
12700 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b  ( pCur->pPrev ){
12710 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76  .    pCur->pPrev
12720 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
12730 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
12740 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
12750 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
12760 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
12770 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75  pNext ){.    pCu
12780 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
12790 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
127a0 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
127b0 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
127c0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
127d0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 73 71 6c  used(pBt);.  sql
127e0 69 74 65 46 72 65 65 28 70 43 75 72 29 3b 0a 20  iteFree(pCur);. 
127f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12800 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
12810 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72   a temporary cur
12820 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69  sor by filling i
12830 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20  n the fields of 
12840 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65  pTempCur..** The
12850 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
12860 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20  r is not on the 
12870 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20  cursor list for 
12880 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 73 74  the Btree..*/.st
12890 61 74 69 63 20 76 6f 69 64 20 67 65 74 54 65 6d  atic void getTem
128a0 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
128b0 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72   *pCur, BtCursor
128c0 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 6d   *pTempCur){.  m
128d0 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20  emcpy(pTempCur, 
128e0 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70 43  pCur, sizeof(*pC
128f0 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72  ur));.  pTempCur
12900 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
12910 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d  TempCur->pPrev =
12920 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d 70 43   0;.  if( pTempC
12930 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20  ur->pPage ){.   
12940 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
12950 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67  f(pTempCur->pPag
12960 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d 0a 7d  e->aData);.  }.}
12970 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
12980 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
12990 72 20 73 75 63 68 20 61 73 20 77 61 73 20 6d 61  r such as was ma
129a0 64 65 20 62 79 20 74 68 65 20 43 72 65 61 74 65  de by the Create
129b0 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28  TemporaryCursor(
129c0 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62  ).** function ab
129d0 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ove..*/.static v
129e0 6f 69 64 20 72 65 6c 65 61 73 65 54 65 6d 70 43  oid releaseTempC
129f0 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
12a00 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75  pCur){.  if( pCu
12a10 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20  r->pPage ){.    
12a20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
12a30 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ef(pCur->pPage->
12a40 61 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  aData);.  }.}../
12a50 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
12a60 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  he BtCursor.info
12a70 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69   field of the gi
12a80 76 65 6e 20 63 75 72 73 6f 72 20 69 73 20 76 61  ven cursor is va
12a90 6c 69 64 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73  lid..** If it is
12aa0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
12ab0 69 64 2c 20 63 61 6c 6c 20 70 61 72 73 65 43 65  id, call parseCe
12ac0 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
12ad0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
12ae0 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
12af0 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
12b00 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
12b10 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
12b20 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
12b30 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
12b40 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 70 61  r of calls to pa
12b50 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 73 74  rseCell()..*/.st
12b60 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c  atic void getCel
12b70 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
12b80 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75  pCur){.  if( pCu
12b90 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
12ba0 20 29 7b 0a 20 20 20 20 70 61 72 73 65 43 65 6c   ){.    parseCel
12bb0 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70  l(pCur->pPage, p
12bc0 43 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d  Cur->idx, &pCur-
12bd0 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  >info);.  }else{
12be0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
12bf0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
12c00 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  o;.    memset(&i
12c10 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
12c20 6e 66 6f 29 29 3b 0a 20 20 20 20 70 61 72 73 65  nfo));.    parse
12c30 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
12c40 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e  , pCur->idx, &in
12c50 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
12c60 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
12c70 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
12c80 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
12c90 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
12ca0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
12cb0 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
12cc0 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20  e buffer needed 
12cd0 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
12ce0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  e of.** the key 
12cf0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
12d00 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63  entry.  If the c
12d10 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
12d20 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
12d30 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a  lid entry, *pSiz
12d40 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a  e is set to 0. .
12d50 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  **.** For a tabl
12d60 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45  e with the INTKE
12d70 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73  Y flag set, this
12d80 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
12d90 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65   the key.** itse
12da0 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62  lf, not the numb
12db0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
12dc0 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  he key..*/.int s
12dd0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
12de0 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
12df0 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  r, i64 *pSize){.
12e00 20 20 69 66 28 20 21 70 43 75 72 2d 3e 69 73 56    if( !pCur->isV
12e10 61 6c 69 64 20 29 7b 0a 20 20 20 20 2a 70 53 69  alid ){.    *pSi
12e20 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ze = 0;.  }else{
12e30 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  .    getCellInfo
12e40 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69  (pCur);.    *pSi
12e50 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
12e60 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nKey;.  }.  retu
12e70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12e80 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
12e90 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
12ea0 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
12eb0 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
12ec0 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
12ed0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
12ee0 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
12ef0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61  SQLITE_OK..** Fa
12f00 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
12f10 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63  sible.  If the c
12f20 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72  ursor is not cur
12f30 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69  rently.** pointi
12f40 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28  ng to an entry (
12f50 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e  which can happen
12f60 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
12f70 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
12f80 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e  e is empty) then
12f90 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
12fa0 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  o 0..*/.int sqli
12fb0 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
12fc0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
12fd0 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
12fe0 69 66 28 20 21 70 43 75 72 2d 3e 69 73 56 61 6c  if( !pCur->isVal
12ff0 69 64 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74  id ){.    /* Not
13000 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76   pointing at a v
13010 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74  alid entry - set
13020 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f   *pSize to 0. */
13030 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b  .    *pSize = 0;
13040 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65  .  }else{.    ge
13050 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
13060 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43  .    *pSize = pC
13070 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  ur->info.nData;.
13080 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
13090 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
130a0 20 52 65 61 64 20 70 61 79 6c 6f 61 64 20 69 6e   Read payload in
130b0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
130c0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
130d0 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
130e0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e  .** pointing to.
130f0 20 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20    Begin reading 
13100 74 68 65 20 70 61 79 6c 6f 61 64 20 61 74 20 22  the payload at "
13110 6f 66 66 73 65 74 22 20 61 6e 64 20 72 65 61 64  offset" and read
13120 0a 2a 2a 20 61 20 74 6f 74 61 6c 20 6f 66 20 22  .** a total of "
13130 61 6d 74 22 20 62 79 74 65 73 2e 20 20 50 75 74  amt" bytes.  Put
13140 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 7a   the result in z
13150 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Buf..**.** This 
13160 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
13170 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74   make a distinct
13180 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20  ion between key 
13190 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20  and data..** It 
131a0 6a 75 73 74 20 72 65 61 64 73 20 62 79 74 65 73  just reads bytes
131b0 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61   from the payloa
131c0 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69  d area.  Data mi
131d0 67 68 74 20 61 70 70 65 61 72 0a 2a 2a 20 6f 6e  ght appear.** on
131e0 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f   the main page o
131f0 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
13200 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
13210 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
13220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
13230 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
13240 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
13250 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
13260 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
13270 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
13280 74 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  t offset,       
13290 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
132a0 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
132b0 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69  o payload */.  i
132c0 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
132d0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
132e0 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
132f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13300 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
13310 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
13320 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
13330 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20  int skipKey     
13340 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62       /* offset b
13350 65 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66  egins at data if
13360 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
13370 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
13380 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
13390 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
133a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
133b0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
133c0 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20  ree *pBt;.  int 
133d0 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20  ovflSize;.  u32 
133e0 6e 4b 65 79 3b 0a 0a 20 20 61 73 73 65 72 74 28  nKey;..  assert(
133f0 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
13400 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
13410 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 73  assert( pCur->is
13420 56 61 6c 69 64 20 29 3b 0a 20 20 70 42 74 20 3d  Valid );.  pBt =
13430 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 70 50   pCur->pBt;.  pP
13440 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
13450 65 3b 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69  e;.  pageIntegri
13460 74 79 28 70 50 61 67 65 29 3b 0a 20 20 61 73 73  ty(pPage);.  ass
13470 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
13480 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
13490 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
134a0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
134b0 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
134c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
134d0 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  l;.  aPayload +=
134e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
134f0 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  der;.  if( pPage
13500 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
13510 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nKey = 0;.  }els
13520 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70 43  e{.    nKey = pC
13530 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
13540 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
13550 73 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  set>=0 );.  if( 
13560 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f  skipKey ){.    o
13570 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20  ffset += nKey;. 
13580 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b   }.  if( offset+
13590 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d  amt > nKey+pCur-
135a0 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20  >info.nData ){. 
135b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
135c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
135d0 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
135e0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
135f0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
13600 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
13610 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
13620 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
13630 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
13640 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
13650 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
13660 2c 20 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  , &aPayload[offs
13670 65 74 5d 2c 20 61 29 3b 0a 20 20 20 20 69 66 28  et], a);.    if(
13680 20 61 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 20   a==amt ){.     
13690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
136a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 66 66  K;.    }.    off
136b0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
136c0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
136d0 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
136e0 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
136f0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
13700 20 20 7d 0a 20 20 6f 76 66 6c 53 69 7a 65 20 3d    }.  ovflSize =
13710 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
13720 20 2d 20 34 3b 0a 20 20 69 66 28 20 61 6d 74 3e   - 4;.  if( amt>
13730 30 20 29 7b 0a 20 20 20 20 6e 65 78 74 50 61 67  0 ){.    nextPag
13740 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
13750 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
13760 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 20 20 20 20  o.nLocal]);.    
13770 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20  while( amt>0 && 
13780 6e 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20  nextPage ){.    
13790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
137a0 67 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61  ger_get(pBt->pPa
137b0 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 28  ger, nextPage, (
137c0 76 6f 69 64 2a 2a 29 26 61 50 61 79 6c 6f 61 64  void**)&aPayload
137d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
137e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
137f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
13800 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
13810 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
13820 6f 61 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oad);.      if( 
13830 6f 66 66 73 65 74 3c 6f 76 66 6c 53 69 7a 65 20  offset<ovflSize 
13840 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
13850 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
13860 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
13870 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
13880 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
13890 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
138a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
138b0 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 61 50  memcpy(pBuf, &aP
138c0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
138d0 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  , a);.        of
138e0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
138f0 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
13900 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
13910 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13920 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
13930 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 0a  flSize;.      }.
13940 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
13950 65 72 5f 75 6e 72 65 66 28 61 50 61 79 6c 6f 61  er_unref(aPayloa
13960 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  d);.    }.  }.. 
13970 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20   if( amt>0 ){.  
13980 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13990 43 4f 52 52 55 50 54 3b 20 2f 2a 20 62 6b 70 74  CORRUPT; /* bkpt
139a0 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 7d 0a  -CORRUPT */.  }.
139b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
139c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  OK;.}../*.** Rea
139d0 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65  d part of the ke
139e0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
139f0 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
13a00 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
13a10 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
13a20 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
13a30 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
13a40 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
13a50 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
13a60 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
13a70 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
13a80 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
13a90 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
13aa0 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
13ab0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
13ac0 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
13ad0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
13ae0 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
13af0 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
13b00 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
13b10 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
13b20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
13b30 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
13b40 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  {.  assert( pCur
13b50 2d 3e 69 73 56 61 6c 69 64 20 29 3b 0a 20 20 61  ->isValid );.  a
13b60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
13b70 67 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ge!=0 );.  if( p
13b80 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
13b90 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ey ){.    return
13ba0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
13bb0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
13bc0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
13bd0 65 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey==0 );.  asser
13be0 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
13bf0 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
13c00 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
13c10 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 50  );.  return getP
13c20 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
13c30 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
13c40 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
13c50 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  0);.}../*.** Rea
13c60 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
13c70 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
13c80 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
13c90 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
13ca0 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
13cb0 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
13cc0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
13cd0 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
13ce0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
13cf0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
13d00 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
13d10 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
13d20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
13d30 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
13d40 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
13d50 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
13d60 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
13d70 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
13d80 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
13d90 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
13da0 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
13db0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
13dc0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
13dd0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43  f){.  assert( pC
13de0 75 72 2d 3e 69 73 56 61 6c 69 64 20 29 3b 0a 20  ur->isValid );. 
13df0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
13e00 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
13e10 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
13e20 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
13e30 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
13e40 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 65  l );.  return ge
13e50 74 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  tPayload(pCur, o
13e60 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
13e70 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 42 75  igned char *)pBu
13e80 66 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 1);.}../*.** 
13e90 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
13ea0 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
13eb0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
13ec0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
13ed0 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
13ee0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
13ef0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
13f00 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
13f10 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
13f20 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64  f skipKey==0 and
13f30 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
13f40 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
13f50 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65  ata if.** skipKe
13f60 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65  y==1.  The numbe
13f70 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
13f80 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61  ailable key/data
13f90 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
13fa0 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
13fb0 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
13fc0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
13fd0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20   will not be.** 
13fe0 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
13ff0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14000 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
14010 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
14020 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
14030 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
14040 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
14050 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
14060 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
14070 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
14080 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
14090 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
140a0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
140b0 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
140c0 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
140d0 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
140e0 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
140f0 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
14100 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
14110 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
14120 68 65 6e 20 67 65 74 50 61 79 6c 6f 61 64 28 29  hen getPayload()
14130 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
14140 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74   reassembly.** t
14150 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
14160 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
14170 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
14180 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
14190 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
141a0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
141b0 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
141c0 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
141d0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
141e0 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
141f0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
14200 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
14210 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
14220 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
14230 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
14240 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
14250 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
14260 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
14270 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
14280 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
14290 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
142a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c   */.  int *pAmt,
142b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
142c0 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
142d0 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
142e0 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
142f0 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
14300 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
14310 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
14320 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
14330 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
14340 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
14350 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
14360 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 75 33  Btree *pBt;.  u3
14370 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c  2 nKey;.  int nL
14380 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  ocal;..  assert(
14390 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
143a0 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
143b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 73  assert( pCur->is
143c0 56 61 6c 69 64 20 29 3b 0a 20 20 70 42 74 20 3d  Valid );.  pBt =
143d0 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 70 50   pCur->pBt;.  pP
143e0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
143f0 65 3b 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69  e;.  pageIntegri
14400 74 79 28 70 50 61 67 65 29 3b 0a 20 20 61 73 73  ty(pPage);.  ass
14410 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
14420 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
14430 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
14440 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
14450 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
14460 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
14470 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  l;.  aPayload +=
14480 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
14490 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  der;.  if( pPage
144a0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
144b0 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nKey = 0;.  }els
144c0 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70 43  e{.    nKey = pC
144d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
144e0 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79   }.  if( skipKey
144f0 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64   ){.    aPayload
14500 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c   += nKey;.    nL
14510 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
14520 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b  o.nLocal - nKey;
14530 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
14540 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
14550 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66  o.nLocal;.    if
14560 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b  ( nLocal>nKey ){
14570 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  .      nLocal = 
14580 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
14590 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c    *pAmt = nLocal
145a0 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c  ;.  return aPayl
145b0 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
145c0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
145d0 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
145e0 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
145f0 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
14600 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
14610 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
14620 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
14630 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
14640 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
14650 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
14660 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
14670 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
14680 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
14690 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
146a0 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
146b0 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
146c0 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
146d0 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
146e0 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2e 0a 2a  Btree routine..*
146f0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
14700 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
14710 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
14720 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
14730 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
14740 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
14750 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
14760 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
14770 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
14780 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
14790 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
147a0 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
147b0 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
147c0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
147d0 20 70 41 6d 74 2c 20 30 29 3b 0a 7d 0a 63 6f 6e   pAmt, 0);.}.con
147e0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
147f0 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
14800 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
14810 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  nt *pAmt){.  ret
14820 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
14830 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
14840 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 7d 0a  ur, pAmt, 1);.}.
14850 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
14860 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
14870 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
14880 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
14890 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
148a0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
148b0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
148c0 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73  to move to..*/.s
148d0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
148e0 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
148f0 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
14900 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
14910 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67  MemPage *pNewPag
14920 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  e;.  MemPage *pO
14930 6c 64 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20  ldPage;.  Btree 
14940 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
14950 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
14960 72 2d 3e 69 73 56 61 6c 69 64 20 29 3b 0a 20 20  r->isValid );.  
14970 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
14980 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
14990 2c 20 26 70 4e 65 77 50 61 67 65 2c 20 70 43 75  , &pNewPage, pCu
149a0 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69 66 28  r->pPage);.  if(
149b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
149c0 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79  .  pageIntegrity
149d0 28 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 70 4e  (pNewPage);.  pN
149e0 65 77 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e  ewPage->idxParen
149f0 74 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20  t = pCur->idx;. 
14a00 20 70 4f 6c 64 50 61 67 65 20 3d 20 70 43 75 72   pOldPage = pCur
14a10 2d 3e 70 50 61 67 65 3b 0a 20 20 70 4f 6c 64 50  ->pPage;.  pOldP
14a20 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
14a30 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  0;.  releasePage
14a40 28 70 4f 6c 64 50 61 67 65 29 3b 0a 20 20 70 43  (pOldPage);.  pC
14a50 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 4e 65 77  ur->pPage = pNew
14a60 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 64  Page;.  pCur->id
14a70 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  x = 0;.  pCur->i
14a80 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
14a90 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
14aa0 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65  Cell<1 ){.    re
14ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
14ac0 55 50 54 3b 20 2f 2a 20 62 6b 70 74 2d 43 4f 52  UPT; /* bkpt-COR
14ad0 52 55 50 54 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  RUPT */.  }.  re
14ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14af0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
14b00 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
14b10 20 69 73 20 74 68 65 20 76 69 72 74 75 61 6c 20   is the virtual 
14b20 72 6f 6f 74 20 6f 66 20 69 74 73 20 74 61 62 6c  root of its tabl
14b30 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72  e..**.** The vir
14b40 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
14b50 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
14b60 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e  for most tables.
14b70 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65    But.** for the
14b80 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e   table rooted on
14b90 20 70 61 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d   page 1, sometim
14ba0 65 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 20  e the real root 
14bb0 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79  page.** is empty
14bc0 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
14bd0 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20  right-pointer.  
14be0 49 6e 20 73 75 63 68 20 63 61 73 65 73 20 74 68  In such cases th
14bf0 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  e.** virtual roo
14c00 74 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  t page is the pa
14c10 67 65 20 74 68 61 74 20 74 68 65 20 72 69 67 68  ge that the righ
14c20 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70 61 67  t-pointer of pag
14c30 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e 74 69  e.** 1 is pointi
14c40 6e 67 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ng to..*/.static
14c50 20 69 6e 74 20 69 73 52 6f 6f 74 50 61 67 65 28   int isRootPage(
14c60 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
14c70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
14c80 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61  ent = pPage->pPa
14c90 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 72  rent;.  if( pPar
14ca0 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ent==0 ) return 
14cb0 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  1;.  if( pParent
14cc0 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75 72  ->pgno>1 ) retur
14cd0 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32 62  n 0;.  if( get2b
14ce0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
14cf0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
14d00 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20  Offset+3])==0 ) 
14d10 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
14d20 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  rn 0;.}../*.** M
14d30 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
14d40 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
14d50 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
14d60 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
14d70 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
14d80 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
14d90 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
14da0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
14db0 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
14dc0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
14dd0 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
14de0 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
14df0 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
14e00 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
14e10 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
14e20 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
14e30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14e40 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
14e50 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
14e60 20 50 67 6e 6f 20 6f 6c 64 50 67 6e 6f 3b 0a 20   Pgno oldPgno;. 
14e70 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
14e80 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
14e90 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50 61  age;.  int idxPa
14ea0 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  rent;..  assert(
14eb0 20 70 43 75 72 2d 3e 69 73 56 61 6c 69 64 20 29   pCur->isValid )
14ec0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
14ed0 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
14ee0 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20  t( pPage!=0 );. 
14ef0 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 6f 74   assert( !isRoot
14f00 50 61 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20  Page(pPage) );. 
14f10 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70   pageIntegrity(p
14f20 50 61 67 65 29 3b 0a 20 20 70 50 61 72 65 6e 74  Page);.  pParent
14f30 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
14f40 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  t;.  assert( pPa
14f50 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 70 61 67  rent!=0 );.  pag
14f60 65 49 6e 74 65 67 72 69 74 79 28 70 50 61 72 65  eIntegrity(pPare
14f70 6e 74 29 3b 0a 20 20 69 64 78 50 61 72 65 6e 74  nt);.  idxParent
14f80 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72   = pPage->idxPar
14f90 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 70 61  ent;.  sqlite3pa
14fa0 67 65 72 5f 72 65 66 28 70 50 61 72 65 6e 74 2d  ger_ref(pParent-
14fb0 3e 61 44 61 74 61 29 3b 0a 20 20 6f 6c 64 50 67  >aData);.  oldPg
14fc0 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
14fd0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
14fe0 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  pPage);.  pCur->
14ff0 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b  pPage = pParent;
15000 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
15010 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ize = 0;.  asser
15020 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53  t( pParent->idxS
15030 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75  hift==0 );.  pCu
15040 72 2d 3e 69 64 78 20 3d 20 69 64 78 50 61 72 65  r->idx = idxPare
15050 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  nt;.}../*.** Mov
15060 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
15070 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f  the root page.*/
15080 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
15090 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
150a0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
150b0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
150c0 72 63 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  rc;.  Btree *pBt
150d0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
150e0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
150f0 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
15100 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
15110 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
15120 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 73 56 61  {.    pCur->isVa
15130 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  lid = 0;.    ret
15140 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  urn rc;.  }.  re
15150 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
15160 70 50 61 67 65 29 3b 0a 20 20 70 61 67 65 49 6e  pPage);.  pageIn
15170 74 65 67 72 69 74 79 28 70 52 6f 6f 74 29 3b 0a  tegrity(pRoot);.
15180 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
15190 70 52 6f 6f 74 3b 0a 20 20 70 43 75 72 2d 3e 69  pRoot;.  pCur->i
151a0 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  dx = 0;.  pCur->
151b0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
151c0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
151d0 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
151e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
151f0 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61  o subpage;.    a
15200 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
15210 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62  no==1 );.    sub
15220 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
15230 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
15240 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
15250 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
15260 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20  subpage>0 );.   
15270 20 70 43 75 72 2d 3e 69 73 56 61 6c 69 64 20 3d   pCur->isValid =
15280 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   1;.    rc = mov
15290 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
152a0 75 62 70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70  ubpage);.  }.  p
152b0 43 75 72 2d 3e 69 73 56 61 6c 69 64 20 3d 20 70  Cur->isValid = p
152c0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
152d0 6c 3e 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  l>0;.  return rc
152e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
152f0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
15300 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
15310 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
15320 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
15330 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
15340 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
15350 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
15360 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
15370 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
15380 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
15390 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
153a0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
153b0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 73 56 61  sert( pCur->isVa
153c0 6c 69 64 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  lid );.  while( 
153d0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
153e0 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
153f0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
15400 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
15410 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
15420 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
15430 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
15440 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
15450 69 64 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  idx));.    rc = 
15460 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
15470 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
15480 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
15490 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
154a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
154b0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
154c0 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
154d0 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
154e0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
154f0 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
15500 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
15510 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
15520 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
15530 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
15540 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
15550 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
15560 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
15570 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
15580 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
15590 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
155a0 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
155b0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
155c0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
155d0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
155e0 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
155f0 65 2a 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e*..*/.static in
15600 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
15610 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
15620 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
15630 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
15640 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
15650 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 73 56  ssert( pCur->isV
15660 61 6c 69 64 20 29 3b 0a 20 20 77 68 69 6c 65 28  alid );.  while(
15670 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
15680 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b  >pPage)->leaf ){
15690 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
156a0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
156b0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
156c0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
156d0 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
156e0 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
156f0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
15700 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
15710 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
15720 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78  .  }.  pCur->idx
15730 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   = pPage->nCell 
15740 2d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  - 1;.  pCur->inf
15750 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 72  o.nSize = 0;.  r
15760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15770 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
15780 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
15790 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
157a0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
157b0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
157c0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
157d0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
157e0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
157f0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
15800 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
15810 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
15820 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
15830 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15840 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
15850 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
15860 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
15870 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
15880 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
15890 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
158a0 69 66 28 20 70 43 75 72 2d 3e 69 73 56 61 6c 69  if( pCur->isVali
158b0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  d==0 ){.    asse
158c0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
158d0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
158e0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
158f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15900 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15910 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
15920 6c 6c 3e 30 20 29 3b 0a 20 20 2a 70 52 65 73 20  ll>0 );.  *pRes 
15930 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  = 0;.  rc = move
15940 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
15950 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15960 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
15970 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
15980 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
15990 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
159a0 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
159b0 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
159c0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
159d0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
159e0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
159f0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
15a00 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
15a10 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
15a20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15a30 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
15a40 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
15a50 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
15a60 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
15a70 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
15a80 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
15a90 70 43 75 72 2d 3e 69 73 56 61 6c 69 64 3d 3d 30  pCur->isValid==0
15aa0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15ab0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
15ac0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52  ll==0 );.    *pR
15ad0 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
15ae0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15af0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
15b00 2d 3e 69 73 56 61 6c 69 64 20 29 3b 0a 20 20 2a  ->isValid );.  *
15b10 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d  pRes = 0;.  rc =
15b20 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
15b30 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
15b40 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
15b50 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
15b60 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
15b70 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 70 4b  an entry near pK
15b80 65 79 2f 6e 4b 65 79 2e 0a 2a 2a 20 52 65 74 75  ey/nKey..** Retu
15b90 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
15ba0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
15bb0 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79  KEY tables, only
15bc0 20 74 68 65 20 6e 4b 65 79 20 70 61 72 61 6d 65   the nKey parame
15bd0 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 4b  ter is used.  pK
15be0 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
15bf0 2e 20 20 46 6f 72 20 6f 74 68 65 72 20 74 61 62  .  For other tab
15c00 6c 65 73 2c 20 6e 4b 65 79 20 69 73 20 74 68 65  les, nKey is the
15c10 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
15c20 20 6f 66 20 64 61 74 61 0a 2a 2a 20 69 6e 20 6e   of data.** in n
15c30 4b 65 79 2e 20 20 54 68 65 20 63 6f 6d 70 61 72  Key.  The compar
15c40 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 73 70  ison function sp
15c50 65 63 69 66 69 65 64 20 77 68 65 6e 20 74 68 65  ecified when the
15c60 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 63   cursor was.** c
15c70 72 65 61 74 65 64 20 69 73 20 75 73 65 64 20 74  reated is used t
15c80 6f 20 63 6f 6d 70 61 72 65 20 6b 65 79 73 2e 0a  o compare keys..
15c90 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
15ca0 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
15cb0 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
15cc0 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
15cd0 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
15ce0 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
15cf0 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
15d00 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
15d10 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
15d20 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
15d30 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
15d40 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
15d50 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
15d60 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
15d70 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
15d80 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
15d90 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
15da0 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 0a 2a  y to which the.*
15db0 2a 20 63 75 72 73 6f 72 20 69 73 20 77 72 69 74  * cursor is writ
15dc0 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69 66 20  ten to *pRes if 
15dd0 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65  pRes!=NULL.  The
15de0 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74   meaning of.** t
15df0 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 73 20  his value is as 
15e00 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
15e10 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
15e20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
15e30 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
15e40 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
15e70 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20   pKey or if the 
15e80 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
15e90 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
15ea0 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
15eb0 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
15ec0 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
15ed0 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
15ee0 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
15ef0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
15f00 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
15f10 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
15f30 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 4b  actly matches pK
15f40 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
15f50 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
15f60 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
15f70 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
15f80 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
15f90 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
15fa0 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65 79 2e  arger than pKey.
15fb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15fc0 74 72 65 65 4d 6f 76 65 74 6f 28 42 74 43 75 72  treeMoveto(BtCur
15fd0 73 6f 72 20 2a 70 43 75 72 2c 20 63 6f 6e 73 74  sor *pCur, const
15fe0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
15ff0 20 6e 4b 65 79 2c 20 69 6e 74 20 2a 70 52 65 73   nKey, int *pRes
16000 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  ){.  int rc;.  r
16010 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
16020 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
16030 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73   return rc;.  as
16040 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
16050 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
16060 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e  Cur->pPage->isIn
16070 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  it );.  if( pCur
16080 2d 3e 69 73 56 61 6c 69 64 3d 3d 30 20 29 7b 0a  ->isValid==0 ){.
16090 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
160a0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
160b0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
160c0 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
160d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
160e0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
160f0 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20  nt lwr, upr;.   
16100 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
16110 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
16120 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
16130 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20      int c = -1; 
16140 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20   /* pRes return 
16150 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  if table is empt
16160 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a  y must be -1 */.
16170 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
16180 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
16190 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 21  ell-1;.    if( !
161a0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
161b0 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20   pKey==0 ){.    
161c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
161d0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20  CORRUPT;.    }. 
161e0 20 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79     pageIntegrity
161f0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 77 68 69  (pPage);.    whi
16200 6c 65 28 20 6c 77 72 3c 3d 75 70 72 20 29 7b 0a  le( lwr<=upr ){.
16210 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
16220 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20  lKey;.      i64 
16230 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
16240 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77 72  pCur->idx = (lwr
16250 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 20 20 70  +upr)/2;.      p
16260 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
16270 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
16280 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
16290 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
162a0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
162b0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
162c0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
162d0 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  <nKey ){.       
162e0 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20     c = -1;.     
162f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
16300 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b 0a 20 20  llKey>nKey ){.  
16310 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a          c = +1;.
16320 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16330 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a           c = 0;.
16340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16350 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
16360 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20  nt available;.  
16370 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
16380 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61   (void *)fetchPa
16390 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61  yload(pCur, &ava
163a0 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  ilable, 0);.    
163b0 20 20 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c      if( availabl
163c0 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20  e>=nCellKey ){. 
163d0 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 75           c = pCu
163e0 72 2d 3e 78 43 6f 6d 70 61 72 65 28 70 43 75 72  r->xCompare(pCur
163f0 2d 3e 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79  ->pArg, nCellKey
16400 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79  , pCellKey, nKey
16410 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , pKey);.       
16420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16430 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
16440 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 43  iteMallocRaw( nC
16450 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ellKey );.      
16460 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
16470 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
16480 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
16490 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
164a0 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
164b0 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f  0, nCellKey, (vo
164c0 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a  id *)pCellKey);.
164d0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43            c = pC
164e0 75 72 2d 3e 78 43 6f 6d 70 61 72 65 28 70 43 75  ur->xCompare(pCu
164f0 72 2d 3e 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65  r->pArg, nCellKe
16500 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65  y, pCellKey, nKe
16510 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
16520 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
16530 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
16540 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
16550 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
16560 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
16570 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
16580 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
16590 65 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67  eafData && !pPag
165a0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
165b0 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d       lwr = pCur-
165c0 3e 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  >idx;.          
165d0 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20  upr = lwr - 1;. 
165e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
165f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16600 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
16610 73 20 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  s ) *pRes = 0;. 
16620 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
16640 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16650 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
16660 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72        lwr = pCur
16670 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d  ->idx+1;.      }
16680 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70  else{.        up
16690 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b  r = pCur->idx-1;
166a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
166b0 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
166c0 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  upr+1 );.    ass
166d0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
166e0 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
166f0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
16700 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20     chldPg = 0;. 
16710 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72     }else if( lwr
16720 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
16730 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
16740 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
16750 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
16760 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
16770 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
16780 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
16790 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
167a0 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
167b0 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20    if( chldPg==0 
167c0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
167d0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
167e0 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
167f0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
16800 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20  .      if( pRes 
16810 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20  ) *pRes = c;.   
16820 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16830 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
16840 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a  Cur->idx = lwr;.
16850 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
16860 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 72 63  Size = 0;.    rc
16870 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
16880 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
16890 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
168a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
168b0 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20   }.  }.  /* NOT 
168c0 52 45 41 43 48 45 44 20 2a 2f 0a 7d 0a 0a 2f 2a  REACHED */.}../*
168d0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
168e0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
168f0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
16900 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
16910 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
16920 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
16930 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
16940 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
16950 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
16960 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
16970 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
16980 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
16990 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
169a0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
169b0 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
169c0 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
169d0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
169e0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
169f0 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
16a00 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
16a10 74 75 72 6e 20 70 43 75 72 2d 3e 69 73 56 61 6c  turn pCur->isVal
16a20 69 64 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  id==0;.}../*.** 
16a30 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
16a40 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
16a50 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
16a60 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
16a70 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
16a80 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
16a90 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
16aa0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
16ab0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
16ac0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
16ad0 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
16ae0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
16af0 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
16b00 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
16b10 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
16b20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
16b30 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
16b40 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
16b50 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
16b60 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
16b70 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66   pRes!=0 );.  if
16b80 28 20 70 43 75 72 2d 3e 69 73 56 61 6c 69 64 3d  ( pCur->isValid=
16b90 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  =0 ){.    *pRes 
16ba0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
16bb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16bc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
16bd0 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
16be0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3c 70 50  rt( pCur->idx<pP
16bf0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
16c00 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20   pCur->idx++;.  
16c10 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
16c20 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72   = 0;.  if( pCur
16c30 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ->idx>=pPage->nC
16c40 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
16c50 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
16c60 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
16c70 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
16c80 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
16c90 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
16ca0 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
16cb0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
16cc0 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d  rc;.      rc = m
16cd0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
16ce0 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  ur);.      *pRes
16cf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
16d00 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
16d10 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 69   do{.      if( i
16d20 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29  sRootPage(pPage)
16d30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
16d40 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  s = 1;.        p
16d50 43 75 72 2d 3e 69 73 56 61 6c 69 64 20 3d 20 30  Cur->isValid = 0
16d60 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
16d70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
16d80 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
16d90 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
16da0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
16db0 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68  ->pPage;.    }wh
16dc0 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ile( pCur->idx>=
16dd0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
16de0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
16df0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
16e00 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
16e10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
16e20 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
16e30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16e40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16e50 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
16e60 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
16e70 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
16e80 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
16e90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16ea0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
16eb0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
16ec0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
16ed0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  c;.}../*.** Step
16ee0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
16ef0 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
16f00 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
16f10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
16f20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
16f30 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
16f40 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
16f50 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
16f60 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
16f70 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
16f80 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
16f90 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
16fa0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
16fb0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
16fc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16fd0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
16fe0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
16ff0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
17000 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  rc;.  Pgno pgno;
17010 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
17020 65 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  e;.  if( pCur->i
17030 73 56 61 6c 69 64 3d 3d 30 20 29 7b 0a 20 20 20  sValid==0 ){.   
17040 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
17050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17060 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  ;.  }..  pPage =
17070 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
17080 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
17090 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
170a0 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
170b0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
170c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
170d0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 20 66 69  o = get4byte( fi
170e0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
170f0 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20 20 20  ur->idx) );.    
17100 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
17110 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
17120 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
17130 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
17140 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
17150 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
17160 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
17170 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  idx==0 ){.      
17180 69 66 28 20 69 73 52 6f 6f 74 50 61 67 65 28 70  if( isRootPage(p
17190 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Page) ){.       
171a0 20 70 43 75 72 2d 3e 69 73 56 61 6c 69 64 20 3d   pCur->isValid =
171b0 20 30 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   0;.        *pRe
171c0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
171d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
171e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
171f0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
17200 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
17210 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
17220 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64    }.    pCur->id
17230 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  x--;.    pCur->i
17240 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
17250 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
17260 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67 65  afData && !pPage
17270 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
17280 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
17290 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
172a0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
172b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
172c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
172d0 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
172e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
172f0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
17300 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
17310 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17320 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
17330 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
17340 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
17350 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
17360 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a  3pager_write().*
17370 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
17380 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
17390 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
173a0 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
173b0 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
173c0 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
173d0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
173e0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
173f0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
17400 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
17410 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
17420 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
17430 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
17440 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
17450 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
17460 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
17470 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
17480 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
17490 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
174a0 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
174b0 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
174c0 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
174d0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 70 61 67  nvoke sqlite3pag
174e0 65 72 5f 75 6e 72 65 66 28 29 20 6f 6e 20 2a 70  er_unref() on *p
174f0 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f  pPage if an erro
17500 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
17510 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
17520 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
17530 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20  s not 0, then a 
17540 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20  (feeble) effort 
17550 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
17560 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
17570 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
17580 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
17590 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
175a0 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
175b0 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
175c0 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
175d0 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
175e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
175f0 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
17600 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
17610 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
17620 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
17630 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65  e "exact" parame
17640 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e  ter is not 0, an
17650 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  d the page-numbe
17660 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20  r nearby exists 
17670 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
17680 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
17690 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e  hen it is guaren
176a0 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
176b0 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  ned. This.** is 
176c0 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74  only used by aut
176d0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
176e0 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69  es when allocati
176f0 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a  ng a new table..
17700 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
17710 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
17720 72 65 65 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d  ree *pBt, .  Mem
17730 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a  Page **ppPage, .
17740 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a    Pgno *pPgno, .
17750 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20    Pgno nearby,. 
17760 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d   u8 exact.){.  M
17770 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
17780 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
17790 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
177a0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
177b0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
177c0 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt k;     /* Num
177d0 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
177e0 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
177f0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 0a 20  e freelist */.. 
17800 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
17810 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74  Page1;.  n = get
17820 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
17830 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28  Data[36]);.  if(
17840 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
17850 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
17860 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
17870 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
17880 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
17890 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
178a0 6b 20 3d 20 30 3b 0a 20 20 20 20 50 67 6e 6f 20  k = 0;.    Pgno 
178b0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 4d 65 6d 50  iTrunk;.    MemP
178c0 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
178d0 3d 20 30 3b 0a 20 20 20 20 75 38 20 73 65 61 72  = 0;.    u8 sear
178e0 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
178f0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
17900 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
17910 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
17920 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
17930 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61  the 'exact' para
17940 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61  meter was true a
17950 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
17960 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
17970 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
17980 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
17990 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
179a0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
179b0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
179c0 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
179d0 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
179e0 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
179f0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
17a00 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17a10 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74  UM.    if( exact
17a20 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79   ){.      u8 eTy
17a30 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pe;.      assert
17a40 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
17a50 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
17a60 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
17a70 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
17a80 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
17a90 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
17aa0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
17ab0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28  rn rc;.      if(
17ac0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
17ad0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
17ae0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
17af0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
17b00 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79   *pPgno = nearby
17b10 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
17b20 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
17b30 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
17b40 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
17b50 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
17b60 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
17b70 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
17b80 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
17b90 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
17ba0 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
17bb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
17bc0 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
17bd0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  1->aData);.    i
17be0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
17bf0 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
17c00 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
17c10 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
17c20 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
17c30 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
17c40 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
17c50 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
17c60 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
17c70 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
17c80 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
17c90 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
17ca0 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
17cb0 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
17cc0 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
17cd0 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
17ce0 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
17cf0 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
17d00 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
17d10 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
17d20 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
17d30 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
17d40 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
17d50 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
17d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17d70 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
17d80 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
17d90 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
17da0 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67       rc = getPag
17db0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
17dc0 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 69  pTrunk);.      i
17dd0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
17de0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
17df0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
17e00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17e10 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
17e20 4f 44 4f 3a 20 54 68 69 73 20 73 68 6f 75 6c 64  ODO: This should
17e30 20 6d 6f 76 65 20 74 6f 20 61 66 74 65 72 20 74   move to after t
17e40 68 65 20 6c 6f 6f 70 3f 20 2a 2f 0a 20 20 20 20  he loop? */.    
17e50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
17e60 67 65 72 5f 77 72 69 74 65 28 70 54 72 75 6e 6b  ger_write(pTrunk
17e70 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
17e80 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
17e90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
17ea0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 72  runk);.        r
17eb0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
17ec0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
17ed0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17ee0 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   }..      k = ge
17ef0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
17f00 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
17f10 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
17f20 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
17f30 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
17f40 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
17f50 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
17f60 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
17f70 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
17f80 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
17f90 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
17fa0 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
17fb0 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
17fc0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
17fd0 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
17fe0 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
17ff0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  ==0 );.        *
18000 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
18010 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
18020 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
18030 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
18040 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
18050 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
18060 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
18070 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
18080 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
18090 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
180a0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
180b0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
180c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
180d0 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65  f( k>pBt->usable
180e0 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
180f0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
18100 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
18110 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
18120 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
18130 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18140 54 45 5f 43 4f 52 52 55 50 54 3b 20 2f 2a 20 62  TE_CORRUPT; /* b
18150 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 23  kpt-CORRUPT */.#
18160 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18170 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
18180 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
18190 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72  archList && near
181a0 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20  by==iTrunk ){.  
181b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
181c0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
181d0 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
181e0 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
181f0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
18200 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
18210 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
18220 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
18230 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
18240 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
18250 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20  no==iTrunk );.  
18260 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
18270 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
18280 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
18290 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
182a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
182b0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
182c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
182d0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
182e0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
182f0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
18300 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
18310 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
18320 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
18330 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
18340 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
18350 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
18360 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18370 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
18380 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
18390 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
183a0 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
183b0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
183c0 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
183d0 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
183e0 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
183f0 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
18400 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
18410 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
18420 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18430 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
18440 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
18450 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
18460 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
18470 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
18480 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
18490 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  etPage(pBt, iNew
184a0 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
184b0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
184c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
184d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
184e0 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
184f0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
18500 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
18510 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  vTrunk);.       
18520 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18530 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18540 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18550 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 4e  e3pager_write(pN
18560 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 29 3b  ewTrunk->aData);
18570 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
18580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18590 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
185a0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
185b0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
185c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
185d0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
185e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
185f0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
18600 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18610 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
18620 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
18630 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
18640 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
18650 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
18660 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
18670 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
18680 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
18690 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
186a0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
186b0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
186c0 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
186d0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
186e0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
186f0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
18700 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
18710 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
18720 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
18730 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
18740 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
18750 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
18760 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
18770 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18780 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
18790 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
187a0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
187b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
187c0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
187d0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
187e0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
187f0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
18800 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
18810 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
18820 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
18830 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
18840 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f  .        int clo
18850 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
18860 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
18870 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
18880 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
18890 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
188a0 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
188b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c            int i,
188c0 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
188d0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
188e0 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67          dist = g
188f0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
18900 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
18910 20 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c         if( dist<
18920 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74  0 ) dist = -dist
18930 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
18940 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
18950 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
18960 64 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  d2 = get4byte(&a
18970 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
18980 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20  earby;.         
18990 20 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32     if( d2<0 ) d2
189a0 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20   = -d2;.        
189b0 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
189c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
189d0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
189e0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
189f0 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
18a00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
18a10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
18a20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
18a30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
18a40 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
18a50 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
18a60 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
18a70 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
18a80 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
18a90 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
18aa0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
18ab0 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
18ac0 20 69 66 28 20 2a 70 50 67 6e 6f 3e 73 71 6c 69   if( *pPgno>sqli
18ad0 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
18ae0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
18af0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
18b00 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66 66 20  * Free page off 
18b10 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
18b20 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ile */.         
18b30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18b40 5f 43 4f 52 52 55 50 54 3b 20 2f 2a 20 62 6b 70  _CORRUPT; /* bkp
18b50 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 20  t-CORRUPT */.   
18b60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18b70 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
18b80 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
18b90 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
18ba0 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
18bb0 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
18bc0 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
18bd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18be0 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
18bf0 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
18c00 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
18c10 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
18c20 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
18c30 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
18c40 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
18c50 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
18c60 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
18c70 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
18c80 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
18c90 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
18ca0 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
18cb0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
18cc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
18cd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18ce0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
18cf0 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
18d00 72 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61 67  rollback((*ppPag
18d10 65 29 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  e)->aData);.    
18d20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
18d30 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
18d40 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61  (*ppPage)->aData
18d50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
18d60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18d70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18d80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
18d90 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
18da0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18db0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
18dc0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
18dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18de0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18df0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
18e00 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
18e10 69 73 74 20 29 3b 0a 20 20 20 20 72 65 6c 65 61  ist );.    relea
18e20 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
18e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
18e40 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
18e50 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
18e60 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20  st, so create a 
18e70 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a  new page at the.
18e80 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68      ** end of th
18e90 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 2a 70  e file */.    *p
18ea0 50 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 70 61  Pgno = sqlite3pa
18eb0 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42  ger_pagecount(pB
18ec0 74 2d 3e 70 50 61 67 65 72 29 20 2b 20 31 3b 0a  t->pPager) + 1;.
18ed0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18ee0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
18ef0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
18f00 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
18f10 50 5f 49 53 50 41 47 45 28 70 42 74 2d 3e 75 73  P_ISPAGE(pBt->us
18f20 61 62 6c 65 53 69 7a 65 2c 20 2a 70 50 67 6e 6f  ableSize, *pPgno
18f30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
18f40 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
18f50 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
18f60 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
18f70 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
18f80 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
18f90 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
18fa0 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
18fb0 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
18fc0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
18fd0 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
18fe0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
18ff0 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
19000 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
19010 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19020 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
19030 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
19040 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
19050 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50  ap page)\n", *pP
19060 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73  gno));.      ass
19070 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
19080 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
19090 42 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70  Bt) );.      (*p
190a0 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 23  Pgno)++;.    }.#
190b0 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72  endif..    asser
190c0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
190d0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
190e0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  ) );.    rc = ge
190f0 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
19100 6f 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 20 20  o, ppPage);.    
19110 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
19120 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
19130 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
19140 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61  (*ppPage)->aData
19150 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
19160 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19170 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
19180 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
19190 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
191a0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
191b0 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
191c0 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
191d0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
191e0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
191f0 42 74 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  Bt) );.  return 
19200 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
19210 20 61 20 70 61 67 65 20 6f 66 20 74 68 65 20 64   a page of the d
19220 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
19230 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
19240 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
19250 5f 75 6e 72 65 66 28 29 20 69 73 20 4e 4f 54 20  _unref() is NOT 
19260 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67 65  called for pPage
19270 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19280 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
19290 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 72 65   *pPage){.  Btre
192a0 65 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  e *pBt = pPage->
192b0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
192c0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
192d0 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20  age1;.  int rc, 
192e0 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70  n, k;..  /* Prep
192f0 61 72 65 20 74 68 65 20 70 61 67 65 20 66 6f 72  are the page for
19300 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73   freeing */.  as
19310 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
19320 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  o>1 );.  pPage->
19330 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65  isInit = 0;.  re
19340 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 2d  leasePage(pPage-
19350 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 70 50 61  >pParent);.  pPa
19360 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b  ge->pParent = 0;
19370 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
19380 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
19390 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
193a0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
193b0 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
193c0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 69 66  e1->aData);.  if
193d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
193e0 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
193f0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
19400 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
19410 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
19420 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 6e  36], n+1);..#ifn
19430 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19440 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
19450 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
19460 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
19470 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65  cuum, write an e
19480 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
19490 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20  ter-map.  ** to 
194a0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
194b0 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a  e page is free..
194c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
194d0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
194e0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
194f0 28 70 42 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  (pBt, pPage->pgn
19500 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  o, PTRMAP_FREEPA
19510 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
19520 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
19530 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
19540 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ( n==0 ){.    /*
19550 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72   This is the fir
19560 73 74 20 66 72 65 65 20 70 61 67 65 20 2a 2f 0a  st free page */.
19570 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19580 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
19590 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
195a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
195b0 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  c;.    memset(pP
195c0 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 38  age->aData, 0, 8
195d0 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  );.    put4byte(
195e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
195f0 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  2], pPage->pgno)
19600 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22 46 52  ;.    TRACE(("FR
19610 45 45 2d 50 41 47 45 3a 20 25 64 20 66 69 72 73  EE-PAGE: %d firs
19620 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  t\n", pPage->pgn
19630 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o));.  }else{.  
19640 20 20 2f 2a 20 4f 74 68 65 72 20 66 72 65 65 20    /* Other free 
19650 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 65 78  pages already ex
19660 69 73 74 2e 20 20 52 65 74 72 69 76 65 20 74 68  ist.  Retrive th
19670 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  e first trunk pa
19680 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ge.    ** of the
19690 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 66 69   freelist and fi
196a0 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  nd out how many 
196b0 6c 65 61 76 65 73 20 69 74 20 68 61 73 2e 20 2a  leaves it has. *
196c0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
196d0 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20 3d 20  Trunk;.    rc = 
196e0 67 65 74 50 61 67 65 28 70 42 74 2c 20 67 65 74  getPage(pBt, get
196f0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
19700 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54 72 75  Data[32]), &pTru
19710 6e 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  nk);.    if( rc 
19720 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
19730 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
19740 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
19750 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 42 74  ;.    if( k>=pBt
19760 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
19770 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54   8 ){.      /* T
19780 68 65 20 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c  he trunk is full
19790 2e 20 20 54 75 72 6e 20 74 68 65 20 70 61 67 65  .  Turn the page
197a0 20 62 65 69 6e 67 20 66 72 65 65 64 20 69 6e 74   being freed int
197b0 6f 20 61 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a  o a new.      **
197c0 20 74 72 75 6e 6b 20 70 61 67 65 20 77 69 74 68   trunk page with
197d0 20 6e 6f 20 6c 65 61 76 65 73 2e 20 2a 2f 0a 20   no leaves. */. 
197e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
197f0 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
19800 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
19810 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
19820 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 75 74 34  n rc;.      put4
19830 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
19840 61 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  a, pTrunk->pgno)
19850 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
19860 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
19870 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
19880 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
19890 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d  Data[32], pPage-
198a0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 54 52  >pgno);.      TR
198b0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
198c0 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
198d0 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
198e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
198f0 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70    pPage->pgno, p
19900 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
19910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19920 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79  /* Add the newly
19930 20 66 72 65 65 64 20 70 61 67 65 20 61 73 20 61   freed page as a
19940 20 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72   leaf on the cur
19950 72 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20  rent trunk */.  
19960 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19970 70 61 67 65 72 5f 77 72 69 74 65 28 70 54 72 75  pager_write(pTru
19980 6e 6b 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  nk->aData);.    
19990 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
199a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 75 74 34  n rc;.      put4
199b0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
199c0 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20  ata[4], k+1);.  
199d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
199e0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a  runk->aData[8+k*
199f0 34 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  4], pPage->pgno)
19a00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70  ;.      sqlite3p
19a10 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28  ager_dont_write(
19a20 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 50 61  pBt->pPager, pPa
19a30 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
19a40 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
19a50 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
19a60 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
19a70 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
19a80 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
19a90 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
19aa0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20  e(pTrunk);.  }. 
19ab0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19ac0 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
19ad0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
19ae0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
19af0 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
19b00 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
19b10 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
19b20 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
19b30 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
19b40 72 65 65 20 2a 70 42 74 20 3d 20 70 50 61 67 65  ree *pBt = pPage
19b50 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
19b60 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
19b70 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
19b80 63 3b 0a 0a 20 20 70 61 72 73 65 43 65 6c 6c 50  c;..  parseCellP
19b90 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
19ba0 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
19bb0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30  nfo.iOverflow==0
19bc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
19bd0 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
19be0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
19bf0 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
19c00 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
19c10 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f  /.  }.  ovflPgno
19c20 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
19c30 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
19c40 77 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 6f 76  w]);.  while( ov
19c50 66 6c 50 67 6e 6f 21 3d 30 20 29 7b 0a 20 20 20  flPgno!=0 ){.   
19c60 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b   MemPage *pOvfl;
19c70 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
19c80 6f 3e 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  o>sqlite3pager_p
19c90 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
19ca0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
19cb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
19cc0 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
19cd0 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
19ce0 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
19cf0 66 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fl);.    if( rc 
19d00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
19d10 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
19d20 62 79 74 65 28 70 4f 76 66 6c 2d 3e 61 44 61 74  byte(pOvfl->aDat
19d30 61 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65  a);.    rc = fre
19d40 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
19d50 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
19d60 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 61 44 61 74  nref(pOvfl->aDat
19d70 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  a);.    if( rc )
19d80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
19d90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19da0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
19db0 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
19dc0 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
19dd0 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
19de0 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
19df0 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
19e00 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
19e10 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
19e20 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
19e30 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
19e40 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
19e50 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
19e60 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
19e70 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
19e80 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
19e90 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
19ea0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
19eb0 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
19ec0 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
19ed0 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
19ee0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
19ef0 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
19f00 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
19f10 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
19f20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
19f30 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
19f40 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
19f50 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
19f60 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
19f70 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
19f80 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
19f90 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
19fa0 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
19fb0 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
19fc0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
19fd0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
19fe0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
19ff0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1a000 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
1a010 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
1a020 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
1a030 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
1a040 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
1a050 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
1a060 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
1a070 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
1a080 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
1a090 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
1a0a0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  data */.  int *p
1a0b0 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
1a0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1a0d0 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
1a0e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
1a0f0 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
1a100 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
1a110 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
1a120 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
1a130 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
1a140 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
1a150 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
1a160 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1a170 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
1a180 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
1a190 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d  ;.  Btree *pBt =
1a1a0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
1a1b0 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  gno pgnoOvfl = 0
1a1c0 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
1a1d0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
1a1e0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
1a1f0 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
1a200 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20   nHeader = 0;.  
1a210 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1a220 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
1a230 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20  += 4;.  }.  if( 
1a240 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
1a250 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
1a260 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
1a270 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74  l[nHeader], nDat
1a280 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  a);.  }else{.   
1a290 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a   nData = 0;.  }.
1a2a0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
1a2b0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
1a2c0 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
1a2d0 6e 4b 65 79 29 3b 0a 20 20 70 61 72 73 65 43 65  nKey);.  parseCe
1a2e0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
1a2f0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
1a300 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
1a310 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
1a320 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
1a330 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
1a340 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
1a350 3d 3d 6e 44 61 74 61 20 29 3b 0a 20 20 0a 20 20  ==nData );.  .  
1a360 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
1a370 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79  ayload */.  nPay
1a380 6c 6f 61 64 20 3d 20 6e 44 61 74 61 3b 0a 20 20  load = nData;.  
1a390 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1a3a0 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
1a3b0 28 63 6f 6e 73 74 20 75 38 20 2a 29 70 44 61 74  (const u8 *)pDat
1a3c0 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
1a3d0 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
1a3e0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1a3f0 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65   nPayload += nKe
1a400 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 28 63  y;.    pSrc = (c
1a410 6f 6e 73 74 20 75 38 20 2a 29 70 4b 65 79 3b 0a  onst u8 *)pKey;.
1a420 20 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65 79 3b      nSrc = nKey;
1a430 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d  .  }.  *pnSize =
1a440 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73   info.nSize;.  s
1a450 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e  paceLeft = info.
1a460 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f  nLocal;.  pPaylo
1a470 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
1a480 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d  der];.  pPrior =
1a490 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76   &pCell[info.iOv
1a4a0 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c  erflow];..  whil
1a4b0 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b  e( nPayload>0 ){
1a4c0 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65  .    if( spaceLe
1a4d0 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  ft==0 ){.#ifndef
1a4e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a4f0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
1a500 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
1a510 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
1a520 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
1a530 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
1a540 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  e */.#endif.    
1a550 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50    rc = allocateP
1a560 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
1a570 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
1a580 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
1a590 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a5a0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
1a5b0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1a5c0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
1a5d0 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
1a5e0 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
1a5f0 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
1a600 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
1a610 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
1a620 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
1a630 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
1a640 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
1a650 74 20 70 61 67 65 20 6e 6f 77 2e 20 54 68 65 20  t page now. The 
1a660 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1a670 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
1a680 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
1a690 2a 2a 20 61 64 64 65 64 20 6c 61 74 65 72 2c 20  ** added later, 
1a6a0 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c  by the insertCel
1a6b0 6c 28 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  l() routine..   
1a6c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1a6d0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1a6e0 26 26 20 70 67 6e 6f 50 74 72 6d 61 70 21 3d 30  && pgnoPtrmap!=0
1a6f0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1a700 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1a710 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
1a720 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41   pgnoOvfl, PTRMA
1a730 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 70 67 6e  P_OVERFLOW2, pgn
1a740 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20  oPtrmap);.      
1a750 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
1a760 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1a770 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
1a780 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
1a790 20 20 2f 2a 20 63 6c 65 61 72 43 65 6c 6c 28 70    /* clearCell(p
1a7a0 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 20 2a 2f  Page, pCell); */
1a7b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1a7c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1a7d0 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
1a7e0 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
1a7f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1a800 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
1a810 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
1a820 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
1a830 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
1a840 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
1a850 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
1a860 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
1a870 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
1a880 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
1a890 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
1a8a0 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
1a8b0 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
1a8c0 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
1a8d0 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
1a8e0 4c 65 66 74 3b 0a 20 20 20 20 69 66 28 20 6e 3e  Left;.    if( n>
1a8f0 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
1a900 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
1a910 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
1a920 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
1a930 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
1a940 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
1a950 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
1a960 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
1a970 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
1a980 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSrc==0 ){.     
1a990 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
1a9a0 20 20 20 20 20 70 53 72 63 20 3d 20 28 63 6f 6e       pSrc = (con
1a9b0 73 74 20 75 38 20 2a 29 70 44 61 74 61 3b 0a 20  st u8 *)pData;. 
1a9c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
1a9d0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
1a9e0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
1a9f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1aa00 20 43 68 61 6e 67 65 20 74 68 65 20 4d 65 6d 50   Change the MemP
1aa10 61 67 65 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e  age.pParent poin
1aa20 74 65 72 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ter on the page 
1aa30 77 68 6f 73 65 20 6e 75 6d 62 65 72 20 69 73 0a  whose number is.
1aa40 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ** given in the 
1aa50 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1aa60 73 6f 20 74 68 61 74 20 4d 65 6d 50 61 67 65 2e  so that MemPage.
1aa70 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 74 68  pParent holds th
1aa80 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20  e.** pointer in 
1aa90 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
1aaa0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1aab0 74 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 42  t reparentPage(B
1aac0 74 72 65 65 20 2a 70 42 74 2c 20 50 67 6e 6f 20  tree *pBt, Pgno 
1aad0 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70  pgno, MemPage *p
1aae0 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69  NewParent, int i
1aaf0 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  dx){.  MemPage *
1ab00 70 54 68 69 73 3b 0a 20 20 75 6e 73 69 67 6e 65  pThis;.  unsigne
1ab10 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 0a  d char *aData;..
1ab20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20    if( pgno==0 ) 
1ab30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ab40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1ab50 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
1ab60 61 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65  aData = (unsigne
1ab70 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  d char *)sqlite3
1ab80 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 42 74  pager_lookup(pBt
1ab90 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
1aba0 0a 20 20 69 66 28 20 61 44 61 74 61 20 29 7b 0a  .  if( aData ){.
1abb0 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d 65 6d      pThis = (Mem
1abc0 50 61 67 65 2a 29 26 61 44 61 74 61 5b 70 42 74  Page*)&aData[pBt
1abd0 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20  ->pageSize];.   
1abe0 20 61 73 73 65 72 74 28 20 70 54 68 69 73 2d 3e   assert( pThis->
1abf0 61 44 61 74 61 3d 3d 61 44 61 74 61 20 29 3b 0a  aData==aData );.
1ac00 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 69      if( pThis->i
1ac10 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 69  sInit ){.      i
1ac20 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e  f( pThis->pParen
1ac30 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20 29 7b  t!=pNewParent ){
1ac40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 68  .        if( pTh
1ac50 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20 73 71  is->pParent ) sq
1ac60 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1ac70 28 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d  (pThis->pParent-
1ac80 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >aData);.       
1ac90 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20   pThis->pParent 
1aca0 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20  = pNewParent;.  
1acb0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 50 61        if( pNewPa
1acc0 72 65 6e 74 20 29 20 73 71 6c 69 74 65 33 70 61  rent ) sqlite3pa
1acd0 67 65 72 5f 72 65 66 28 70 4e 65 77 50 61 72 65  ger_ref(pNewPare
1ace0 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  nt->aData);.    
1acf0 20 20 7d 0a 20 20 20 20 20 20 70 54 68 69 73 2d    }.      pThis-
1ad00 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 69 64 78  >idxParent = idx
1ad10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1ad20 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 61  te3pager_unref(a
1ad30 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  Data);.  }..#ifn
1ad40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ad50 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
1ad60 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1ad70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1ad80 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
1ad90 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
1ada0 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67  , pNewParent->pg
1adb0 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  no);.  }.#endif.
1adc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1add0 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43  OK;.}..../*.** C
1ade0 68 61 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e  hange the pParen
1adf0 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c  t pointer of all
1ae00 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
1ae10 67 65 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b  ge to point back
1ae20 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a  .** to pPage..**
1ae30 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
1ae40 64 73 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68  ds, for every ch
1ae50 69 6c 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e  ild of pPage, in
1ae60 76 6f 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67  voke reparentPag
1ae70 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73  e().** to make s
1ae80 75 72 65 20 74 68 61 74 20 65 61 63 68 20 63 68  ure that each ch
1ae90 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70  ild knows that p
1aea0 50 61 67 65 20 69 73 20 69 74 73 20 70 61 72 65  Page is its pare
1aeb0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
1aec0 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
1aed0 65 64 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d  ed after you mem
1aee0 63 70 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69  cpy() one page i
1aef0 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a  nto.** another..
1af00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1af10 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
1af20 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1af30 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 72  {.  int i;.  Btr
1af40 65 65 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ee *pBt = pPage-
1af50 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
1af60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1af70 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
1af80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1af90 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  K;..  for(i=0; i
1afa0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
1afb0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
1afc0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1afd0 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  age, i);.    if(
1afe0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1aff0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 70 61  .      rc = repa
1b000 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65  rentPage(pBt, ge
1b010 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70  t4byte(pCell), p
1b020 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
1b030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b040 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1b050 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
1b060 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1b070 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
1b080 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
1b090 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1b0a0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1b0b0 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20 20 70  t+8]), .       p
1b0c0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 50  Page, i);.    pP
1b0d0 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
1b0e0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1b0f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  rc;.}../*.** Rem
1b100 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
1b110 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
1b120 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
1b130 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
1b140 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
1b150 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
1b160 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
1b170 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
1b180 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
1b190 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
1b1a0 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
1b1b0 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
1b1c0 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
1b1d0 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
1b1e0 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
1b1f0 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
1b200 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
1b210 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1b220 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
1b230 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b240 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65  dropCell(MemPage
1b250 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78   *pPage, int idx
1b260 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74  , int sz){.  int
1b270 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   i;          /* 
1b280 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1b290 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
1b2a0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
1b2b0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
1b2c0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
1b2d0 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
1b2e0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
1b2f0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
1b300 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
1b310 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
1b320 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
1b330 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73  data[] */..  ass
1b340 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
1b350 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
1b360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
1b370 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
1b380 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
1b390 74 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t( sqlite3pager_
1b3a0 69 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  iswriteable(pPag
1b3b0 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 64  e->aData) );.  d
1b3c0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
1b3d0 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74  ta;.  ptr = &dat
1b3e0 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
1b3f0 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20  set + 2*idx];.  
1b400 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
1b410 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 63  r);.  assert( pc
1b420 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50  >10 && pc+sz<=pP
1b430 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
1b440 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65 53 70  Size );.  freeSp
1b450 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
1b460 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b  z);.  for(i=idx+
1b470 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  1; i<pPage->nCel
1b480 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b  l; i++, ptr+=2){
1b490 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74  .    ptr[0] = pt
1b4a0 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d  r[2];.    ptr[1]
1b4b0 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20   = ptr[3];.  }. 
1b4c0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
1b4d0 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
1b4e0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1b4f0 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
1b500 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
1b510 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70 50 61  Free += 2;.  pPa
1b520 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31  ge->idxShift = 1
1b530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
1b540 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
1b550 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
1b560 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
1b570 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
1b580 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1b590 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
1b5a0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
1b5b0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
1b5c0 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
1b5d0 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
1b5e0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
1b5f0 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
1b600 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
1b610 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
1b620 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
1b630 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
1b640 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
1b650 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
1b660 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
1b670 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  ->aOvfl[] and ma
1b680 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
1b690 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
1b6a0 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
1b6b0 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
1b6c0 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
1b6d0 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
1b6e0 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
1b6f0 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
1b700 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
1b710 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
1b720 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
1b730 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
1b740 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
1b750 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
1b760 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
1b770 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
1b780 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
1b790 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
1b7a0 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
1b7b0 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
1b7c0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1b7d0 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
1b7e0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
1b7f0 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
1b800 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
1b810 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
1b820 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
1b830 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
1b840 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
1b850 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43  atic int insertC
1b860 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
1b870 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
1b880 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
1b890 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
1b8a0 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
1b8b0 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
1b8c0 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
1b8d0 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
1b8e0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
1b8f0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
1b900 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
1b910 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
1b920 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
1b930 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
1b940 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
1b950 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
1b960 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
1b970 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
1b980 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75 38 20   needed */.  u8 
1b990 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 2f  nSkip          /
1b9a0 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  * Do not write t
1b9b0 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
1b9c0 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
1b9d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
1b9e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ;          /* Wh
1b9f0 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
1ba00 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
1ba10 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
1ba20 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
1ba30 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1ba40 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
1ba50 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
1ba60 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66  yte of content f
1ba70 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64  or any cell in d
1ba80 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65  ata[] */.  int e
1ba90 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
1baa0 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
1bab0 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f  the last cell po
1bac0 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
1bad0 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20  */.  int ins;   
1bae0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1baf0 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20  in data[] where 
1bb00 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
1bb10 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   is inserted */.
1bb20 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
1bb30 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1bb40 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65  to data[] of the
1bb50 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
1bb60 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
1bb70 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ;   /* Address o
1bb80 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  f first cell poi
1bb90 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
1bba0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
1bbb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
1bbc0 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
1bbd0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
1bbe0 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ptr;          /*
1bbf0 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67   Used for moving
1bc00 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f   information aro
1bc10 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  und in data[] */
1bc20 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
1bc30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
1bc40 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
1bc50 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
1bc60 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
1bc70 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
1bc80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1bc90 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
1bca0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 61 44 61  eable(pPage->aDa
1bcb0 74 61 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ta) );.  if( pPa
1bcc0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
1bcd0 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
1bce0 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
1bcf0 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
1bd00 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c  cpy(pTemp+nSkip,
1bd10 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
1bd20 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70  -nSkip);.      p
1bd30 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
1bd40 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67    }.    j = pPag
1bd50 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a  e->nOverflow++;.
1bd60 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 73 69      assert( j<si
1bd70 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
1bd80 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  l)/sizeof(pPage-
1bd90 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a 20 20  >aOvfl[0]) );.  
1bda0 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
1bdb0 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ].pCell = pCell;
1bdc0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
1bdd0 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a 20 20  l[j].idx = i;.  
1bde0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
1bdf0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1be00 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
1be10 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20  Data;.    hdr = 
1be20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1be30 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
1be40 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
1be50 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ]);.    cellOffs
1be60 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
1be70 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
1be80 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
1be90 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20  *pPage->nCell + 
1bea0 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  2;.    ins = cel
1beb0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
1bec0 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70     if( end > top
1bed0 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 69   - sz ){.      i
1bee0 6e 74 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65  nt rc = defragme
1bef0 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
1bf00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1bf10 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1bf20 72 63 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20  rc;.      top = 
1bf30 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
1bf40 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73  dr+5]);.      as
1bf50 73 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c  sert( end + sz <
1bf60 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20  = top );.    }. 
1bf70 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74     idx = allocat
1bf80 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
1bf90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
1bfa0 64 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  dx>0 );.    asse
1bfb0 72 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62  rt( end <= get2b
1bfc0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
1bfd0 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
1bfe0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
1bff0 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a  ge->nFree -= 2;.
1c000 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
1c010 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
1c020 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
1c030 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65  ip);.    for(j=e
1c040 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b  nd-2, ptr=&data[
1c050 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c  j]; j>ins; j-=2,
1c060 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20   ptr-=2){.      
1c070 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d  ptr[0] = ptr[-2]
1c080 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d  ;.      ptr[1] =
1c090 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[-1];.    }.
1c0a0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
1c0b0 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
1c0c0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
1c0d0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
1c0e0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  >nCell);.    pPa
1c0f0 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31  ge->idxShift = 1
1c100 3b 0a 20 20 20 20 70 61 67 65 49 6e 74 65 67 72  ;.    pageIntegr
1c110 69 74 79 28 70 50 61 67 65 29 3b 0a 23 69 66 6e  ity(pPage);.#ifn
1c120 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c130 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1c140 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
1c150 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1c160 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
1c170 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
1c180 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
1c190 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
1c1a0 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
1c1b0 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
1c1c0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
1c1d0 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
1c1e0 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
1c1f0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
1c200 66 6f 3b 0a 20 20 20 20 20 20 70 61 72 73 65 43  fo;.      parseC
1c210 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
1c220 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
1c230 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61     if( (info.nDa
1c240 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
1c250 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e  y?0:info.nKey))>
1c260 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
1c270 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f         Pgno pgno
1c280 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
1c290 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
1c2a0 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20  rflow]);.       
1c2b0 20 69 6e 74 20 72 63 20 3d 20 70 74 72 6d 61 70   int rc = ptrmap
1c2c0 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
1c2d0 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50  pgnoOvfl, PTRMAP
1c2e0 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
1c2f0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
1c300 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c310 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1c320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
1c330 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74  endif.  }..  ret
1c340 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1c350 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
1c360 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
1c370 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
1c380 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
1c390 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
1c3a0 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
1c3b0 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
1c3c0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
1c3d0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
1c3e0 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
1c3f0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
1c400 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
1c410 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
1c420 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
1c430 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1c440 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
1c450 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
1c460 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
1c470 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
1c480 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
1c490 0a 20 20 69 6e 74 20 2a 61 53 69 7a 65 20 20 20  .  int *aSize   
1c4a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
1c4b0 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
1c4c0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1c4d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1c4e0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  nter */.  int to
1c4f0 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54  talSize;    /* T
1c500 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  otal size of all
1c510 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20   cells */.  int 
1c520 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  hdr;          /*
1c530 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68   Index of page h
1c540 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  eader */.  int c
1c550 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20  ellptr;      /* 
1c560 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
1c570 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
1c580 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20    int cellbody; 
1c590 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1c5a0 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79  f next cell body
1c5b0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
1c5c0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
1c5d0 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
1c5e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1c5f0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
1c600 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20  ;.  totalSize = 
1c610 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
1c620 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1c630 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61 53   totalSize += aS
1c640 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73  ize[i];.  }.  as
1c650 73 65 72 74 28 20 74 6f 74 61 6c 53 69 7a 65 2b  sert( totalSize+
1c660 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  2*nCell<=pPage->
1c670 6e 46 72 65 65 20 29 3b 0a 20 20 61 73 73 65 72  nFree );.  asser
1c680 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
1c690 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20  =0 );.  cellptr 
1c6a0 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
1c6b0 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  set;.  data = pP
1c6c0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
1c6d0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
1c6e0 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74 65  fset;.  put2byte
1c6f0 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e  (&data[hdr+3], n
1c700 43 65 6c 6c 29 3b 0a 20 20 63 65 6c 6c 62 6f 64  Cell);.  cellbod
1c710 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  y = allocateSpac
1c720 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c 53 69  e(pPage, totalSi
1c730 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ze);.  assert( c
1c740 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20 61  ellbody>0 );.  a
1c750 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
1c760 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29  ree >= 2*nCell )
1c770 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
1c780 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 66   -= 2*nCell;.  f
1c790 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1c7a0 20 69 2b 2b 29 7b 0a 20 20 20 20 70 75 74 32 62   i++){.    put2b
1c7b0 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74  yte(&data[cellpt
1c7c0 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  r], cellbody);. 
1c7d0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
1c7e0 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
1c7f0 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b  l[i], aSize[i]);
1c800 0a 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20  .    cellptr += 
1c810 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20  2;.    cellbody 
1c820 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d  += aSize[i];.  }
1c830 0a 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62  .  assert( cellb
1c840 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ody==pPage->pBt-
1c850 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
1c860 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
1c870 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nCell;.}../*.** 
1c880 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  The following pa
1c890 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69  rameters determi
1c8a0 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61  ne how many adja
1c8b0 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69  cent pages get i
1c8c0 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20  nvolved.** in a 
1c8d0 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
1c8e0 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20  ion.  NN is the 
1c8f0 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  number of neighb
1c900 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
1c910 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  de.** of the pag
1c920 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  e that participa
1c930 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
1c940 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
1c950 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74  NB is the.** tot
1c960 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1c970 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70  es that particip
1c980 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  ate, including t
1c990 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61  he target page a
1c9a0 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f  nd.** NN neighbo
1c9b0 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
1c9c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e  e..**.** The min
1c9d0 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e  imum value of NN
1c9e0 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65   is 1 (of course
1c9f0 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e  ).  Increasing N
1ca00 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f  N above 1.** (to
1ca10 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61   2 or 3) gives a
1ca20 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d   modest improvem
1ca30 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e  ent in SELECT an
1ca40 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d  d DELETE perform
1ca50 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61  ance.** in excha
1ca60 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72  nge for a larger
1ca70 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20   degradation in 
1ca80 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
1ca90 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a  E performance..*
1caa0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e  * The value of N
1cab0 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76  N appears to giv
1cac0 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c  e the best resul
1cad0 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23  ts overall..*/.#
1cae0 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20  define NN 1     
1caf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cb00 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
1cb10 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
1cb20 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e   pPage */.#defin
1cb30 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20  e NB (NN*2+1)   
1cb40 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65     /* Total page
1cb50 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
1cb60 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a  e balance */../*
1cb70 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
1cb80 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
1cb90 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65   balance(MemPage
1cba0 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65  *, int);..#ifnde
1cbb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
1cbc0 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a  ICKBALANCE./*.**
1cbd0 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
1cbe0 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c   balance() handl
1cbf0 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70  es the common sp
1cc00 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
1cc10 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20  .** a new entry 
1cc20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
1cc30 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65  d on the extreme
1cc40 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68   right-end of th
1cc50 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74  e.** tree, in ot
1cc60 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20  her words, when 
1cc70 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  the new entry wi
1cc80 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61  ll become the la
1cc90 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69  rgest.** entry i
1cca0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  n the tree..**.*
1ccb0 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79  * Instead of try
1ccc0 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ing balance the 
1ccd0 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
1cce0 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
1ccf0 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
1cd00 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
1cd10 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
1cd20 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
1cd30 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
1cd40 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
1cd50 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
1cd60 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
1cd70 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
1cd80 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
1cd90 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
1cda0 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
1cdb0 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
1cdc0 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
1cdd0 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
1cde0 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
1cdf0 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
1ce00 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
1ce10 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
1ce20 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
1ce30 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
1ce40 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
1ce50 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
1ce60 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
1ce70 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
1ce80 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
1ce90 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
1cea0 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
1ceb0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
1cec0 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
1ced0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
1cee0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50  lance_quick(MemP
1cef0 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50  age *pPage, MemP
1cf00 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20  age *pParent){. 
1cf10 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
1cf20 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f  ge *pNew;.  Pgno
1cf30 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a   pgnoNew;.  u8 *
1cf40 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a 43  pCell;.  int szC
1cf50 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  ell;.  CellInfo 
1cf60 69 6e 66 6f 3b 0a 20 20 42 74 72 65 65 20 2a 70  info;.  Btree *p
1cf70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1cf80 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78  .  int parentIdx
1cf90 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   = pParent->nCel
1cfa0 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20  l;   /* pParent 
1cfb0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
1cfc0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
1cfd0 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20  parentSize;     
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cff0 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76   Size of new div
1d000 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75  ider cell */.  u
1d010 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d  8 parentCell[64]
1d020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d030 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68   /* Space for th
1d040 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
1d050 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ll */..  /* Allo
1d060 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e  cate a new page.
1d070 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72   Insert the over
1d080 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70  flow cell from p
1d090 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69  Page.  ** into i
1d0a0 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74  t. Then remove t
1d0b0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
1d0c0 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a   from pPage..  *
1d0d0 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  /.  rc = allocat
1d0e0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
1d0f0 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30  , &pgnoNew, 0, 0
1d100 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1d110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1d120 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
1d130 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f  Cell = pPage->aO
1d140 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20  vfl[0].pCell;.  
1d150 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a  szCell = cellSiz
1d160 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
1d170 6c 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  l);.  zeroPage(p
1d180 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  New, pPage->aDat
1d190 61 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c  a[0]);.  assembl
1d1a0 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26  ePage(pNew, 1, &
1d1b0 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b  pCell, &szCell);
1d1c0 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
1d1d0 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  low = 0;..  /* S
1d1e0 65 74 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  et the parent of
1d1f0 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63   the newly alloc
1d200 61 74 65 64 20 70 61 67 65 20 74 6f 20 70 50 61  ated page to pPa
1d210 72 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d  rent. */.  pNew-
1d220 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65  >pParent = pPare
1d230 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67  nt;.  sqlite3pag
1d240 65 72 5f 72 65 66 28 70 50 61 72 65 6e 74 2d 3e  er_ref(pParent->
1d250 61 44 61 74 61 29 3b 0a 0a 20 20 2f 2a 20 70 50  aData);..  /* pP
1d260 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
1d270 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
1d280 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61   of pParent. Cha
1d290 6e 67 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f  nge this.  ** so
1d2a0 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d   that the right-
1d2b0 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77  child is the new
1d2c0 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20   page allocated 
1d2d0 61 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70  above and.  ** p
1d2e0 50 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74  Page is the next
1d2f0 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e  -to-right child.
1d300 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
1d310 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
1d320 29 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74  );.  parseCellPt
1d330 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  r(pPage, findCel
1d340 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  l(pPage, pPage->
1d350 6e 43 65 6c 6c 2d 31 29 2c 20 26 69 6e 66 6f 29  nCell-1), &info)
1d360 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43  ;.  rc = fillInC
1d370 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72  ell(pParent, par
1d380 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f  entCell, 0, info
1d390 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 26 70 61  .nKey, 0, 0, &pa
1d3a0 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69 66 28  rentSize);.  if(
1d3b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d3c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1d3d0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1d3e0 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a  arentSize<64 );.
1d3f0 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
1d400 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  l(pParent, paren
1d410 74 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c  tIdx, parentCell
1d420 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c  , parentSize, 0,
1d430 20 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   4);.  if( rc!=S
1d440 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d450 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1d460 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
1d470 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
1d480 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70  nt,parentIdx), p
1d490 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70  Page->pgno);.  p
1d4a0 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
1d4b0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
1d4c0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
1d4d0 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65  gnoNew);..#ifnde
1d4e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d4f0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66  TOVACUUM.  /* If
1d500 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
1d510 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1d520 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
1d530 6e 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69  nter map.  ** wi
1d540 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  th entries for t
1d550 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64  he new page, and
1d560 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f   any pointer fro
1d570 6d 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c  m the .  ** cell
1d580 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
1d590 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1d5a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
1d5b0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1d5c0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
1d5d0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
1d5e0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1d5f0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
1d600 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d610 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1d620 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1d630 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
1d640 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a  tOvfl(pNew, 0);.
1d650 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d660 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1d670 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1d680 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1d690 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
1d6a0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
1d6b0 77 20 70 61 67 65 20 61 6e 64 20 62 61 6c 61 6e  w page and balan
1d6c0 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
1d6d0 67 65 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65  ge,.  ** in case
1d6e0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
1d6f0 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75 73 65  l inserted cause
1d700 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f  d it to become o
1d710 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  verfull..  */.  
1d720 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
1d730 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 61 6c 61  );.  return bala
1d740 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b  nce(pParent, 0);
1d750 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1d760 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
1d770 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  LANCE */../*.** 
1d780 54 68 65 20 49 53 41 55 54 4f 56 41 43 55 55 4d  The ISAUTOVACUUM
1d790 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 77   macro is used w
1d7a0 69 74 68 69 6e 20 62 61 6c 61 6e 63 65 5f 6e 6f  ithin balance_no
1d7b0 6e 72 6f 6f 74 28 29 20 74 6f 20 64 65 74 65 72  nroot() to deter
1d7c0 6d 69 6e 65 0a 2a 2a 20 69 66 20 74 68 65 20 64  mine.** if the d
1d7d0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
1d7e0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 72 20   auto-vacuum or 
1d7f0 6e 6f 74 2e 20 42 65 63 61 75 73 65 20 69 74 20  not. Because it 
1d800 69 73 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 69  is used.** withi
1d810 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
1d820 74 68 61 74 20 69 73 20 61 6e 20 61 72 67 75 6d  that is an argum
1d830 65 6e 74 20 74 6f 20 61 6e 6f 74 68 65 72 20 6d  ent to another m
1d840 61 63 72 6f 20 0a 2a 2a 20 28 73 71 6c 69 74 65  acro .** (sqlite
1d850 4d 61 6c 6c 6f 63 52 61 77 29 2c 20 69 74 20 69  MallocRaw), it i
1d860 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
1d870 6f 20 75 73 65 20 63 6f 6e 64 69 74 69 6f 6e 61  o use conditiona
1d880 6c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a  l compilation..*
1d890 2a 20 53 6f 2c 20 74 68 69 73 20 6d 61 63 72 6f  * So, this macro
1d8a0 20 69 73 20 64 65 66 69 6e 65 64 20 69 6e 73 74   is defined inst
1d8b0 65 61 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ead..*/.#ifndef 
1d8c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1d8d0 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20 49  VACUUM.#define I
1d8e0 53 41 55 54 4f 56 41 43 55 55 4d 20 28 70 42 74  SAUTOVACUUM (pBt
1d8f0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 0a 23 65  ->autoVacuum).#e
1d900 6c 73 65 0a 23 64 65 66 69 6e 65 20 49 53 41 55  lse.#define ISAU
1d910 54 4f 56 41 43 55 55 4d 20 30 0a 23 65 6e 64 69  TOVACUUM 0.#endi
1d920 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
1d930 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
1d940 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  tes Cells on pPa
1d950 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a  ge and up to NN*
1d960 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66  2 siblings.** of
1d970 20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61   pPage so that a
1d980 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62  ll pages have ab
1d990 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f  out the same amo
1d9a0 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63  unt of free spac
1d9b0 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e  e..** Usually NN
1d9c0 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
1d9d0 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
1d9e0 65 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65  e is used in the
1d9f0 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74   balancing,.** t
1da00 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69  hough more sibli
1da10 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66  ngs might come f
1da20 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20  rom one side if 
1da30 70 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72  pPage is the fir
1da40 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68  st.** or last ch
1da50 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
1da60 74 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73  t.  If pPage has
1da70 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e   fewer than 2*NN
1da80 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f   siblings.** (so
1da90 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
1daa0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
1dab0 20 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f   pPage is the ro
1dac0 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a  ot page or a .**
1dad0 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20   child of root) 
1dae0 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62  then all availab
1daf0 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74  le siblings part
1db00 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
1db10 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
1db20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
1db30 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20  blings of pPage 
1db40 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
1db50 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ed or decreased 
1db60 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f  by one or.** two
1db70 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   in an effort to
1db80 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72   keep pages near
1db90 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20  ly full but not 
1dba0 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72  over full. The r
1dbb0 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73  oot page.** is s
1dbc0 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c  pecial and is al
1dbd0 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72  lowed to be near
1dbe0 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61  ly empty. If pPa
1dbf0 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f  ge is .** the ro
1dc00 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
1dc10 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74  e depth of the t
1dc20 72 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  ree might be inc
1dc30 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63  reased.** or dec
1dc40 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61  reased by one, a
1dc50 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20  s necessary, to 
1dc60 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61  keep the root pa
1dc70 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ge from being.**
1dc80 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d   overfull or com
1dc90 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a  pletely empty..*
1dca0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
1dcb0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1dcc0 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
1dcd0 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e   of the Cells on
1dce0 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20   pPage.** might 
1dcf0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
1dd00 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d  stored in pPage-
1dd10 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20  >aData[].  This 
1dd20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66  can happen.** if
1dd30 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65   the page is ove
1dd40 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20  rfull.  Part of 
1dd50 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  the job of this 
1dd60 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a  routine is to.**
1dd70 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43   make sure all C
1dd80 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f  ells for pPage o
1dd90 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e  nce again fit in
1dda0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
1ddb0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f  .**.** In the co
1ddc0 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e  urse of balancin
1ddd0 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f  g the siblings o
1dde0 66 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72  f pPage, the par
1ddf0 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20  ent of pPage.** 
1de00 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65  might become ove
1de10 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
1de20 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70  ll.  If that hap
1de30 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20  pens, then this 
1de40 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
1de50 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
1de60 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a   on the parent..
1de70 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
1de80 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
1de90 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
1dea0 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
1deb0 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
1dec0 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
1ded0 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
1dee0 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20  tine fails, the 
1def0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a  database should.
1df00 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ** be rolled bac
1df10 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
1df20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
1df30 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1df40 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
1df50 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
1df60 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
1df70 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 72  f pPage */.  Btr
1df80 65 65 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ee *pBt;        
1df90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dfa0 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
1dfb0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  */.  int nCell =
1dfc0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1dfd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1dfe0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
1dff0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
1e000 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lls = 0;        
1e010 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
1e020 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20  size of apCell, 
1e030 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a  szCell, aFrom. *
1e040 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20  /.  int nOld;   
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e060 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1e070 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  ges in apOld[] *
1e080 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20  /.  int nNew;   
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1e0b0 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  ges in apNew[] *
1e0c0 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20  /.  int nDiv;   
1e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
1e0f0 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a  lls in apDiv[] *
1e100 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  /.  int i, j, k;
1e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e120 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1e130 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20  s */.  int idx; 
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e150 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1e160 70 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74  pPage in pParent
1e170 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
1e180 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
1e190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e1a0 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
1e1b0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
1e1c0 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
1e1d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e1e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
1e1f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1e200 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  nt leafCorrectio
1e210 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
1e220 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
1e230 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
1e240 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
1e250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e260 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
1e270 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
1e280 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
1e290 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
1e2a0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
1e2b0 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
1e2c0 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
1e2d0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
1e2e0 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
1e2f0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1e300 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
1e310 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
1e320 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
1e330 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
1e340 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
1e350 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
1e360 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 20 3d  /.  int iSpace =
1e370 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e380 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
1e390 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 5b   byte of aSpace[
1e3a0 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ] */.  MemPage *
1e3b0 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  apOld[NB];      
1e3c0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
1e3d0 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69   up to two sibli
1e3e0 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ngs */.  Pgno pg
1e3f0 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  noOld[NB];      
1e400 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
1e410 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70  mbers for each p
1e420 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  age in apOld[] *
1e430 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
1e440 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
1e450 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
1e460 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
1e470 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
1e480 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
1e490 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
1e4a0 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
1e4b0 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
1e4c0 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  cing */.  Pgno p
1e4d0 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  gnoNew[NB+2];   
1e4e0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
1e4f0 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20  umbers for each 
1e500 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20  page in apNew[] 
1e510 2a 2f 0a 20 20 69 6e 74 20 69 64 78 44 69 76 5b  */.  int idxDiv[
1e520 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  NB];            
1e530 20 20 2f 2a 20 49 6e 64 69 63 65 73 20 6f 66 20    /* Indices of 
1e540 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
1e550 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38   pParent */.  u8
1e560 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20   *apDiv[NB];    
1e570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
1e580 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
1e590 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
1e5a0 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
1e5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1e5c0 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
1e5d0 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
1e5e0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
1e5f0 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
1e600 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
1e610 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
1e620 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
1e630 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
1e640 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
1e650 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
1e660 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
1e670 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65  d */.  int *szCe
1e680 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1e690 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
1e6a0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
1e6b0 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
1e6c0 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20  u8 *aCopy[NB];  
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e6e0 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e  Space for holdin
1e6f0 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79  g data of apCopy
1e700 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  [] */.  u8 *aSpa
1e710 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
1e720 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
1e730 20 68 6f 6c 64 20 63 6f 70 69 65 73 20 6f 66 20   hold copies of 
1e740 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a  dividers cells *
1e750 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1e760 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1e770 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30  .  u8 *aFrom = 0
1e780 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 0a  ;.#endif..  /* .
1e790 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61    ** Find the pa
1e7a0 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  rent page..  */.
1e7b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1e7c0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
1e7d0 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65  ert( sqlite3page
1e7e0 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70 50  r_iswriteable(pP
1e7f0 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20  age->aData) );. 
1e800 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
1e810 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70  t;.  pParent = p
1e820 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
1e830 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1e840 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 61 44 61  ite(pParent->aDa
1e850 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ta);.  assert( p
1e860 50 61 72 65 6e 74 20 29 3b 0a 20 20 54 52 41 43  Parent );.  TRAC
1e870 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67  E(("BALANCE: beg
1e880 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64  in page %d child
1e890 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   of %d\n", pPage
1e8a0 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d  ->pgno, pParent-
1e8b0 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65  >pgno));..#ifnde
1e8c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
1e8d0 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a  ICKBALANCE.  /*.
1e8e0 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63    ** A special c
1e8f0 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65  ase:  If a new e
1e900 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65  ntry has just be
1e910 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
1e920 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74   a.  ** table (t
1e930 68 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20  hat is, a btree 
1e940 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79  with integer key
1e950 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61  s and all data a
1e960 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20  t the leaves).  
1e970 2a 2a 20 61 6e 20 74 68 65 20 6e 65 77 20 65 6e  ** an the new en
1e980 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  try is the right
1e990 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74  -most entry in t
1e9a0 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73 20  he tree (it has 
1e9b0 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  the.  ** largest
1e9c0 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20 74   key) then use t
1e9d0 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e  he special balan
1e9e0 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69  ce_quick() routi
1e9f0 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61  ne for.  ** bala
1ea00 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f  ncing.  balance_
1ea10 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20  quick() is much 
1ea20 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c  faster and resul
1ea30 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a  ts in a tighter.
1ea40 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20    ** packing of 
1ea50 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d  data in the comm
1ea60 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  on case..  */.  
1ea70 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
1ea80 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
1ea90 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20  intKey &&.      
1eaa0 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
1eab0 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
1eac0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a  nOverflow==1 &&.
1ead0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76        pPage->aOv
1eae0 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65  fl[0].idx==pPage
1eaf0 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20  ->nCell &&.     
1eb00 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d   pPage->pParent-
1eb10 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20  >pgno!=1 &&.    
1eb20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72    get4byte(&pPar
1eb30 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
1eb40 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
1eb50 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  )==pPage->pgno. 
1eb60 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
1eb70 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68  * TODO: Check th
1eb80 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68  e siblings to th
1eb90 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e  e left of pPage.
1eba0 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a   It may be that.
1ebb0 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20      ** they are 
1ebc0 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20  not full and no 
1ebd0 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75  new page is requ
1ebe0 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
1ebf0 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f   return balance_
1ec00 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50 61  quick(pPage, pPa
1ec10 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rent);.  }.#endi
1ec20 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
1ec30 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68  d the cell in th
1ec40 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 68  e parent page wh
1ec50 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70  ose left child p
1ec60 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20  oints back.  ** 
1ec70 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20 22  to pPage.  The "
1ec80 69 64 78 22 20 76 61 72 69 61 62 6c 65 20 69 73  idx" variable is
1ec90 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
1eca0 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61  at cell.  If pPa
1ecb0 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72  ge.  ** is the r
1ecc0 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f  ightmost child o
1ecd0 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73  f pParent then s
1ece0 65 74 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e  et idx to pParen
1ecf0 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20  t->nCell .  */. 
1ed00 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 69 64   if( pParent->id
1ed10 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20 50 67  xShift ){.    Pg
1ed20 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e  no pgno;.    pgn
1ed30 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
1ed40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
1ed50 6f 3d 3d 73 71 6c 69 74 65 33 70 61 67 65 72 5f  o==sqlite3pager_
1ed60 70 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  pagenumber(pPage
1ed70 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 20 20  ->aData) );.    
1ed80 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 70  for(idx=0; idx<p
1ed90 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69  Parent->nCell; i
1eda0 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  dx++){.      if(
1edb0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
1edc0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 64 78 29  ll(pParent, idx)
1edd0 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20  )==pgno ){.     
1ede0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1edf0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1ee00 72 74 28 20 69 64 78 3c 70 50 61 72 65 6e 74 2d  rt( idx<pParent-
1ee10 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20  >nCell.         
1ee20 20 20 20 20 7c 7c 20 67 65 74 34 62 79 74 65 28      || get4byte(
1ee30 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
1ee40 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
1ee50 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a  et+8])==pgno );.
1ee60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78    }else{.    idx
1ee70 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72   = pPage->idxPar
1ee80 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ent;.  }..  /*. 
1ee90 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 76   ** Initialize v
1eea0 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68 61 74  ariables so that
1eeb0 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61 66 65   it will be safe
1eec0 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69   to jump.  ** di
1eed0 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63  rectly to balanc
1eee0 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61 6e 79  e_cleanup at any
1eef0 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20   moment..  */.  
1ef00 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b  nOld = nNew = 0;
1ef10 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
1ef20 72 65 66 28 70 50 61 72 65 6e 74 2d 3e 61 44 61  ref(pParent->aDa
1ef30 74 61 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ta);..  /*.  ** 
1ef40 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67  Find sibling pag
1ef50 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20  es to pPage and 
1ef60 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
1ef70 72 65 6e 74 20 74 68 61 74 20 64 69 76 69 64 65  rent that divide
1ef80 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e  .  ** the siblin
1ef90 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20  gs.  An attempt 
1efa0 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
1efb0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
1efc0 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20  ither.  ** side 
1efd0 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20  of pPage.  More 
1efe0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
1eff0 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
1f000 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20  , however, if.  
1f010 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65 20 61  ** pPage there a
1f020 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e  re fewer than NN
1f030 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65   siblings on the
1f040 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49 66   other side.  If
1f050 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
1f060 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
1f070 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
1f080 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
1f090 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20  ent are taken.. 
1f0a0 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64   */.  nxDiv = id
1f0b0 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78  x - NN;.  if( nx
1f0c0 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65  Div + NB > pPare
1f0d0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
1f0e0 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74   nxDiv = pParent
1f0f0 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31  ->nCell - NB + 1
1f100 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69  ;.  }.  if( nxDi
1f110 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  v<0 ){.    nxDiv
1f120 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76   = 0;.  }.  nDiv
1f130 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 0;.  for(i=0,
1f140 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20   k=nxDiv; i<NB; 
1f150 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69  i++, k++){.    i
1f160 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43  f( k<pParent->nC
1f170 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 64 78  ell ){.      idx
1f180 44 69 76 5b 69 5d 20 3d 20 6b 3b 0a 20 20 20 20  Div[i] = k;.    
1f190 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e    apDiv[i] = fin
1f1a0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b  dCell(pParent, k
1f1b0 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b  );.      nDiv++;
1f1c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1f1d0 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b  pParent->leaf );
1f1e0 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69  .      pgnoOld[i
1f1f0 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  ] = get4byte(apD
1f200 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  iv[i]);.    }els
1f210 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74  e if( k==pParent
1f220 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
1f230 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65   pgnoOld[i] = ge
1f240 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
1f250 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
1f260 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
1f270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f280 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f290 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
1f2a0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c  Page(pBt, pgnoOl
1f2b0 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c  d[i], &apOld[i],
1f2c0 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69   pParent);.    i
1f2d0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
1f2e0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
1f2f0 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50    apOld[i]->idxP
1f300 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61  arent = k;.    a
1f310 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20  pCopy[i] = 0;.  
1f320 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c    assert( i==nOl
1f330 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b  d );.    nOld++;
1f340 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b  .    nMaxCells +
1f350 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43  = 1+apOld[i]->nC
1f360 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f  ell+apOld[i]->nO
1f370 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20  verflow;.  }..  
1f380 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c  /* Make nMaxCell
1f390 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  s a multiple of 
1f3a0 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  2 in order to pr
1f3b0 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20  eserve 8-byte.  
1f3c0 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a  ** alignment */.
1f3d0 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e    nMaxCells = (n
1f3e0 4d 61 78 43 65 6c 6c 73 20 2b 20 31 29 26 7e 31  MaxCells + 1)&~1
1f3f0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
1f400 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
1f410 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
1f420 73 0a 20 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20  s.  */.  apCell 
1f430 3d 20 28 75 38 20 2a 2a 29 73 71 6c 69 74 65 4d  = (u8 **)sqliteM
1f440 61 6c 6c 6f 63 52 61 77 28 20 0a 20 20 20 20 20  allocRaw( .     
1f450 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65    nMaxCells*size
1f460 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20  of(u8*)         
1f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f480 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20    /* apCell */. 
1f490 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a      + nMaxCells*
1f4a0 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20 20 20  sizeof(int)     
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4c0 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20        /* szCell 
1f4d0 2a 2f 0a 20 20 20 20 20 2b 20 52 4f 55 4e 44 38  */.     + ROUND8
1f4e0 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
1f4f0 29 2a 4e 42 20 20 20 20 20 20 20 20 20 20 20 20  )*NB            
1f500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 43 6f            /* aCo
1f510 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  py */.     + pBt
1f520 2d 3e 70 61 67 65 53 69 7a 65 2a 28 35 2b 4e 42  ->pageSize*(5+NB
1f530 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f550 61 53 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 2b  aSpace */.     +
1f560 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d 20 3f   (ISAUTOVACUUM ?
1f570 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29 20   nMaxCells : 0) 
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 29   /* aFrom */.  )
1f5a0 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d  ;.  if( apCell==
1f5b0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
1f5c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1f5d0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
1f5e0 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65  anup;.  }.  szCe
1f5f0 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43 65  ll = (int*)&apCe
1f600 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
1f610 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a   aCopy[0] = (u8*
1f620 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&szCell[nMaxCel
1f630 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ls];.  assert( (
1f640 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a  (aCopy[0] - (u8*
1f650 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30  )apCell) & 7)==0
1f660 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c   ); /* 8-byte al
1f670 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64  ignment required
1f680 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   */.  for(i=1; i
1f690 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  <NB; i++){.    a
1f6a0 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79  Copy[i] = &aCopy
1f6b0 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53  [i-1][pBt->pageS
1f6c0 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ize+ROUND8(sizeo
1f6d0 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20  f(MemPage))];.  
1f6e0 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70    assert( ((aCop
1f6f0 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70 43 65  y[i] - (u8*)apCe
1f700 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  ll) & 7)==0 ); /
1f710 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
1f720 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  nt required */. 
1f730 20 7d 0a 20 20 61 53 70 61 63 65 20 3d 20 26 61   }.  aSpace = &a
1f740 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e  Copy[NB-1][pBt->
1f750 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28  pageSize+ROUND8(
1f760 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
1f770 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61  ];.  assert( ((a
1f780 53 70 61 63 65 20 2d 20 28 75 38 2a 29 61 70 43  Space - (u8*)apC
1f790 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
1f7a0 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
1f7b0 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
1f7c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f7d0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f7e0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1f7f0 63 75 75 6d 20 29 7b 0a 20 20 20 20 61 46 72 6f  cuum ){.    aFro
1f800 6d 20 3d 20 26 61 53 70 61 63 65 5b 35 2a 70 42  m = &aSpace[5*pB
1f810 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
1f820 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a  }.#endif.  .  /*
1f830 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65  .  ** Make copie
1f840 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  s of the content
1f850 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69 74   of pPage and it
1f860 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20  s siblings into 
1f870 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65  aOld[]..  ** The
1f880 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
1f890 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
1f8a0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
1f8b0 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a 2a  pies rather.  **
1f8c0 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
1f8d0 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
1f8e0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
1f8f0 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
1f900 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66  .  ** process of
1f910 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
1f920 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  en..  */.  for(i
1f930 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
1f940 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
1f950 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28   = apCopy[i] = (
1f960 4d 65 6d 50 61 67 65 2a 29 26 61 43 6f 70 79 5b  MemPage*)&aCopy[
1f970 69 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  i][pBt->pageSize
1f980 5d 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20  ];.    p->aData 
1f990 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70 42 74  = &((u8*)p)[-pBt
1f9a0 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20  ->pageSize];.   
1f9b0 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61   memcpy(p->aData
1f9c0 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74  , apOld[i]->aDat
1f9d0 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  a, pBt->pageSize
1f9e0 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67   + sizeof(MemPag
1f9f0 65 29 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  e));.    /* The 
1fa00 6d 65 6d 63 70 79 28 29 20 61 62 6f 76 65 20 63  memcpy() above c
1fa10 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
1fa20 20 6f 66 20 70 2d 3e 61 44 61 74 61 20 73 6f 20   of p->aData so 
1fa30 77 65 20 68 61 76 65 20 74 6f 0a 20 20 20 20 2a  we have to.    *
1fa40 2a 20 73 65 74 20 69 74 20 61 67 61 69 6e 2e 20  * set it again. 
1fa50 2a 2f 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20  */.    p->aData 
1fa60 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70 42 74  = &((u8*)p)[-pBt
1fa70 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d  ->pageSize];.  }
1fa80 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
1fa90 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
1faa0 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
1fab0 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
1fac0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
1fad0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
1fae0 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
1faf0 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
1fb00 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
1fb10 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
1fb20 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 6f 72  ace obtained for
1fb30 6d 20 61 53 70 61 63 65 5b 5d 20 61 6e 64 20 72  m aSpace[] and r
1fb40 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64 69  emove the the di
1fb50 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a  vider Cells.  **
1fb60 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20   from pParent.. 
1fb70 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
1fb80 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20  siblings are on 
1fb90 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e  leaf pages, then
1fba0 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74   the child point
1fbb0 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ers of the.  ** 
1fbc0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72  divider cells ar
1fbd0 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20  e stripped from 
1fbe0 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  the cells before
1fbf0 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64   they are copied
1fc00 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63  .  ** into aSpac
1fc10 65 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61  e[].  In this wa
1fc20 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
1fc30 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74  apCell[] are wit
1fc40 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20  hout.  ** child 
1fc50 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69  pointers.  If si
1fc60 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
1fc70 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20  eaves, then all 
1fc80 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43  cell in.  ** apC
1fc90 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68  ell[] include ch
1fca0 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45  ild pointers.  E
1fcb0 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63  ither way, all c
1fcc0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
1fcd0 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e  .  ** are alike.
1fce0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43  .  **.  ** leafC
1fcf0 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66  orrection:  4 if
1fd00 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
1fd10 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73  .  0 if pPage is
1fd20 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a   not a leaf..  *
1fd30 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61  *       leafData
1fd40 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f  :  1 if pPage ho
1fd50 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64  lds key+data and
1fd60 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f   pParent holds o
1fd70 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20  nly keys..  */. 
1fd80 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65   nCell = 0;.  le
1fd90 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70  afCorrection = p
1fda0 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20  Page->leaf*4;.  
1fdb0 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61 67 65  leafData = pPage
1fdc0 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 70 50  ->leafData && pP
1fdd0 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 66 6f 72  age->leaf;.  for
1fde0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
1fdf0 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
1fe00 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69  *pOld = apCopy[i
1fe10 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74  ];.    int limit
1fe20 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70   = pOld->nCell+p
1fe30 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
1fe40 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
1fe50 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  imit; j++){.    
1fe60 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
1fe70 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
1fe80 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
1fe90 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
1fea0 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20  ell(pOld, j);.  
1feb0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
1fec0 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
1fed0 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65  pOld, apCell[nCe
1fee0 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ll]);.#ifndef SQ
1fef0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1ff00 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
1ff10 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1ff20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 3b  {.        int a;
1ff30 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e  .        aFrom[n
1ff40 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20  Cell] = i;.     
1ff50 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f     for(a=0; a<pO
1ff60 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61  ld->nOverflow; a
1ff70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1ff80 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61  f( pOld->aOvfl[a
1ff90 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b  ].pCell==apCell[
1ffa0 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20  nCell] ){.      
1ffb0 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
1ffc0 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20  l] = 0xFF;.     
1ffd0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1ffe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fff0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
20000 69 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  if.      nCell++
20010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20020 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20  i<nOld-1 ){.    
20030 20 20 69 6e 74 20 73 7a 20 3d 20 63 65 6c 6c 53    int sz = cellS
20040 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
20050 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
20060 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
20070 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74 68  .        /* With
20080 20 74 68 65 20 4c 45 41 46 44 41 54 41 20 66 6c   the LEAFDATA fl
20090 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65 6c 6c  ag, pParent cell
200a0 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b  s hold only INTK
200b0 45 59 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  EYs that.       
200c0 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63 61 74   ** are duplicat
200d0 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68  es of keys on th
200e0 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e 20 20  e child pages.  
200f0 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76  We need to remov
20100 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
20110 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
20120 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62 75 74  rom pParent, but
20130 20 74 68 65 20 64 69 76 69 64 65 72 73 20 63 65   the dividers ce
20140 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20 20 20  lls are not.    
20150 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20      ** added to 
20160 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65  apCell[] because
20170 20 74 68 65 79 20 61 72 65 20 64 75 70 6c 69 63   they are duplic
20180 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20 63 65  ates of child ce
20190 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lls..        */.
201a0 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
201b0 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
201c0 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   sz);.      }els
201d0 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  e{.        u8 *p
201e0 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  Temp;.        as
201f0 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
20200 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20  Cells );.       
20210 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
20220 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70 54 65   sz;.        pTe
20230 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70  mp = &aSpace[iSp
20240 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 53  ace];.        iS
20250 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  pace += sz;.    
20260 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
20270 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce<=pBt->pageSiz
20280 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  e*5 );.        m
20290 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44  emcpy(pTemp, apD
202a0 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  iv[i], sz);.    
202b0 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
202c0 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f  ] = pTemp+leafCo
202d0 72 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e 64 65  rrection;.#ifnde
202e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
202f0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20  TOVACUUM.       
20300 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
20310 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
20320 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
20330 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d   0xFF;.        }
20340 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
20350 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
20360 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20  , nxDiv, sz);.  
20370 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
20380 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72 72 65  ll] -= leafCorre
20390 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61  ction;.        a
203a0 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
203b0 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b  pTemp)==pgnoOld[
203c0 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  i] );.        if
203d0 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b  ( !pOld->leaf ){
203e0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
203f0 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
20400 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
20410 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70    /* The right p
20420 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
20430 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65  ild page pOld be
20440 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20  comes the left. 
20450 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
20460 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64  ter of the divid
20470 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20  er cell */.     
20480 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65       memcpy(apCe
20490 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64  ll[nCell], &pOld
204a0 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64  ->aData[pOld->hd
204b0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a  rOffset+8], 4);.
204c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
204d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
204e0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
204f0 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  =4 );.        }.
20500 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b          nCell++;
20510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20520 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
20530 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d  gure out the num
20540 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65  ber of pages nee
20550 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ded to hold all 
20560 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  nCell cells..  *
20570 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d  * Store this num
20580 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73  ber in "k".  Als
20590 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b  o compute szNew[
205a0 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  ] which is the t
205b0 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  otal.  ** size o
205c0 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74  f all cells on t
205d0 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64  he i-th page and
205e0 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20   cntNew[] which 
205f0 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  is the index.  *
20600 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66  * in apCell[] of
20610 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64   the cell that d
20620 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72  ivides page i fr
20630 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20  om page i+1.  . 
20640 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68   ** cntNew[k] sh
20650 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c  ould equal nCell
20660 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75  ..  **.  ** Valu
20670 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  es computed by t
20680 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a  his block:.  **.
20690 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b    **           k
206a0 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  : The total numb
206b0 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61  er of sibling pa
206c0 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65  ges.  **    szNe
206d0 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65  w[i]: Spaced use
206e0 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69  d on the i-th si
206f0 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
20700 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e     cntNew[i]: In
20710 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  dex in apCell[] 
20720 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72  and szCell[] for
20730 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
20740 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  to.  **         
20750 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f       the right o
20760 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  f the i-th sibli
20770 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73  ng page..  ** us
20780 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65  ableSpace: Numbe
20790 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
207a0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  ace available on
207b0 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20   each sibling.. 
207c0 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62   ** .  */.  usab
207d0 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75  leSpace = pBt->u
207e0 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b  sableSize - 12 +
207f0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
20800 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d  .  for(subtotal=
20810 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  k=i=0; i<nCell; 
20820 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
20830 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( i<nMaxCells );
20840 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d  .    subtotal +=
20850 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a   szCell[i] + 2;.
20860 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c      if( subtotal
20870 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29   > usableSpace )
20880 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d  {.      szNew[k]
20890 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a   = subtotal - sz
208a0 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Cell[i];.      c
208b0 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20  ntNew[k] = i;.  
208c0 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
208d0 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
208e0 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20   subtotal = 0;. 
208f0 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a       k++;.    }.
20900 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
20910 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
20920 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
20930 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
20940 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
20950 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
20960 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
20970 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
20980 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
20990 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
209a0 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
209b0 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
209c0 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
209d0 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
209e0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
209f0 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
20a00 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
20a10 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
20a20 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
20a30 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
20a40 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
20a50 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
20a60 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
20a70 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
20a80 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
20a90 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
20aa0 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
20ab0 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
20ac0 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
20ad0 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
20ae0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
20af0 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
20b00 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
20b10 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
20b20 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
20b30 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
20b40 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
20b50 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
20b60 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
20b70 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
20b80 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
20b90 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
20ba0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
20bb0 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
20bc0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
20bd0 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
20be0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
20bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20c00 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
20c10 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
20c20 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
20c30 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
20c40 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
20c50 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
20c60 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
20c70 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
20c80 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
20c90 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
20ca0 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
20cb0 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
20cc0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
20cd0 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
20ce0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
20cf0 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69  Right==0 || szRi
20d00 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c  ght+szCell[d]+2<
20d10 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b  =szLeft-(szCell[
20d20 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73  r]+2) ){.      s
20d30 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c  zRight += szCell
20d40 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  [d] + 2;.      s
20d50 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b  zLeft -= szCell[
20d60 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e  r] + 2;.      cn
20d70 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20  tNew[i-1]--;.   
20d80 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
20d90 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20  1] - 1;.      d 
20da0 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
20db0 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ta;.    }.    sz
20dc0 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74  New[i] = szRight
20dd0 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d  ;.    szNew[i-1]
20de0 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 20   = szLeft;.  }. 
20df0 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b   assert( cntNew[
20e00 30 5d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20  0]>0 );..  /*.  
20e10 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
20e20 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
20e30 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
20e40 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
20e50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
20e60 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65  pgno>1 );.  page
20e70 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61  Flags = pPage->a
20e80 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69  Data[0];.  for(i
20e90 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
20ea0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
20eb0 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  ;.    if( i<nOld
20ec0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
20ed0 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c   apNew[i] = apOl
20ee0 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  d[i];.      pgno
20ef0 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64  New[i] = pgnoOld
20f00 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64  [i];.      apOld
20f10 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  [i] = 0;.      r
20f20 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
20f30 5f 77 72 69 74 65 28 70 4e 65 77 2d 3e 61 44 61  _write(pNew->aDa
20f40 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ta);.      if( r
20f50 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
20f60 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65  _cleanup;.    }e
20f70 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
20f80 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  allocatePage(pBt
20f90 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
20fa0 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d  w[i], pgnoNew[i-
20fb0 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  1], 0);.      if
20fc0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
20fd0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
20fe0 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e     apNew[i] = pN
20ff0 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4e  ew;.    }.    nN
21000 65 77 2b 2b 3b 0a 20 20 20 20 7a 65 72 6f 50 61  ew++;.    zeroPa
21010 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61  ge(pNew, pageFla
21020 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  gs);.  }..  /* F
21030 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65  ree any old page
21040 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20  s that were not 
21050 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61  reused as new pa
21060 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ges..  */.  whil
21070 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  e( i<nOld ){.   
21080 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 61   rc = freePage(a
21090 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
210a0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
210b0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
210c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
210d0 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c  ld[i]);.    apOl
210e0 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b  d[i] = 0;.    i+
210f0 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  +;.  }..  /*.  *
21100 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61  * Put the new pa
21110 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
21120 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65   order.  This he
21130 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  lps to.  ** keep
21140 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
21150 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64  disk file in ord
21160 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61  er so that a sca
21170 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  n.  ** of the ta
21180 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20  ble is a linear 
21190 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
211a0 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a   file.  That.  *
211b0 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20  * in turn helps 
211c0 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
211d0 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20  stem to deliver 
211e0 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  pages.  ** from 
211f0 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61  the disk more ra
21200 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pidly..  **.  **
21210 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72   An O(n^2) inser
21220 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69  tion sort algori
21230 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74  thm is used, but
21240 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73   since.  ** n is
21250 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
21260 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e   NB (a small con
21270 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f  stant), that sho
21280 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  uld.  ** not be 
21290 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a  a problem..  **.
212a0 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c    ** When NB==3,
212b0 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69   this one optimi
212c0 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65  zation makes the
212d0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
212e0 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20  bout 25% faster 
212f0 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74  for large insert
21300 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f  ions and deletio
21310 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
21320 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b  =0; i<k-1; i++){
21330 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20  .    int minV = 
21340 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  pgnoNew[i];.    
21350 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20  int minI = i;.  
21360 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b    for(j=i+1; j<k
21370 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
21380 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e  ( pgnoNew[j]<(un
21390 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20  signed)minV ){. 
213a0 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b         minI = j;
213b0 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20  .        minV = 
213c0 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20  pgnoNew[j];.    
213d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
213e0 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20  ( minI>i ){.    
213f0 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d    int t;.      M
21400 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20  emPage *pT;.    
21410 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d    t = pgnoNew[i]
21420 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e  ;.      pT = apN
21430 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e  ew[i];.      pgn
21440 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65  oNew[i] = pgnoNe
21450 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61  w[minI];.      a
21460 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b  pNew[i] = apNew[
21470 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e  minI];.      pgn
21480 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a  oNew[minI] = t;.
21490 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49        apNew[minI
214a0 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20  ] = pT;.    }.  
214b0 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  }.  TRACE(("BALA
214c0 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20  NCE: old: %d %d 
214d0 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20  %d  new: %d(%d) 
214e0 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
214f0 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a  (%d) %d(%d)\n",.
21500 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20      pgnoOld[0], 
21510 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70  .    nOld>=2 ? p
21520 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20  gnoOld[1] : 0,. 
21530 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e     nOld>=3 ? pgn
21540 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20  oOld[2] : 0,.   
21550 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e   pgnoNew[0], szN
21560 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e  ew[0],.    nNew>
21570 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20  =2 ? pgnoNew[1] 
21580 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73  : 0, nNew>=2 ? s
21590 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  zNew[1] : 0,.   
215a0 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e   nNew>=3 ? pgnoN
215b0 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[2] : 0, nNew>
215c0 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20  =3 ? szNew[2] : 
215d0 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f  0,.    nNew>=4 ?
215e0 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c   pgnoNew[3] : 0,
215f0 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77   nNew>=4 ? szNew
21600 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [3] : 0,.    nNe
21610 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34  w>=5 ? pgnoNew[4
21620 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f  ] : 0, nNew>=5 ?
21630 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b   szNew[4] : 0));
21640 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  /*.  ** Even
21650 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68  ly distribute th
21660 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c  e data in apCell
21670 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65  [] across the ne
21680 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e  w pages..  ** In
21690 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c  sert divider cel
216a0 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20  ls into pParent 
216b0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
216c0 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f  */.  j = 0;.  fo
216d0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
216e0 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65  ++){.    /* Asse
216f0 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62  mble the new sib
21700 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
21710 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
21720 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
21730 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
21740 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
21750 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70  t( pNew->pgno==p
21760 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20  gnoNew[i] );.   
21770 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
21780 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
21790 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
217a0 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
217b0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
217c0 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
217d0 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
217e0 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65  ow==0 );..#ifnde
217f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
21800 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20  TOVACUUM.    /* 
21810 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
21820 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
21830 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
21840 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
21850 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70  es.    ** that p
21860 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c  oint to the sibl
21870 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 20 72  ings that were r
21880 65 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65  earranged. These
21890 20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20   can be: left.  
218a0 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66    ** children of
218b0 20 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68   cells, the righ
218c0 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70  t-child of the p
218d0 61 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77  age, or overflow
218e0 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f   pages.    ** po
218f0 69 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c  inted to by cell
21900 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
21910 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
21920 6d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b  m ){.      for(k
21930 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b  =j; k<cntNew[i];
21940 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   k++){.        a
21950 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c  ssert( k<nMaxCel
21960 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ls );.        if
21970 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46  ( aFrom[k]==0xFF
21980 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d   || apCopy[aFrom
21990 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  [k]]->pgno!=pNew
219a0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
219b0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
219c0 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a  utOvfl(pNew, k-j
219d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
219e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
219f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
21a00 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
21a10 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  up;.          }.
21a20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21a30 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
21a40 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69      j = cntNew[i
21a50 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ];..    /* If th
21a60 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61  e sibling page a
21a70 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77  ssembled above w
21a80 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  as not the right
21a90 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20  -most sibling,. 
21aa0 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64     ** insert a d
21ab0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
21ac0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
21ad0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21ae0 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e   i<nNew-1 && j<n
21af0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38  Cell ){.      u8
21b00 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75   *pCell;.      u
21b10 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
21b20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61  int sz;..      a
21b30 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
21b40 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  ls );.      pCel
21b50 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20  l = apCell[j];. 
21b60 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c       sz = szCell
21b70 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63  [j] + leafCorrec
21b80 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  tion;.      if( 
21b90 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
21ba0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
21bb0 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
21bc0 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
21bd0 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
21be0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
21bf0 66 44 61 74 61 20 29 7b 0a 09 2f 2a 20 49 66 20  fData ){../* If 
21c00 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65  the tree is a le
21c10 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e  af-data tree, an
21c20 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  d the siblings a
21c30 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20  re leaves, .    
21c40 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
21c50 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20  e is no divider 
21c60 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  cell in apCell[]
21c70 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64  . Instead, the d
21c80 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20  ivider .        
21c90 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73  ** cell consists
21ca0 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
21cb0 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68  key for the righ
21cc0 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a  t-most cell of .
21cd0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
21ce0 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65  ibling-page asse
21cf0 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79  mbled above only
21d00 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
21d10 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
21d20 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b  fo;.        j--;
21d30 0a 20 20 20 20 20 20 20 20 70 61 72 73 65 43 65  .        parseCe
21d40 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  llPtr(pNew, apCe
21d50 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  ll[j], &info);. 
21d60 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26         pCell = &
21d70 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a  aSpace[iSpace];.
21d80 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e 43 65          fillInCe
21d90 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  ll(pParent, pCel
21da0 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  l, 0, info.nKey,
21db0 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20   0, 0, &sz);.   
21dc0 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73       iSpace += s
21dd0 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
21de0 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e  t( iSpace<=pBt->
21df0 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20  pageSize*5 );.  
21e00 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
21e10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21e20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
21e30 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
21e40 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65  = &aSpace[iSpace
21e50 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63  ];.        iSpac
21e60 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  e += sz;.       
21e70 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c   assert( iSpace<
21e80 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35  =pBt->pageSize*5
21e90 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
21ea0 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
21eb0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
21ec0 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65  , pCell, sz, pTe
21ed0 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66  mp, 4);.      if
21ee0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21ef0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
21f00 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70 75  leanup;.      pu
21f10 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
21f20 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
21f30 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67  nxDiv), pNew->pg
21f40 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  no);.#ifndef SQL
21f50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
21f60 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
21f70 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
21f80 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
21f90 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d   and not a leaf-
21fa0 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20  data tree,.     
21fb0 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20   ** then update 
21fc0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
21fd0 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f  with an entry fo
21fe0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
21ff0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  age.      ** tha
22000 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20  t the cell just 
22010 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20  inserted points 
22020 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  to (if any)..   
22030 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
22040 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
22050 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a  && !leafData ){.
22060 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
22070 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65  mapPutOvfl(pPare
22080 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20  nt, nxDiv);.    
22090 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
220a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
220b0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
220c0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
220d0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
220e0 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  f.      j++;.   
220f0 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20     nxDiv++;.    
22100 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
22110 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  j==nCell );.  if
22120 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50  ( (pageFlags & P
22130 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20  TF_LEAF)==0 ){. 
22140 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77     memcpy(&apNew
22150 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nNew-1]->aData[
22160 38 5d 2c 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64  8], &apCopy[nOld
22170 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34  -1]->aData[8], 4
22180 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44  );.  }.  if( nxD
22190 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  iv==pParent->nCe
221a0 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  ll+pParent->nOve
221b0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20  rflow ){.    /* 
221c0 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  Right-most sibli
221d0 6e 67 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ng is the right-
221e0 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
221f0 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74  arent */.    put
22200 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
22210 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
22220 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
22230 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20  oNew[nNew-1]);. 
22240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52   }else{.    /* R
22250 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
22260 67 20 69 73 20 74 68 65 20 6c 65 66 74 20 63 68  g is the left ch
22270 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73 74  ild of the first
22280 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e   entry in pParen
22290 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  t.    ** past th
222a0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76  e right-most div
222b0 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ider entry */.  
222c0 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
222d0 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
222e0 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e  ent, nxDiv), pgn
222f0 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20  oNew[nNew-1]);. 
22300 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65   }..  /*.  ** Re
22310 70 61 72 65 6e 74 20 63 68 69 6c 64 72 65 6e 20  parent children 
22320 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20  of all cells..  
22330 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
22340 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
22350 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
22360 6c 64 50 61 67 65 73 28 61 70 4e 65 77 5b 69 5d  ldPages(apNew[i]
22370 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
22380 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
22390 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
223a0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61  .  }.  rc = repa
223b0 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70  rentChildPages(p
223c0 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
223d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
223e0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
223f0 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  nup;..  /*.  ** 
22400 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  Balance the pare
22410 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74  nt page.  Note t
22420 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
22430 70 61 67 65 20 28 70 50 61 67 65 29 20 6d 69 67  page (pPage) mig
22440 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  ht.  ** have bee
22450 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  n added to the f
22460 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69  reelist so it mi
22470 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  ght no longer be
22480 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
22490 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72 65 6e  ** But the paren
224a0 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61  t page will alwa
224b0 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ys be initialize
224c0 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
224d0 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
224e0 74 20 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72 74  t );.  /* assert
224f0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
22500 29 3b 20 2f 2f 20 4e 6f 21 20 70 50 61 67 65 20  ); // No! pPage 
22510 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
22520 61 64 64 65 64 20 74 6f 20 66 72 65 65 6c 69 73  added to freelis
22530 74 20 2a 2f 0a 20 20 2f 2a 20 70 61 67 65 49 6e  t */.  /* pageIn
22540 74 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 20  tegrity(pPage); 
22550 20 20 20 2f 2f 20 4e 6f 21 20 70 50 61 67 65 20     // No! pPage 
22560 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
22570 61 64 64 65 64 20 74 6f 20 66 72 65 65 6c 69 73  added to freelis
22580 74 20 2a 2f 20 0a 20 20 72 63 20 3d 20 62 61 6c  t */ .  rc = bal
22590 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29  ance(pParent, 0)
225a0 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43  ;.  .  /*.  ** C
225b0 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65  leanup before re
225c0 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61  turning..  */.ba
225d0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20  lance_cleanup:. 
225e0 20 73 71 6c 69 74 65 46 72 65 65 28 61 70 43 65   sqliteFree(apCe
225f0 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
22600 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
22610 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
22620 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
22630 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
22640 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
22650 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
22660 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
22670 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 54  ge(pParent);.  T
22680 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
22690 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 25 64  finished with %d
226a0 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20  : old=%d new=%d 
226b0 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20  cells=%d\n",.   
226c0 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67         pPage->pg
226d0 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20  no, nOld, nNew, 
226e0 6e 43 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72  nCell));.  retur
226f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
22700 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
22710 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f  alled for the ro
22720 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 74 72  ot page of a btr
22730 65 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74  ee when the root
22740 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  .** page contain
22750 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69  s no cells.  Thi
22760 73 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e  s is an opportun
22770 69 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ity to make the 
22780 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65  tree.** shallowe
22790 72 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a  r by one level..
227a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
227b0 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
227c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
227d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69  .  MemPage *pChi
227e0 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
227f0 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c  /* The only chil
22800 64 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 20  d page of pPage 
22810 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  */.  Pgno pgnoCh
22820 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
22830 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
22840 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20   for pChild */. 
22850 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22860 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
22870 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
22880 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
22890 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  */.  Btree *pBt;
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54    /* The main BT
228c0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
228d0 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72  .  int mxCellPer
228e0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
228f0 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
22900 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70  r of cells per p
22910 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
22920 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
22930 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
22940 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65  ls from pages be
22950 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
22960 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20    int *szCell;  
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22980 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20  * Local size of 
22990 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20  all cells */..  
229a0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
229b0 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61  Parent==0 );.  a
229c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
229d0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20  ell==0 );.  pBt 
229e0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
229f0 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20  mxCellPerPage = 
22a00 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20  MX_CELL(pBt);.  
22a10 61 70 43 65 6c 6c 20 3d 20 28 75 38 20 2a 2a 29  apCell = (u8 **)
22a20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
22a30 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 2a 28   mxCellPerPage*(
22a40 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65  sizeof(u8*)+size
22a50 6f 66 28 69 6e 74 29 29 20 29 3b 0a 20 20 69 66  of(int)) );.  if
22a60 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65  ( apCell==0 ) re
22a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
22a80 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69  M;.  szCell = (i
22a90 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65  nt*)&apCell[mxCe
22aa0 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20 69 66  llPerPage];.  if
22ab0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
22ac0 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  .    /* The tabl
22ad0 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e is completely 
22ae0 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41  empty */.    TRA
22af0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d  CE(("BALANCE: em
22b00 70 74 79 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c  pty table %d\n",
22b10 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
22b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
22b30 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  The root page is
22b40 20 65 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f   empty but has o
22b50 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73  ne child.  Trans
22b60 66 65 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 69  fer the.    ** i
22b70 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
22b80 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69  that one child i
22b90 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67  nto the root pag
22ba0 65 20 69 66 20 69 74 20 0a 20 20 20 20 2a 2a 20  e if it .    ** 
22bb0 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20  will fit.  This 
22bc0 72 65 64 75 63 65 73 20 74 68 65 20 64 65 70 74  reduces the dept
22bd0 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 62 79  h of the tree by
22be0 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
22bf0 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20   ** If the root 
22c00 70 61 67 65 20 69 73 20 70 61 67 65 20 31 2c 20  page is page 1, 
22c10 69 74 20 68 61 73 20 6c 65 73 73 20 73 70 61 63  it has less spac
22c20 65 20 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e  e available than
22c30 0a 20 20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c  .    ** its chil
22c40 64 20 28 64 75 65 20 74 6f 20 74 68 65 20 31 30  d (due to the 10
22c50 30 20 62 79 74 65 20 68 65 61 64 65 72 20 74 68  0 byte header th
22c60 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
22c70 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a   beginning.    *
22c80 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
22c90 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69  e fle), so it mi
22ca0 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ght not be able 
22cb0 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74  to hold all of t
22cc0 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72  he .    ** infor
22cd0 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  mation currently
22ce0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
22cf0 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69  e child.  If thi
22d00 73 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  s is the .    **
22d10 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e   case, then do n
22d20 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66  ot do the transf
22d30 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20  er.  Leave page 
22d40 31 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20  1 empty except. 
22d50 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69     ** for the ri
22d60 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74  ght-pointer to t
22d70 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  he child page.  
22d80 54 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 62  The child page b
22d90 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68  ecomes.    ** th
22da0 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f  e virtual root o
22db0 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20  f the tree..    
22dc0 2a 2f 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64  */.    pgnoChild
22dd0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
22de0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
22df0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
22e00 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
22e10 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61  Child>0 );.    a
22e20 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64  ssert( pgnoChild
22e30 3c 3d 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  <=sqlite3pager_p
22e40 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e  agecount(pPage->
22e50 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a  pBt->pPager) );.
22e60 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65      rc = getPage
22e70 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e  (pPage->pBt, pgn
22e80 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c 64 29  oChild, &pChild)
22e90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
22ea0 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
22eb0 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28  balance;.    if(
22ec0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
22ed0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
22ee0 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70  itPage(pChild, p
22ef0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
22f00 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73   rc ) goto end_s
22f10 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a  hallow_balance;.
22f20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
22f30 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  hild->nOverflow=
22f40 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
22f50 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31  pChild->nFree>=1
22f60 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  00 ){.        /*
22f70 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f 72   The child infor
22f80 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20  mation will fit 
22f90 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  on the root page
22fa0 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20 20  , so do the.    
22fb0 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20      ** copy */. 
22fc0 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
22fd0 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70        zeroPage(p
22fe0 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Page, pChild->aD
22ff0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  ata[0]);.       
23000 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69   for(i=0; i<pChi
23010 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ld->nCell; i++){
23020 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 65 6c  .          apCel
23030 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  l[i] = findCell(
23040 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20  pChild,i);.     
23050 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d       szCell[i] =
23060 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43 68   cellSizePtr(pCh
23070 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b  ild, apCell[i]);
23080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23090 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
230a0 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e  pPage, pChild->n
230b0 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a  Cell, apCell, sz
230c0 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f  Cell);.        /
230d0 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67 68 74  * Copy the right
230e0 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20  -pointer of the 
230f0 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61 72  child to the par
23100 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ent. */.        
23110 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
23120 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
23130 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20  rOffset+8], .   
23140 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
23150 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e(&pChild->aData
23160 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73  [pChild->hdrOffs
23170 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 20  et+8]));.       
23180 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64   freePage(pChild
23190 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
231a0 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c  (("BALANCE: chil
231b0 64 20 25 64 20 74 72 61 6e 73 66 65 72 20 74 6f  d %d transfer to
231c0 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69   page 1\n", pChi
231d0 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ld->pgno));.    
231e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
231f0 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68 61   /* The child ha
23200 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  s more informati
23210 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  on that will fit
23220 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20   on the root..  
23230 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72 65        ** The tre
23240 65 20 69 73 20 61 6c 72 65 61 64 79 20 62 61 6c  e is already bal
23250 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69  anced.  Do nothi
23260 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54  ng. */.        T
23270 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
23280 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f  child %d will no
23290 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31 5c  t fit on page 1\
232a0 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  n", pChild->pgno
232b0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
232c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
232d0 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74 61  cpy(pPage->aData
232e0 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c  , pChild->aData,
232f0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
23300 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
23310 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
23320 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  0;.      pPage->
23330 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20  pParent = 0;.   
23340 20 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65     rc = initPage
23350 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  (pPage, 0);.    
23360 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
23370 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
23380 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64   freePage(pChild
23390 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  );.      TRACE((
233a0 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66  "BALANCE: transf
233b0 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f  er child %d into
233c0 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20   root %d\n",.   
233d0 20 20 20 20 20 20 20 20 20 20 20 70 43 68 69 6c             pChil
233e0 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e  d->pgno, pPage->
233f0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
23400 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
23410 68 69 6c 64 50 61 67 65 73 28 70 50 61 67 65 29  hildPages(pPage)
23420 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
23430 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
23440 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
23450 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
23460 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
23470 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
23480 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
23490 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
234a0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
234b0 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70   .        rc = p
234c0 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61  trmapPutOvfl(pPa
234d0 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ge, i);.        
234e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
234f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
23500 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
23510 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 20  balance;.       
23520 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
23530 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
23540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
23550 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
23560 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 72 65  _balance;.    re
23570 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64  leasePage(pChild
23580 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c  );.  }.end_shall
23590 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71  ow_balance:.  sq
235a0 6c 69 74 65 46 72 65 65 28 61 70 43 65 6c 6c 29  liteFree(apCell)
235b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
235c0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f  .../*.** The roo
235d0 74 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75  t page is overfu
235e0 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  ll.**.** When th
235f0 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61  is happens, Crea
23600 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  te a new child p
23610 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65  age and copy the
23620 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
23630 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68  the root into th
23640 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d  e child.  Then m
23650 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  ake the root.** 
23660 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61  page an empty pa
23670 67 65 20 77 69 74 68 20 72 69 67 68 74 43 68 69  ge with rightChi
23680 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ld pointing to t
23690 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e  he new.** child.
236a0 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c     Finally, call
236b0 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61   balance_interna
236c0 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63  l() on the new c
236d0 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65  hild.** to cause
236e0 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f   it to split..*/
236f0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
23700 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61  nce_deeper(MemPa
23710 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
23720 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
23730 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
23740 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64  e from subproced
23750 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ures */.  MemPag
23760 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a  e *pChild;    /*
23770 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65   Pointer to a ne
23780 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
23790 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
237a0 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75  ;     /* Page nu
237b0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
237c0 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
237d0 42 74 72 65 65 20 2a 70 42 74 3b 20 20 20 20 20  Btree *pBt;     
237e0 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
237f0 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
23800 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Size;     /* Tot
23810 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f  al usable size o
23820 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  f a page */.  u8
23830 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
23840 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
23850 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
23860 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20  */.  u8 *cdata; 
23870 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
23880 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ent of the child
23890 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68   page */.  int h
238a0 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
238b0 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65  * Offset to page
238c0 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e   header in paren
238d0 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20  t */.  int brk; 
238e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
238f0 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20  fset to content 
23900 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  of first cell in
23910 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73   parent */..  as
23920 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61  sert( pPage->pPa
23930 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rent==0 );.  ass
23940 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
23950 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74  rflow>0 );.  pBt
23960 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
23970 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61   rc = allocatePa
23980 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c  ge(pBt, &pChild,
23990 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61   &pgnoChild, pPa
239a0 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  ge->pgno, 0);.  
239b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
239c0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
239d0 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69  lite3pager_iswri
239e0 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 61  teable(pChild->a
239f0 44 61 74 61 29 20 29 3b 0a 20 20 75 73 61 62 6c  Data) );.  usabl
23a00 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
23a10 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20  bleSize;.  data 
23a20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
23a30 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
23a40 64 72 4f 66 66 73 65 74 3b 0a 20 20 62 72 6b 20  drOffset;.  brk 
23a50 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
23a60 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74  [hdr+5]);.  cdat
23a70 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  a = pChild->aDat
23a80 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74  a;.  memcpy(cdat
23a90 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70  a, &data[hdr], p
23aa0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
23ab0 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  +2*pPage->nCell-
23ac0 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  hdr);.  memcpy(&
23ad0 63 64 61 74 61 5b 62 72 6b 5d 2c 20 26 64 61 74  cdata[brk], &dat
23ae0 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  a[brk], usableSi
23af0 7a 65 2d 62 72 6b 29 3b 0a 20 20 61 73 73 65 72  ze-brk);.  asser
23b00 74 28 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69  t( pChild->isIni
23b10 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 69  t==0 );.  rc = i
23b20 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20  nitPage(pChild, 
23b30 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
23b40 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64   ) goto balanced
23b50 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d  eeper_out;.  mem
23b60 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66  cpy(pChild->aOvf
23b70 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c  l, pPage->aOvfl,
23b80 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
23b90 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  w*sizeof(pPage->
23ba0 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  aOvfl[0]));.  pC
23bb0 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
23bc0 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
23bd0 6f 77 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64  ow;.  if( pChild
23be0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
23bf0 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65     pChild->nFree
23c00 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
23c10 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  rt( pChild->nCel
23c20 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  l==pPage->nCell 
23c30 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
23c40 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  age, pChild->aDa
23c50 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41  ta[0] & ~PTF_LEA
23c60 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  F);.  put4byte(&
23c70 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
23c80 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
23c90 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
23ca0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
23cb0 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e   copy root %d in
23cc0 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  to %d\n", pPage-
23cd0 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70  >pgno, pChild->p
23ce0 67 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20 53  gno));.#ifndef S
23cf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
23d00 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
23d10 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
23d20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63     int i;.    rc
23d30 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
23d40 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20  , pChild->pgno, 
23d50 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
23d60 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
23d70 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
23d80 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b  lancedeeper_out;
23d90 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23da0 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69  pChild->nCell; i
23db0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
23dc0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43  ptrmapPutOvfl(pC
23dd0 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20  hild, i);.      
23de0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23df0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
23e00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
23e10 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
23e20 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f  .  rc = balance_
23e30 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b  nonroot(pChild);
23e40 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  ..balancedeeper_
23e50 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  out:.  releasePa
23e60 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65  ge(pChild);.  re
23e70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23e80 2a 20 44 65 63 69 64 65 20 69 66 20 74 68 65 20  * Decide if the 
23e90 70 61 67 65 20 70 50 61 67 65 20 6e 65 65 64 73  page pPage needs
23ea0 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e   to be balanced.
23eb0 20 20 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69    If balancing i
23ec0 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63  s.** required, c
23ed0 61 6c 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69  all the appropri
23ee0 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  ate balancing ro
23ef0 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
23f00 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d   int balance(Mem
23f10 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
23f20 20 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20   insert){.  int 
23f30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23f40 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
23f50 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  rent==0 ){.    i
23f60 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
23f70 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  low>0 ){.      r
23f80 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  c = balance_deep
23f90 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  er(pPage);.    }
23fa0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23fb0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d  ITE_OK && pPage-
23fc0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
23fd0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
23fe0 73 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29  shallower(pPage)
23ff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
24000 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
24010 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a  nOverflow>0 || .
24020 20 20 20 20 20 20 20 20 28 21 69 6e 73 65 72 74          (!insert
24030 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
24040 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
24050 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a  bleSize*2/3) ){.
24060 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
24070 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65  ce_nonroot(pPage
24080 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
24090 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
240a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
240b0 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f  checks all curso
240c0 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  rs that point to
240d0 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e   table pgnoRoot.
240e0 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68  .** If any of th
240f0 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 74 68 65  ose cursors othe
24100 72 20 74 68 61 6e 20 70 45 78 63 6c 75 64 65 20  r than pExclude 
24110 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68  were opened with
24120 20 0a 2a 2a 20 77 72 46 6c 61 67 3d 3d 30 20 74   .** wrFlag==0 t
24130 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
24140 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
24150 4c 4f 43 4b 45 44 2e 20 20 49 66 20 61 6c 6c 0a  LOCKED.  If all.
24160 2a 2a 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ** cursors that 
24170 70 6f 69 6e 74 20 74 6f 20 70 67 6e 6f 52 6f 6f  point to pgnoRoo
24180 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69  t were opened wi
24190 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 20  th wrFlag==1.** 
241a0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
241b0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
241c0 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64  _OK..**.** In ad
241d0 64 69 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69  dition to checki
241e0 6e 67 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b  ng for read-lock
241f0 73 20 28 77 68 65 72 65 20 61 20 72 65 61 64 2d  s (where a read-
24200 6c 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61  lock .** means a
24210 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 77   cursor opened w
24220 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 29 20 74  ith wrFlag==0) t
24230 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
24240 20 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 63 75   moves.** all cu
24250 72 73 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  rsors other than
24260 20 70 45 78 63 6c 75 64 65 20 73 6f 20 74 68 61   pExclude so tha
24270 74 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  t they are point
24280 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66  ing to the .** f
24290 69 72 73 74 20 43 65 6c 6c 20 6f 6e 20 72 6f 6f  irst Cell on roo
242a0 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  t page.  This is
242b0 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
242c0 73 65 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a 2a  se an insert .**
242d0 20 6f 72 20 64 65 6c 65 74 65 20 6d 69 67 68 74   or delete might
242e0 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62   change the numb
242f0 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61  er of cells on a
24300 20 70 61 67 65 20 6f 72 20 64 65 6c 65 74 65 0a   page or delete.
24310 2a 2a 20 61 20 70 61 67 65 20 65 6e 74 69 72 65  ** a page entire
24320 6c 79 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74  ly and we do not
24330 20 77 61 6e 74 20 74 6f 20 6c 65 61 76 65 20 61   want to leave a
24340 6e 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20 70  ny cursors .** p
24350 6f 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65  ointing to non-e
24360 78 69 73 74 61 6e 74 20 70 61 67 65 73 20 6f 72  xistant pages or
24370 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
24380 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c  c int checkReadL
24390 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 42 74 2c  ocks(Btree *pBt,
243a0 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20   Pgno pgnoRoot, 
243b0 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75  BtCursor *pExclu
243c0 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  de){.  BtCursor 
243d0 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d  *p;.  for(p=pBt-
243e0 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
243f0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
24400 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70  ( p->pgnoRoot!=p
24410 67 6e 6f 52 6f 6f 74 20 7c 7c 20 70 3d 3d 70 45  gnoRoot || p==pE
24420 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75  xclude ) continu
24430 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72  e;.    if( p->wr
24440 46 6c 61 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  Flag==0 ) return
24450 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
24460 20 20 20 20 69 66 28 20 70 2d 3e 70 50 61 67 65      if( p->pPage
24470 2d 3e 70 67 6e 6f 21 3d 70 2d 3e 70 67 6e 6f 52  ->pgno!=p->pgnoR
24480 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 6d 6f 76  oot ){.      mov
24490 65 54 6f 52 6f 6f 74 28 70 29 3b 0a 20 20 20 20  eToRoot(p);.    
244a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
244b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
244c0 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
244d0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
244e0 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20  BTree.  The key 
244f0 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65  is given by (pKe
24500 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74  y,nKey).** and t
24510 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65 6e  he data is given
24520 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61   by (pData,nData
24530 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69  ).  The cursor i
24540 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a  s used only to.*
24550 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 61  * define what ta
24560 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20 73  ble the record s
24570 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
24580 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72  d into.  The cur
24590 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
245a0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
245b0 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  dom location..**
245c0 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45  .** For an INTKE
245d0 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68  Y table, only th
245e0 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20  e nKey value of 
245f0 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e  the key is used.
24600 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e    pKey is.** ign
24610 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52  ored.  For a ZER
24620 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65  ODATA table, the
24630 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61   pData and nData
24640 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65   are both ignore
24650 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
24660 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20  3BtreeInsert(.  
24670 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24690 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
246a0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  to the table of 
246b0 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
246c0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
246d0 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
246e0 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68  /* The key of th
246f0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
24700 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
24710 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 20 20  ata, int nData  
24720 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20   /* The data of 
24730 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
24740 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
24750 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20   int loc;.  int 
24760 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50 61 67 65  szNew;.  MemPage
24770 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65   *pPage;.  Btree
24780 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
24790 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
247a0 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75  ar *oldCell;.  u
247b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65  nsigned char *ne
247c0 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66  wCell = 0;..  if
247d0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 21 3d  ( pBt->inTrans!=
247e0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
247f0 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
24800 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
24810 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20 69  efore doing an i
24820 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 65 74  nsert */.    ret
24830 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  urn pBt->readOnl
24840 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
24850 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
24860 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OR;.  }.  assert
24870 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
24880 20 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d   );.  if( !pCur-
24890 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  >wrFlag ){.    r
248a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
248b0 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  M;   /* Cursor n
248c0 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74  ot open for writ
248d0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
248e0 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
248f0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
24900 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20  oot, pCur) ){.  
24910 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24920 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74  LOCKED; /* The t
24930 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73  able pCur points
24940 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c   to has a read l
24950 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 63 20  ock */.  }.  rc 
24960 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
24970 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c  veto(pCur, pKey,
24980 20 6e 4b 65 79 2c 20 26 6c 6f 63 29 3b 0a 20 20   nKey, &loc);.  
24990 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
249a0 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  rc;.  pPage = pC
249b0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
249c0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
249d0 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b  ey || nKey>=0 );
249e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
249f0 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65  ->leaf || !pPage
24a00 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20  ->leafData );.  
24a10 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20  TRACE(("INSERT: 
24a20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c  table=%d nkey=%l
24a30 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65  ld ndata=%d page
24a40 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
24a50 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
24a60 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61  oot, nKey, nData
24a70 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20  , pPage->pgno,. 
24a80 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20           loc==0 
24a90 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20  ? "overwrite" : 
24aa0 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20  "new entry"));. 
24ab0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
24ac0 69 73 49 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d  isInit );.  rc =
24ad0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
24ae0 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  ite(pPage->aData
24af0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
24b00 74 75 72 6e 20 72 63 3b 0a 20 20 6e 65 77 43 65  turn rc;.  newCe
24b10 6c 6c 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ll = (unsigned c
24b20 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
24b30 6f 63 52 61 77 28 20 4d 58 5f 43 45 4c 4c 5f 53  ocRaw( MX_CELL_S
24b40 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66  IZE(pBt) );.  if
24b50 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72  ( newCell==0 ) r
24b60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
24b70 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  EM;.  rc = fillI
24b80 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77  nCell(pPage, new
24b90 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  Cell, pKey, nKey
24ba0 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
24bb0 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72  &szNew);.  if( r
24bc0 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
24bd0 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ert;.  assert( s
24be0 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  zNew==cellSizePt
24bf0 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  r(pPage, newCell
24c00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
24c10 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49  zNew<=MX_CELL_SI
24c20 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28  ZE(pBt) );.  if(
24c30 20 6c 6f 63 3d 3d 30 20 26 26 20 70 43 75 72 2d   loc==0 && pCur-
24c40 3e 69 73 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  >isValid ){.    
24c50 69 6e 74 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61  int szOld;.    a
24c60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
24c70 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
24c80 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
24c90 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66  .    oldCell = f
24ca0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
24cb0 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69  Cur->idx);.    i
24cc0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
24cd0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
24ce0 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c  newCell, oldCell
24cf0 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 4);.    }.    
24d00 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65  szOld = cellSize
24d10 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65  Ptr(pPage, oldCe
24d20 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  ll);.    rc = cl
24d30 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f  earCell(pPage, o
24d40 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28  ldCell);.    if(
24d50 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69   rc ) goto end_i
24d60 6e 73 65 72 74 3b 0a 20 20 20 20 64 72 6f 70 43  nsert;.    dropC
24d70 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
24d80 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20  >idx, szOld);.  
24d90 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20  }else if( loc<0 
24da0 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  && pPage->nCell>
24db0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
24dc0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
24dd0 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b      pCur->idx++;
24de0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
24df0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  nSize = 0;.  }el
24e00 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
24e10 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
24e20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74   }.  rc = insert
24e30 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
24e40 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20  ->idx, newCell, 
24e50 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20  szNew, 0, 0);.  
24e60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24e70 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  K ) goto end_ins
24e80 65 72 74 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61  ert;.  rc = bala
24e90 6e 63 65 28 70 50 61 67 65 2c 20 31 29 3b 0a 20  nce(pPage, 1);. 
24ea0 20 2f 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   /* sqlite3Btree
24eb0 50 61 67 65 44 75 6d 70 28 70 43 75 72 2d 3e 70  PageDump(pCur->p
24ec0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
24ed0 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f 2a 20  ot, 1); */.  /* 
24ee0 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20  fflush(stdout); 
24ef0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
24f00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f  ITE_OK ){.    mo
24f10 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
24f20 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a    }.end_insert:.
24f30 20 20 73 71 6c 69 74 65 46 72 65 65 28 6e 65 77    sqliteFree(new
24f40 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Cell);.  return 
24f50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
24f60 65 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68  ete the entry th
24f70 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
24f80 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
24f90 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
24fa0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
24fb0 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69   a random locati
24fc0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
24fd0 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42 74  e3BtreeDelete(Bt
24fe0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
24ff0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
25000 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
25010 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
25020 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  pCell;.  int rc;
25030 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
25040 64 20 3d 20 30 3b 0a 20 20 42 74 72 65 65 20 2a  d = 0;.  Btree *
25050 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
25060 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
25070 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
25080 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 21  f( pBt->inTrans!
25090 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
250a0 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
250b0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
250c0 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64  before doing a d
250d0 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74  elete */.    ret
250e0 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  urn pBt->readOnl
250f0 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
25100 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
25110 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OR;.  }.  assert
25120 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
25130 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
25140 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43  idx >= pPage->nC
25150 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ell ){.    retur
25160 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  n SQLITE_ERROR; 
25170 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69   /* The cursor i
25180 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74  s not pointing t
25190 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  o anything */.  
251a0 7d 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77  }.  if( !pCur->w
251b0 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74  rFlag ){.    ret
251c0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
251d0 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70     /* Did not op
251e0 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 66  en this cursor f
251f0 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20  or writing */.  
25200 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61  }.  if( checkRea
25210 64 4c 6f 63 6b 73 28 70 42 74 2c 20 70 43 75 72  dLocks(pBt, pCur
25220 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
25230 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
25240 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f  SQLITE_LOCKED; /
25250 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72  * The table pCur
25260 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61   points to has a
25270 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
25280 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
25290 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
252a0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 69 66 28  e->aData);.  if(
252b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
252c0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
252d0 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74  e cell within it
252e0 27 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76  's page and leav
252f0 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67  e pCell pointing
25300 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   to the.  ** dat
25310 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c  a. The clearCell
25320 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e  () call frees an
25330 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
25340 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
25350 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
25360 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20  The cell itself 
25370 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e  is still intact.
25380 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20  .  */.  pCell = 
25390 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
253a0 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66  pCur->idx);.  if
253b0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
253c0 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  {.    pgnoChild 
253d0 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
253e0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c  );.  }.  rc = cl
253f0 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
25400 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  Cell);.  if( rc 
25410 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
25420 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
25430 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
25440 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65 20 61  * The entry we a
25450 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65  re about to dele
25460 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  te is not a leaf
25470 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74   so if we do not
25480 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74  .    ** do somet
25490 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61  hing we will lea
254a0 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20  ve a hole on an 
254b0 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20  internal page.. 
254c0 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f     ** We have to
254d0 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62   fill the hole b
254e0 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65  y moving in a ce
254f0 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20  ll from a leaf. 
25500 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74   The.    ** next
25510 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20   Cell after the 
25520 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  one to be delete
25530 64 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  d is guaranteed 
25540 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20  to exist and.   
25550 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66   ** to be a leaf
25560 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69   so we can use i
25570 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74  t..    */.    Bt
25580 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a  Cursor leafCur;.
25590 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
255a0 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e  r *pNext;.    in
255b0 74 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20 69 6e  t szNext;.    in
255c0 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75  t notUsed;.    u
255d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
255e0 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  mpCell = 0;.    
255f0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e  assert( !pPage->
25600 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20 20  leafData );.    
25610 67 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43  getTempCursor(pC
25620 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20  ur, &leafCur);. 
25630 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
25640 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75  treeNext(&leafCu
25650 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  r, &notUsed);.  
25660 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25670 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
25680 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
25690 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  M ){.        rc 
256a0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
256b0 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55  ;  /* bkpt-CORRU
256c0 50 54 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  PT */.      }.  
256d0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
256e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
256f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
25700 61 67 65 72 5f 77 72 69 74 65 28 6c 65 61 66 43  ager_write(leafC
25710 75 72 2e 70 50 61 67 65 2d 3e 61 44 61 74 61 29  ur.pPage->aData)
25720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
25730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25740 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 44  .      TRACE(("D
25750 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20  ELETE: table=%d 
25760 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20  delete internal 
25770 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20  from %d replace 
25780 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
25790 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  .         pCur->
257a0 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
257b0 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e 70  >pgno, leafCur.p
257c0 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
257d0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
257e0 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63  ge, pCur->idx, c
257f0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
25800 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20  , pCell));.     
25810 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c   pNext = findCel
25820 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  l(leafCur.pPage,
25830 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a 20   leafCur.idx);. 
25840 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65       szNext = ce
25850 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43 75  llSizePtr(leafCu
25860 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29 3b  r.pPage, pNext);
25870 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
25880 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
25890 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20  >=szNext+4 );.  
258a0 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 28      tempCell = (
258b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
258c0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
258d0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
258e0 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
258f0 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  tempCell==0 ){. 
25900 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25910 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
25920 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
25930 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25940 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65  .      rc = inse
25950 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  rtCell(pPage, pC
25960 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34  ur->idx, pNext-4
25970 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70  , szNext+4, temp
25980 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Cell, 0);.    }.
25990 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
259a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
259b0 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
259c0 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20  flowCell(pPage, 
259d0 70 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f  pCur->idx), pgno
259e0 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 72 63  Child);.      rc
259f0 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
25a00 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
25a10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25a20 4b 20 29 7b 0a 20 20 20 20 20 20 64 72 6f 70 43  K ){.      dropC
25a30 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67  ell(leafCur.pPag
25a40 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20  e, leafCur.idx, 
25a50 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 72  szNext);.      r
25a60 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66  c = balance(leaf
25a70 43 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20  Cur.pPage, 0);. 
25a80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
25a90 72 65 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a 20  ree(tempCell);. 
25aa0 20 20 20 72 65 6c 65 61 73 65 54 65 6d 70 43 75     releaseTempCu
25ab0 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a  rsor(&leafCur);.
25ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41    }else{.    TRA
25ad0 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62  CE(("DELETE: tab
25ae0 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f  le=%d delete fro
25af0 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20  m leaf %d\n",.  
25b00 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
25b10 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  oot, pPage->pgno
25b20 29 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c  ));.    dropCell
25b30 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
25b40 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
25b50 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20  Page, pCell));. 
25b60 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
25b70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  pPage, 0);.  }. 
25b80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25b90 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f  OK ){.    moveTo
25ba0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Root(pCur);.  }.
25bb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25bc0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
25bd0 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20  ew BTree table. 
25be0 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54   Write into *piT
25bf0 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a  able the page.**
25c00 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
25c10 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
25c20 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   new table..**.*
25c30 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79  * The type of ty
25c40 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  pe is determined
25c50 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61   by the flags pa
25c60 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74  rameter.  Only t
25c70 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
25c80 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20  values of flags 
25c90 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
25ca0 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c   use.  Other val
25cb0 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73  ues for.** flags
25cc0 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a   might not work:
25cd0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45  .**.**     BTREE
25ce0 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45  _INTKEY|BTREE_LE
25cf0 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20  AFDATA     Used 
25d00 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77  for SQL tables w
25d10 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a  ith rowid keys.*
25d20 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f  *     BTREE_ZERO
25d30 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20  DATA            
25d40 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53        Used for S
25d50 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 69 6e  QL indices.*/.in
25d60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  t sqlite3BtreeCr
25d70 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20  eateTable(Btree 
25d80 2a 70 42 74 2c 20 69 6e 74 20 2a 70 69 54 61 62  *pBt, int *piTab
25d90 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
25da0 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
25db0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  ;.  Pgno pgnoRoo
25dc0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
25dd0 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 21  f( pBt->inTrans!
25de0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
25df0 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
25e00 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
25e10 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 72 65 74  first */.    ret
25e20 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  urn pBt->readOnl
25e30 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
25e40 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
25e50 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OR;.  }.  assert
25e60 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
25e70 20 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20   );..  /* It is 
25e80 69 6c 6c 65 67 61 6c 20 74 6f 20 63 72 65 61 74  illegal to creat
25e90 65 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79  e a table if any
25ea0 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65   cursors are ope
25eb0 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  n on the.  ** da
25ec0 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
25ed0 62 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d  because in auto-
25ee0 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20  vacuum mode the 
25ef0 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a  backend may.  **
25f00 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 20   need to move a 
25f10 64 61 74 61 62 61 73 65 20 70 61 67 65 20 74 6f  database page to
25f20 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
25f30 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
25f40 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 20 6f 70 65  ..  ** If an ope
25f50 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75 73 69  n cursor was usi
25f60 6e 67 20 74 68 65 20 70 61 67 65 20 61 20 70 72  ng the page a pr
25f70 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 6f 63 63 75  oblem would occu
25f80 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
25f90 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  t->pCursor ){.  
25fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25fb0 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 23 69 66  LOCKED;.  }..#if
25fc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25fd0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20  AUTOVACUUM.  rc 
25fe0 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70  = allocatePage(p
25ff0 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
26000 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
26010 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
26020 72 63 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  rc;.#else.  if( 
26030 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
26040 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
26050 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f  Move;      /* Mo
26060 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74  ve a page here t
26070 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
26080 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f  the root-page */
26090 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
260a0 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20  ageMove; /* The 
260b0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
260c0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
260d0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65   the value of me
260e0 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64  ta[3] from the d
260f0 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65 72  atabase to deter
26100 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20  mine where the. 
26110 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20     ** root page 
26120 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
26130 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61   should go. meta
26140 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65  [3] is the large
26150 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
26160 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66   ** created so f
26170 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72  ar, so the new r
26180 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74  oot-page is (met
26190 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a  a[3]+1)..    */.
261a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
261b0 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 42 74  BtreeGetMeta(pBt
261c0 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b  , 4, &pgnoRoot);
261d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
261e0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
261f0 72 63 3b 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74  rc;.    pgnoRoot
26200 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  ++;..    /* The 
26210 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61  new root-page ma
26220 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  y not be allocat
26230 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d  ed on a pointer-
26240 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65  map page, or the
26250 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f  .    ** PENDING_
26260 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a  BYTE page..    *
26270 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 52 6f  /.    if( pgnoRo
26280 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  ot==PTRMAP_PAGEN
26290 4f 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  O(pBt->usableSiz
262a0 65 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a  e, pgnoRoot) ||.
262b0 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74          pgnoRoot
262c0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
262d0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
262e0 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20    pgnoRoot++;.  
262f0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
26300 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a  pgnoRoot>=3 );..
26310 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
26320 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65  a page. The page
26330 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
26340 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52  resides at pgnoR
26350 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  oot will.    ** 
26360 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  be moved to the 
26370 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28  allocated page (
26380 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63  unless the alloc
26390 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e  ated page happen
263a0 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69  s.    ** to resi
263b0 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e  de at pgnoRoot).
263c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
263d0 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42   allocatePage(pB
263e0 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26  t, &pPageMove, &
263f0 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f  pgnoMove, pgnoRo
26400 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ot, 1);.    if( 
26410 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26420 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
26430 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
26440 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52   pgnoMove!=pgnoR
26450 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20  oot ){.      u8 
26460 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e  eType;.      Pgn
26470 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
26480 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
26490 50 61 67 65 4d 6f 76 65 29 3b 0a 20 20 20 20 20  PageMove);.     
264a0 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
264b0 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  t, pgnoRoot, &pR
264c0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oot);.      if( 
264d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
264e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
264f0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
26500 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
26510 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
26520 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
26530 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
26540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65  !=SQLITE_OK || e
26550 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
26560 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d  TPAGE || eType==
26570 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
26580 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
26590 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
265a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
265b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
265c0 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
265d0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
265e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
265f0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52  eType!=PTRMAP_FR
26600 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  EEPAGE );.      
26610 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
26620 72 5f 77 72 69 74 65 28 70 52 6f 6f 74 2d 3e 61  r_write(pRoot->a
26630 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  Data);.      if(
26640 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26650 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
26660 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
26670 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
26680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
26690 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
266a0 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79  (pBt, pRoot, eTy
266b0 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67  pe, iPtrPage, pg
266c0 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 72  noMove);.      r
266d0 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
266e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
266f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26700 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
26710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
26720 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
26730 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
26740 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
26750 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26760 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
26770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26780 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
26790 72 5f 77 72 69 74 65 28 70 52 6f 6f 74 2d 3e 61  r_write(pRoot->a
267a0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  Data);.      if(
267b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
267c0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
267d0 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
267e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
267f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
26800 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  se{.      pRoot 
26810 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20  = pPageMove;.   
26820 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   } ..    /* Upda
26830 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
26840 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61  ap and meta-data
26850 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f   with the new ro
26860 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
26870 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  */.    rc = ptrm
26880 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52  apPut(pBt, pgnoR
26890 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  oot, PTRMAP_ROOT
268a0 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
268b0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
268c0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
268d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
268e0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
268f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
26900 64 61 74 65 4d 65 74 61 28 70 42 74 2c 20 34 2c  dateMeta(pBt, 4,
26910 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20   pgnoRoot);.    
26920 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
26930 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
26940 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
26950 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65   rc;.    }..  }e
26960 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c  lse{.    rc = al
26970 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
26980 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f  &pRoot, &pgnoRoo
26990 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 1, 0);.    if
269a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
269b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61  ;.  }.#endif.  a
269c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61  ssert( sqlite3pa
269d0 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28  ger_iswriteable(
269e0 70 52 6f 6f 74 2d 3e 61 44 61 74 61 29 20 29 3b  pRoot->aData) );
269f0 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f  .  zeroPage(pRoo
26a00 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c  t, flags | PTF_L
26a10 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 70  EAF);.  sqlite3p
26a20 61 67 65 72 5f 75 6e 72 65 66 28 70 52 6f 6f 74  ager_unref(pRoot
26a30 2d 3e 61 44 61 74 61 29 3b 0a 20 20 2a 70 69 54  ->aData);.  *piT
26a40 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f  able = (int)pgno
26a50 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53  Root;.  return S
26a60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
26a70 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76  ** Erase the giv
26a80 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
26a90 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69   and all its chi
26aa0 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a  ldren.  Return.*
26ab0 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  * the page to th
26ac0 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73  e freelist..*/.s
26ad0 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44  tatic int clearD
26ae0 61 74 61 62 61 73 65 50 61 67 65 28 0a 20 20 42  atabasePage(.  B
26af0 74 72 65 65 20 2a 70 42 74 2c 20 20 20 20 20 20  tree *pBt,      
26b00 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
26b10 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
26b20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50  the table */.  P
26b30 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
26b40 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
26b50 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a  ber to clear */.
26b60 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
26b70 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  nt,     /* Paren
26b80 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f  t page.  NULL fo
26b90 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20  r the root */.  
26ba0 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61 67  int freePageFlag
26bb0 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63        /* Dealloc
26bc0 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75 65  ate page if true
26bd0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
26be0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
26bf0 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
26c00 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20  d char *pCell;. 
26c10 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70   int i;..  if( p
26c20 67 6e 6f 3e 73 71 6c 69 74 65 33 70 61 67 65 72  gno>sqlite3pager
26c30 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  _pagecount(pBt->
26c40 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
26c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
26c60 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  RUPT;.  }..  rc 
26c70 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
26c80 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61  (pBt, pgno, &pPa
26c90 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge, pParent);.  
26ca0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
26cb0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
26cc0 6f 75 74 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  out;.  rc = sqli
26cd0 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
26ce0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
26cf0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
26d00 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
26d10 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  out;.  for(i=0; 
26d20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
26d30 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  i++){.    pCell 
26d40 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
26d50 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , i);.    if( !p
26d60 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
26d70 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
26d80 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
26d90 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
26da0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c   pPage->pParent,
26db0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
26dc0 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
26dd0 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
26de0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
26df0 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
26e00 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
26e10 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
26e20 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
26e30 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
26e40 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
26e50 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
26e60 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
26e70 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
26e80 61 5b 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50  a[8]), pPage->pP
26e90 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69  arent, 1);.    i
26ea0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
26eb0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
26ec0 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72  ut;.  }.  if( fr
26ed0 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20  eePageFlag ){.  
26ee0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
26ef0 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  pPage);.  }else{
26f00 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
26f10 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  age, pPage->aDat
26f20 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29  a[0] | PTF_LEAF)
26f30 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61  ;.  }..cleardata
26f40 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  basepage_out:.  
26f50 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
26f60 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
26f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
26f80 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
26f90 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74   from a single t
26fa0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
26fb0 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73  base.  iTable is
26fc0 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
26fd0 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  ber of the root 
26fe0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41  of the table.  A
26ff0 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
27000 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68  e returns,.** th
27010 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
27020 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20  mpty, but still 
27030 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  exists..**.** Th
27040 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
27050 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
27060 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
27070 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
27080 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e   read cursors on
27090 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65   the table.  Ope
270a0 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  n write cursors 
270b0 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
270c0 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  .** root of the 
270d0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
270e0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
270f0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 42 74 2c  able(Btree *pBt,
27100 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
27110 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
27120 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 66 28 20  or *pCur;.  if( 
27130 70 42 74 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  pBt->inTrans!=TR
27140 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
27150 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
27160 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
27170 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
27180 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
27190 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
271a0 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
271b0 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
271c0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f    if( pCur->pgno
271d0 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62  Root==(Pgno)iTab
271e0 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
271f0 70 43 75 72 2d 3e 77 72 46 6c 61 67 3d 3d 30 20  pCur->wrFlag==0 
27200 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
27210 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 6d 6f  LOCKED;.      mo
27220 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
27230 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d      }.  }.  rc =
27240 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
27250 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
27260 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69  able, 0, 0);.  i
27270 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
27280 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
27290 6b 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  k(pBt);.  }.  re
272a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
272b0 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f  * Erase all info
272c0 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62  rmation in a tab
272d0 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 72  le and add the r
272e0 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
272f0 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c   to.** the freel
27300 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68  ist.  Except, th
27310 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72  e root of the pr
27320 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74  inciple table (t
27330 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67  he one on.** pag
27340 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61 64  e 1) is never ad
27350 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
27360 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ist..**.** This 
27370 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69  routine will fai
27380 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f  l with SQLITE_LO
27390 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72  CKED if there ar
273a0 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75  e any open.** cu
273b0 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62  rsors on the tab
273c0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54  le..**.** If AUT
273d0 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c  OVACUUM is enabl
273e0 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
273f0 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74  at iTable is not
27400 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f   the last.** roo
27410 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  t page in the da
27420 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
27430 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  n the last root 
27440 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20  page .** in the 
27450 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
27460 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20   moved into the 
27470 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63  slot formerly oc
27480 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61  cupied by.** iTa
27490 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73  ble and that las
274a0 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20  t slot formerly 
274b0 6f 63 63 75 70 69 65 64 20 62 79 20 74 68 65 20  occupied by the 
274c0 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a  last root page.*
274d0 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
274e0 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65  e freelist inste
274f0 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49  ad of iTable.  I
27500 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a  n this say, all.
27510 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72  ** root pages ar
27520 65 20 6b 65 70 74 20 61 74 20 74 68 65 20 62 65  e kept at the be
27530 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
27540 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
27550 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73  ich.** is necess
27560 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55  ary for AUTOVACU
27570 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74  UM to work right
27580 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73  .  *piMoved is s
27590 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61  et to the .** pa
275a0 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75  ge number that u
275b0 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  sed to be the la
275c0 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  st root page in 
275d0 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  the file before.
275e0 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66  ** the move.  If
275f0 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f   no page gets mo
27600 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73  ved, *piMoved is
27610 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68   set to 0..** Th
27620 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
27630 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20   is recorded in 
27640 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20  meta[3] and the 
27650 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61  value of.** meta
27660 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20 62  [3] is updated b
27670 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  y this procedure
27680 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27690 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42  BtreeDropTable(B
276a0 74 72 65 65 20 2a 70 42 74 2c 20 69 6e 74 20 69  tree *pBt, int i
276b0 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
276c0 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
276d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
276e0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 42 74   = 0;..  if( pBt
276f0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
27700 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
27710 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
27720 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
27730 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
27740 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ROR;.  }..  /* I
27750 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
27760 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20  drop a table if 
27770 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20  any cursors are 
27780 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  open on the.  **
27790 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
277a0 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75  is because in au
277b0 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to-vacuum mode t
277c0 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20  he backend may. 
277d0 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65   ** need to move
277e0 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61   another root-pa
277f0 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70  ge to fill a gap
27800 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c   left by the del
27810 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70  eted.  ** root p
27820 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20  age. If an open 
27830 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67  cursor was using
27840 20 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f   this page a pro
27850 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a  blem would .  **
27860 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69   occur..  */.  i
27870 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  f( pBt->pCursor 
27880 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27890 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d  LITE_LOCKED;.  }
278a0 0a 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67 65  ..  rc = getPage
278b0 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62  (pBt, (Pgno)iTab
278c0 6c 65 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69  le, &pPage);.  i
278d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
278e0 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
278f0 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
27900 28 70 42 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20  (pBt, iTable);. 
27910 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
27920 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
27930 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
27940 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65  ;.  }..  *piMove
27950 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54  d = 0;..  if( iT
27960 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66  able>1 ){.#ifdef
27970 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
27980 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d  OVACUUM.    rc =
27990 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
279a0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
279b0 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a  e(pPage);.#else.
279c0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
279d0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
279e0 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e   Pgno maxRootPgn
279f0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
27a00 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
27a10 61 28 70 42 74 2c 20 34 2c 20 26 6d 61 78 52 6f  a(pBt, 4, &maxRo
27a20 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  otPgno);.      i
27a30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27a40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
27a50 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
27a60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
27a70 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
27a80 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61    if( iTable==ma
27a90 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20  xRootPgno ){.   
27aa0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74       /* If the t
27ab0 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
27ac0 65 64 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  ed is the table 
27ad0 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
27ae0 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
27af0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20     ** number in 
27b00 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 70 75  the database, pu
27b10 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
27b20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  on the free list
27b30 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
27b40 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
27b50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
27b60 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
27b70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
27b80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27b90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
27ba0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
27bb0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
27bc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
27bd0 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
27be0 70 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ped does not hav
27bf0 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
27c00 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20  ot-page.        
27c10 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ** number in the
27c20 20 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f   database. So mo
27c30 76 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  ve the page that
27c40 20 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a   does into the .
27c50 20 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c          ** gap l
27c60 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74  eft by the delet
27c70 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20  ed root-page..  
27c80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27c90 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b   MemPage *pMove;
27ca0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
27cb0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
27cc0 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67       rc = getPag
27cd0 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  e(pBt, maxRootPg
27ce0 6e 6f 2c 20 26 70 4d 6f 76 65 29 3b 0a 20 20 20  no, &pMove);.   
27cf0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27d00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27d10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
27d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27d30 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
27d40 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50  ge(pBt, pMove, P
27d50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
27d60 30 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  0, iTable);.    
27d70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
27d80 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
27d90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27da0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
27db0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
27dc0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
27dd0 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61   getPage(pBt, ma
27de0 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76  xRootPgno, &pMov
27df0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
27e00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27e10 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
27e20 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
27e30 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65          rc = fre
27e40 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
27e50 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
27e60 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  e(pMove);.      
27e70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27e80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
27e90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
27eb0 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74  iMoved = maxRoot
27ec0 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Pgno;.      }.. 
27ed0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
27ee0 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61  new 'max-root-pa
27ef0 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65  ge' value in the
27f00 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
27f10 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  . This.      ** 
27f20 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  is the old value
27f30 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20   less one, less 
27f40 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74  one more if that
27f50 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20   happens to.    
27f60 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70    ** be a root-p
27f70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73  age number, less
27f80 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68   one again if th
27f90 61 74 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  at is the.      
27fa0 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ** PENDING_BYTE_
27fb0 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  PAGE..      */. 
27fc0 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
27fd0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61  --;.      if( ma
27fe0 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49  xRootPgno==PENDI
27ff0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
28000 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78  ) ){.        max
28010 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
28020 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61    }.      if( ma
28030 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41  xRootPgno==PTRMA
28040 50 5f 50 41 47 45 4e 4f 28 70 42 74 2d 3e 75 73  P_PAGENO(pBt->us
28050 61 62 6c 65 53 69 7a 65 2c 20 6d 61 78 52 6f 6f  ableSize, maxRoo
28060 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  tPgno) ){.      
28070 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
28080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
28090 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74 50 67  ssert( maxRootPg
280a0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
280b0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 20  _PAGE(pBt) );.. 
280c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
280d0 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
280e0 28 70 42 74 2c 20 34 2c 20 6d 61 78 52 6f 6f 74  (pBt, 4, maxRoot
280f0 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Pgno);.    }else
28100 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
28110 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
28120 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
28130 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  pPage);.    }.#e
28140 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
28150 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42    /* If sqlite3B
28160 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61  treeDropTable wa
28170 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65  s called on page
28180 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50   1. */.    zeroP
28190 61 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49  age(pPage, PTF_I
281a0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29  NTKEY|PTF_LEAF )
281b0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
281c0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
281d0 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a  return rc;  .}..
281e0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
281f0 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta-information
28200 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62 61   out of a databa
28210 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30  se file.  Meta[0
28220 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62  ].** is the numb
28230 65 72 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  er of free pages
28240 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
28250 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74  e database.  Met
28260 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20  a[1].** through 
28270 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76 61  meta[15] are ava
28280 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62  ilable for use b
28290 79 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 2e  y higher layers.
282a0 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20    Meta[0].** is 
282b0 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f  read-only, the o
282c0 74 68 65 72 73 20 61 72 65 20 72 65 61 64 2f 77  thers are read/w
282d0 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  rite..** .** The
282e0 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e 75   schema layer nu
282f0 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75 65  mbers meta value
28300 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20 20  s differently.  
28310 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a  At the schema.**
28320 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65 20   layer (and the 
28330 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65  SetCookie and Re
28340 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73  adCookie opcodes
28350 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  ) the number of.
28360 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20 69 73  ** free pages is
28370 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20 53   not visible.  S
28380 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74  o Cookie[0] is t
28390 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61 5b  he same as Meta[
283a0 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  1]..*/.int sqlit
283b0 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 42  e3BtreeGetMeta(B
283c0 74 72 65 65 20 2a 70 42 74 2c 20 69 6e 74 20 69  tree *pBt, int i
283d0 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b  dx, u32 *pMeta){
283e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
283f0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b  igned char *pP1;
28400 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
28410 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b  =0 && idx<=15 );
28420 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
28430 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50  ager_get(pBt->pP
28440 61 67 65 72 2c 20 31 2c 20 28 76 6f 69 64 2a 2a  ager, 1, (void**
28450 29 26 70 50 31 29 3b 0a 20 20 69 66 28 20 72 63  )&pP1);.  if( rc
28460 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28470 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74  *pMeta = get4byt
28480 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a  e(&pP1[36 + idx*
28490 34 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61  4]);.  sqlite3pa
284a0 67 65 72 5f 75 6e 72 65 66 28 70 50 31 29 3b 0a  ger_unref(pP1);.
284b0 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63  .  /* If autovac
284c0 75 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65  uumed is disable
284d0 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20  d in this build 
284e0 62 75 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  but we are tryin
284f0 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73  g to .  ** acces
28500 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65  s an autovacuume
28510 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  d database, then
28520 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62 61   make the databa
28530 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20  se readonly. .  
28540 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
28550 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
28560 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26  .  if( idx==4 &&
28570 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d   *pMeta>0 ) pBt-
28580 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23  >readOnly = 1;.#
28590 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
285a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
285b0 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69  .** Write meta-i
285c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20  nformation back 
285d0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
285e0 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a  e.  Meta[0] is.*
285f0 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20  * read-only and 
28600 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74  may not be writt
28610 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
28620 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
28630 61 28 42 74 72 65 65 20 2a 70 42 74 2c 20 69 6e  a(Btree *pBt, in
28640 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61  t idx, u32 iMeta
28650 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
28660 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72  ar *pP1;.  int r
28670 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  c;.  assert( idx
28680 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29  >=1 && idx<=15 )
28690 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
286a0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
286b0 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
286c0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
286d0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
286e0 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
286f0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
28700 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a  t->pPage1!=0 );.
28710 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
28720 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  ge1->aData;.  rc
28730 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
28740 77 72 69 74 65 28 70 50 31 29 3b 0a 20 20 69 66  write(pP1);.  if
28750 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
28760 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
28770 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69  1[36 + idx*4], i
28780 4d 65 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Meta);.  return 
28790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
287a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
287b0 6c 61 67 20 62 79 74 65 20 61 74 20 74 68 65 20  lag byte at the 
287c0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
287d0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20 63   page that the c
287e0 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72  ursor.** is curr
287f0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
28800 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
28810 33 42 74 72 65 65 46 6c 61 67 73 28 42 74 43 75  3BtreeFlags(BtCu
28820 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
28830 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
28840 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 72  pCur->pPage;.  r
28850 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50  eturn pPage ? pP
28860 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
28870 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30  ->hdrOffset] : 0
28880 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
28890 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
288a0 72 69 6e 74 20 61 20 64 69 73 61 73 73 65 6d 62  rint a disassemb
288b0 6c 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ly of the given 
288c0 70 61 67 65 20 6f 6e 20 73 74 61 6e 64 61 72 64  page on standard
288d0 20 6f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72   output.  This r
288e0 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 75 73 65  outine.** is use
288f0 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
28900 61 6e 64 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  and testing only
28910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28920 62 74 72 65 65 50 61 67 65 44 75 6d 70 28 42 74  btreePageDump(Bt
28930 72 65 65 20 2a 70 42 74 2c 20 69 6e 74 20 70 67  ree *pBt, int pg
28940 6e 6f 2c 20 69 6e 74 20 72 65 63 75 72 73 69 76  no, int recursiv
28950 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  e, MemPage *pPar
28960 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
28970 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
28980 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 63 3b  ;.  int i, j, c;
28990 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 0a 20 20  .  int nFree;.  
289a0 75 31 36 20 69 64 78 3b 0a 20 20 69 6e 74 20 68  u16 idx;.  int h
289b0 64 72 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  dr;.  int nCell;
289c0 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20  .  int isInit;. 
289d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
289e0 64 61 74 61 3b 0a 20 20 63 68 61 72 20 72 61 6e  data;.  char ran
289f0 67 65 5b 32 30 5d 3b 0a 20 20 75 6e 73 69 67 6e  ge[20];.  unsign
28a00 65 64 20 63 68 61 72 20 70 61 79 6c 6f 61 64 5b  ed char payload[
28a10 32 30 5d 3b 0a 0a 20 20 72 63 20 3d 20 67 65 74  20];..  rc = get
28a20 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
28a30 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20  pgno, &pPage);. 
28a40 20 69 73 49 6e 69 74 20 3d 20 70 50 61 67 65 2d   isInit = pPage-
28a50 3e 69 73 49 6e 69 74 3b 0a 20 20 69 66 28 20 70  >isInit;.  if( p
28a60 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Page->isInit==0 
28a70 29 7b 0a 20 20 20 20 69 6e 69 74 50 61 67 65 28  ){.    initPage(
28a80 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b  pPage, pParent);
28a90 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b  .  }.  if( rc ){
28aa0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
28ab0 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67    }.  hdr = pPag
28ac0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
28ad0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
28ae0 61 74 61 3b 0a 20 20 63 20 3d 20 64 61 74 61 5b  ata;.  c = data[
28af0 68 64 72 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 69  hdr];.  pPage->i
28b00 6e 74 4b 65 79 20 3d 20 28 63 20 26 20 28 50 54  ntKey = (c & (PT
28b10 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
28b20 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70 50  FDATA))!=0;.  pP
28b30 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20  age->zeroData = 
28b40 28 63 20 26 20 50 54 46 5f 5a 45 52 4f 44 41 54  (c & PTF_ZERODAT
28b50 41 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e  A)!=0;.  pPage->
28b60 6c 65 61 66 44 61 74 61 20 3d 20 28 63 20 26 20  leafData = (c & 
28b70 50 54 46 5f 4c 45 41 46 44 41 54 41 29 21 3d 30  PTF_LEAFDATA)!=0
28b80 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
28b90 3d 20 28 63 20 26 20 50 54 46 5f 4c 45 41 46 29  = (c & PTF_LEAF)
28ba0 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 68 61  !=0;.  pPage->ha
28bb0 73 44 61 74 61 20 3d 20 21 28 70 50 61 67 65 2d  sData = !(pPage-
28bc0 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20 28 21 70  >zeroData || (!p
28bd0 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20 70 50  Page->leaf && pP
28be0 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 29 29 3b  age->leafData));
28bf0 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  .  nCell = get2b
28c00 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
28c10 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
28c20 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 64  gPrintf("PAGE %d
28c30 3a 20 20 66 6c 61 67 73 3d 30 78 25 30 32 78 20  :  flags=0x%02x 
28c40 20 66 72 61 67 3d 25 64 20 20 20 70 61 72 65 6e   frag=%d   paren
28c50 74 3d 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 0a 20  t=%d\n", pgno,. 
28c60 20 20 20 64 61 74 61 5b 68 64 72 5d 2c 20 64 61     data[hdr], da
28c70 74 61 5b 68 64 72 2b 37 5d 2c 20 0a 20 20 20 20  ta[hdr+7], .    
28c80 28 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 26  (pPage->isInit &
28c90 26 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  & pPage->pParent
28ca0 29 20 3f 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ) ? pPage->pPare
28cb0 6e 74 2d 3e 70 67 6e 6f 20 3a 20 30 29 3b 0a 20  nt->pgno : 0);. 
28cc0 20 61 73 73 65 72 74 28 20 68 64 72 20 3d 3d 20   assert( hdr == 
28cd0 28 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  (pgno==1 ? 100 :
28ce0 20 30 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 68   0) );.  idx = h
28cf0 64 72 20 2b 20 31 32 20 2d 20 70 50 61 67 65 2d  dr + 12 - pPage-
28d00 3e 6c 65 61 66 2a 34 3b 0a 20 20 66 6f 72 28 69  >leaf*4;.  for(i
28d10 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
28d20 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
28d30 69 6e 66 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 63  info;.    Pgno c
28d40 68 69 6c 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e  hild;.    unsign
28d50 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
28d60 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
28d70 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 61  int addr;..    a
28d80 64 64 72 20 3d 20 67 65 74 32 62 79 74 65 28 26  ddr = get2byte(&
28d90 64 61 74 61 5b 69 64 78 20 2b 20 32 2a 69 5d 29  data[idx + 2*i])
28da0 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 64  ;.    pCell = &d
28db0 61 74 61 5b 61 64 64 72 5d 3b 0a 20 20 20 20 70  ata[addr];.    p
28dc0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
28dd0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
28de0 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e  ;.    sz = info.
28df0 6e 53 69 7a 65 3b 0a 20 20 20 20 73 70 72 69 6e  nSize;.    sprin
28e00 74 66 28 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64  tf(range,"%d..%d
28e10 22 2c 20 61 64 64 72 2c 20 61 64 64 72 2b 73 7a  ", addr, addr+sz
28e20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  -1);.    if( pPa
28e30 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
28e40 20 20 63 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20    child = 0;.   
28e50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
28e60 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 70  ild = get4byte(p
28e70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cell);.    }.   
28e80 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61   sz = info.nData
28e90 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
28ea0 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d  ->intKey ) sz +=
28eb0 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20   info.nKey;.    
28ec0 69 66 28 20 73 7a 3e 73 69 7a 65 6f 66 28 70 61  if( sz>sizeof(pa
28ed0 79 6c 6f 61 64 29 2d 31 20 29 20 73 7a 20 3d 20  yload)-1 ) sz = 
28ee0 73 69 7a 65 6f 66 28 70 61 79 6c 6f 61 64 29 2d  sizeof(payload)-
28ef0 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 61  1;.    memcpy(pa
28f00 79 6c 6f 61 64 2c 20 26 70 43 65 6c 6c 5b 69 6e  yload, &pCell[in
28f10 66 6f 2e 6e 48 65 61 64 65 72 5d 2c 20 73 7a 29  fo.nHeader], sz)
28f20 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
28f30 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  <sz; j++){.     
28f40 20 69 66 28 20 70 61 79 6c 6f 61 64 5b 6a 5d 3c   if( payload[j]<
28f50 30 78 32 30 20 7c 7c 20 70 61 79 6c 6f 61 64 5b  0x20 || payload[
28f60 6a 5d 3e 30 78 37 66 20 29 20 70 61 79 6c 6f 61  j]>0x7f ) payloa
28f70 64 5b 6a 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20  d[j] = '.';.    
28f80 7d 0a 20 20 20 20 70 61 79 6c 6f 61 64 5b 73 7a  }.    payload[sz
28f90 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
28fa0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
28fb0 20 20 20 20 20 22 63 65 6c 6c 20 25 32 64 3a 20       "cell %2d: 
28fc0 69 3d 25 2d 31 30 73 20 63 68 6c 64 3d 25 2d 34  i=%-10s chld=%-4
28fd0 64 20 6e 6b 3d 25 2d 34 6c 6c 64 20 6e 64 3d 25  d nk=%-4lld nd=%
28fe0 2d 34 64 20 70 61 79 6c 6f 61 64 3d 25 73 5c 6e  -4d payload=%s\n
28ff0 22 2c 0a 20 20 20 20 20 20 69 2c 20 72 61 6e 67  ",.      i, rang
29000 65 2c 20 63 68 69 6c 64 2c 20 69 6e 66 6f 2e 6e  e, child, info.n
29010 4b 65 79 2c 20 69 6e 66 6f 2e 6e 44 61 74 61 2c  Key, info.nData,
29020 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 29 3b 0a   payload.    );.
29030 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
29040 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 73 71  ->leaf ){.    sq
29050 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
29060 28 22 72 69 67 68 74 5f 63 68 69 6c 64 3a 20 25  ("right_child: %
29070 64 5c 6e 22 2c 20 67 65 74 34 62 79 74 65 28 26  d\n", get4byte(&
29080 64 61 74 61 5b 68 64 72 2b 38 5d 29 29 3b 0a 20  data[hdr+8]));. 
29090 20 7d 0a 20 20 6e 46 72 65 65 20 3d 20 30 3b 0a   }.  nFree = 0;.
290a0 20 20 69 20 3d 20 30 3b 0a 20 20 69 64 78 20 3d    i = 0;.  idx =
290b0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
290c0 68 64 72 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65  hdr+1]);.  while
290d0 28 20 69 64 78 3e 30 20 26 26 20 69 64 78 3c 70  ( idx>0 && idx<p
290e0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
290f0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74  eSize ){.    int
29100 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26   sz = get2byte(&
29110 64 61 74 61 5b 69 64 78 2b 32 5d 29 3b 0a 20 20  data[idx+2]);.  
29120 20 20 73 70 72 69 6e 74 66 28 72 61 6e 67 65 2c    sprintf(range,
29130 22 25 64 2e 2e 25 64 22 2c 20 69 64 78 2c 20 69  "%d..%d", idx, i
29140 64 78 2b 73 7a 2d 31 29 3b 0a 20 20 20 20 6e 46  dx+sz-1);.    nF
29150 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 73  ree += sz;.    s
29160 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
29170 66 28 22 66 72 65 65 62 6c 6f 63 6b 20 25 32 64  f("freeblock %2d
29180 3a 20 69 3d 25 2d 31 30 73 20 73 69 7a 65 3d 25  : i=%-10s size=%
29190 2d 34 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c  -4d total=%d\n",
291a0 0a 20 20 20 20 20 20 20 69 2c 20 72 61 6e 67 65  .       i, range
291b0 2c 20 73 7a 2c 20 6e 46 72 65 65 29 3b 0a 20 20  , sz, nFree);.  
291c0 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65    idx = get2byte
291d0 28 26 64 61 74 61 5b 69 64 78 5d 29 3b 0a 20 20  (&data[idx]);.  
291e0 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    i++;.  }.  if(
291f0 20 69 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 73   idx!=0 ){.    s
29200 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
29210 66 28 22 45 52 52 4f 52 3a 20 6e 65 78 74 20 66  f("ERROR: next f
29220 72 65 65 62 6c 6f 63 6b 20 69 6e 64 65 78 20 6f  reeblock index o
29230 75 74 20 6f 66 20 72 61 6e 67 65 3a 20 25 64 5c  ut of range: %d\
29240 6e 22 2c 20 69 64 78 29 3b 0a 20 20 7d 0a 20 20  n", idx);.  }.  
29250 69 66 28 20 72 65 63 75 72 73 69 76 65 20 26 26  if( recursive &&
29260 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
29270 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
29280 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
29290 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
292a0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
292b0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
292c0 20 20 20 20 62 74 72 65 65 50 61 67 65 44 75 6d      btreePageDum
292d0 70 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  p(pBt, get4byte(
292e0 70 43 65 6c 6c 29 2c 20 31 2c 20 70 50 61 67 65  pCell), 1, pPage
292f0 29 3b 0a 20 20 20 20 20 20 69 64 78 20 3d 20 67  );.      idx = g
29300 65 74 32 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et2byte(pCell);.
29310 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 50      }.    btreeP
29320 61 67 65 44 75 6d 70 28 70 42 74 2c 20 67 65 74  ageDump(pBt, get
29330 34 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  4byte(&data[hdr+
29340 38 5d 29 2c 20 31 2c 20 70 50 61 67 65 29 3b 0a  8]), 1, pPage);.
29350 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49    }.  pPage->isI
29360 6e 69 74 20 3d 20 69 73 49 6e 69 74 3b 0a 20 20  nit = isInit;.  
29370 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
29380 65 66 28 64 61 74 61 29 3b 0a 20 20 66 66 6c 75  ef(data);.  fflu
29390 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 72 65  sh(stdout);.  re
293a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
293b0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
293c0 65 65 50 61 67 65 44 75 6d 70 28 42 74 72 65 65  eePageDump(Btree
293d0 20 2a 70 42 74 2c 20 69 6e 74 20 70 67 6e 6f 2c   *pBt, int pgno,
293e0 20 69 6e 74 20 72 65 63 75 72 73 69 76 65 29 7b   int recursive){
293f0 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50  .  return btreeP
29400 61 67 65 44 75 6d 70 28 70 42 74 2c 20 70 67 6e  ageDump(pBt, pgn
29410 6f 2c 20 72 65 63 75 72 73 69 76 65 2c 20 30 29  o, recursive, 0)
29420 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
29430 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
29440 2a 0a 2a 2a 20 46 69 6c 6c 20 61 52 65 73 75 6c  *.** Fill aResul
29450 74 5b 5d 20 77 69 74 68 20 69 6e 66 6f 72 6d 61  t[] with informa
29460 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 65  tion about the e
29470 6e 74 72 79 20 61 6e 64 20 70 61 67 65 20 74 68  ntry and page th
29480 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  at the.** cursor
29490 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
294a0 0a 2a 2a 20 0a 2a 2a 20 20 20 61 52 65 73 75 6c  .** .**   aResul
294b0 74 5b 30 5d 20 3d 20 20 54 68 65 20 70 61 67 65  t[0] =  The page
294c0 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65   number.**   aRe
294d0 73 75 6c 74 5b 31 5d 20 3d 20 20 54 68 65 20 65  sult[1] =  The e
294e0 6e 74 72 79 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  ntry number.**  
294f0 20 61 52 65 73 75 6c 74 5b 32 5d 20 3d 20 20 54   aResult[2] =  T
29500 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65  otal number of e
29510 6e 74 72 69 65 73 20 6f 6e 20 74 68 69 73 20 70  ntries on this p
29520 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  age.**   aResult
29530 5b 33 5d 20 3d 20 20 43 65 6c 6c 20 73 69 7a 65  [3] =  Cell size
29540 20 28 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20   (local payload 
29550 2b 20 68 65 61 64 65 72 29 0a 2a 2a 20 20 20 61  + header).**   a
29560 52 65 73 75 6c 74 5b 34 5d 20 3d 20 20 4e 75 6d  Result[4] =  Num
29570 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
29580 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a  s on this page.*
29590 2a 20 20 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d  *   aResult[5] =
295a0 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65    Number of free
295b0 20 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 70   blocks on the p
295c0 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  age.**   aResult
295d0 5b 36 5d 20 3d 20 20 54 6f 74 61 6c 20 70 61 79  [6] =  Total pay
295e0 6c 6f 61 64 20 73 69 7a 65 20 28 6c 6f 63 61 6c  load size (local
295f0 20 2b 20 6f 76 65 72 66 6c 6f 77 29 0a 2a 2a 20   + overflow).** 
29600 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 20    aResult[7] =  
29610 48 65 61 64 65 72 20 73 69 7a 65 20 69 6e 20 62  Header size in b
29620 79 74 65 73 0a 2a 2a 20 20 20 61 52 65 73 75 6c  ytes.**   aResul
29630 74 5b 38 5d 20 3d 20 20 4c 6f 63 61 6c 20 70 61  t[8] =  Local pa
29640 79 6c 6f 61 64 20 73 69 7a 65 0a 2a 2a 20 20 20  yload size.**   
29650 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 20 50 61  aResult[9] =  Pa
29660 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
29670 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
29680 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
29690 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
296a0 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69  gging only..*/.i
296b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
296c0 75 72 73 6f 72 49 6e 66 6f 28 42 74 43 75 72 73  ursorInfo(BtCurs
296d0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 61  or *pCur, int *a
296e0 52 65 73 75 6c 74 2c 20 69 6e 74 20 75 70 43 6e  Result, int upCn
296f0 74 29 7b 0a 20 20 69 6e 74 20 63 6e 74 2c 20 69  t){.  int cnt, i
29700 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
29710 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
29720 67 65 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 74  ge;.  BtCursor t
29730 6d 70 43 75 72 3b 0a 0a 20 20 70 61 67 65 49 6e  mpCur;..  pageIn
29740 74 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a  tegrity(pPage);.
29750 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
29760 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 67 65 74  >isInit );.  get
29770 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c  TempCursor(pCur,
29780 20 26 74 6d 70 43 75 72 29 3b 0a 20 20 77 68 69   &tmpCur);.  whi
29790 6c 65 28 20 75 70 43 6e 74 2d 2d 20 29 7b 0a 20  le( upCnt-- ){. 
297a0 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
297b0 26 74 6d 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  &tmpCur);.  }.  
297c0 70 50 61 67 65 20 3d 20 74 6d 70 43 75 72 2e 70  pPage = tmpCur.p
297d0 50 61 67 65 3b 0a 20 20 70 61 67 65 49 6e 74 65  Page;.  pageInte
297e0 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20 20  grity(pPage);.  
297f0 61 52 65 73 75 6c 74 5b 30 5d 20 3d 20 73 71 6c  aResult[0] = sql
29800 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75  ite3pager_pagenu
29810 6d 62 65 72 28 70 50 61 67 65 2d 3e 61 44 61 74  mber(pPage->aDat
29820 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 52  a);.  assert( aR
29830 65 73 75 6c 74 5b 30 5d 3d 3d 70 50 61 67 65 2d  esult[0]==pPage-
29840 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 52 65 73 75  >pgno );.  aResu
29850 6c 74 5b 31 5d 20 3d 20 74 6d 70 43 75 72 2e 69  lt[1] = tmpCur.i
29860 64 78 3b 0a 20 20 61 52 65 73 75 6c 74 5b 32 5d  dx;.  aResult[2]
29870 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
29880 0a 20 20 69 66 28 20 74 6d 70 43 75 72 2e 69 64  .  if( tmpCur.id
29890 78 3e 3d 30 20 26 26 20 74 6d 70 43 75 72 2e 69  x>=0 && tmpCur.i
298a0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
298b0 29 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  ){.    getCellIn
298c0 66 6f 28 26 74 6d 70 43 75 72 29 3b 0a 20 20 20  fo(&tmpCur);.   
298d0 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d 20 74 6d   aResult[3] = tm
298e0 70 43 75 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65 3b  pCur.info.nSize;
298f0 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 36 5d 20  .    aResult[6] 
29900 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 44  = tmpCur.info.nD
29910 61 74 61 3b 0a 20 20 20 20 61 52 65 73 75 6c 74  ata;.    aResult
29920 5b 37 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66  [7] = tmpCur.inf
29930 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 20 20 61  o.nHeader;.    a
29940 52 65 73 75 6c 74 5b 38 5d 20 3d 20 74 6d 70 43  Result[8] = tmpC
29950 75 72 2e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  ur.info.nLocal;.
29960 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65    }else{.    aRe
29970 73 75 6c 74 5b 33 5d 20 3d 20 30 3b 0a 20 20 20  sult[3] = 0;.   
29980 20 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 30 3b   aResult[6] = 0;
29990 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20  .    aResult[7] 
299a0 3d 20 30 3b 0a 20 20 20 20 61 52 65 73 75 6c 74  = 0;.    aResult
299b0 5b 38 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  [8] = 0;.  }.  a
299c0 52 65 73 75 6c 74 5b 34 5d 20 3d 20 70 50 61 67  Result[4] = pPag
299d0 65 2d 3e 6e 46 72 65 65 3b 0a 20 20 63 6e 74 20  e->nFree;.  cnt 
299e0 3d 20 30 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  = 0;.  idx = get
299f0 32 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  2byte(&pPage->aD
29a00 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
29a10 66 73 65 74 2b 31 5d 29 3b 0a 20 20 77 68 69 6c  fset+1]);.  whil
29a20 65 28 20 69 64 78 3e 30 20 26 26 20 69 64 78 3c  e( idx>0 && idx<
29a30 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
29a40 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 63 6e  leSize ){.    cn
29a50 74 2b 2b 3b 0a 20 20 20 20 69 64 78 20 3d 20 67  t++;.    idx = g
29a60 65 74 32 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et2byte(&pPage->
29a70 61 44 61 74 61 5b 69 64 78 5d 29 3b 0a 20 20 7d  aData[idx]);.  }
29a80 0a 20 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20  .  aResult[5] = 
29a90 63 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65  cnt;.  if( pPage
29aa0 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20  ->pParent==0 || 
29ab0 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  isRootPage(pPage
29ac0 29 20 29 7b 0a 20 20 20 20 61 52 65 73 75 6c 74  ) ){.    aResult
29ad0 5b 39 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  [9] = 0;.  }else
29ae0 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 39 5d  {.    aResult[9]
29af0 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
29b00 74 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  t->pgno;.  }.  r
29b10 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72  eleaseTempCursor
29b20 28 26 74 6d 70 43 75 72 29 3b 0a 20 20 72 65 74  (&tmpCur);.  ret
29b30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
29b40 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
29b50 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 72 20  eturn the pager 
29b60 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
29b70 61 20 42 54 72 65 65 2e 20 20 54 68 69 73 20 72  a BTree.  This r
29b80 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
29b90 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
29ba0 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
29bb0 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69  ..*/.Pager *sqli
29bc0 74 65 33 42 74 72 65 65 50 61 67 65 72 28 42 74  te3BtreePager(Bt
29bd0 72 65 65 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  ree *pBt){.  ret
29be0 75 72 6e 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  urn pBt->pPager;
29bf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73  .}../*.** This s
29c00 74 72 75 63 74 75 72 65 20 69 73 20 70 61 73 73  tructure is pass
29c10 65 64 20 61 72 6f 75 6e 64 20 74 68 72 6f 75 67  ed around throug
29c20 68 20 61 6c 6c 20 74 68 65 20 73 61 6e 69 74 79  h all the sanity
29c30 20 63 68 65 63 6b 69 6e 67 20 72 6f 75 74 69 6e   checking routin
29c40 65 73 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  es.** in order t
29c50 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  o keep track of 
29c60 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 73 74 61 74  some global stat
29c70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  e information..*
29c80 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
29c90 20 49 6e 74 65 67 72 69 74 79 43 6b 20 49 6e 74   IntegrityCk Int
29ca0 65 67 72 69 74 79 43 6b 3b 0a 73 74 72 75 63 74  egrityCk;.struct
29cb0 20 49 6e 74 65 67 72 69 74 79 43 6b 20 7b 0a 20   IntegrityCk {. 
29cc0 20 42 74 72 65 65 20 2a 70 42 74 3b 20 20 20 20   Btree *pBt;    
29cd0 2f 2a 20 54 68 65 20 74 72 65 65 20 62 65 69 6e  /* The tree bein
29ce0 67 20 63 68 65 63 6b 65 64 20 6f 75 74 20 2a 2f  g checked out */
29cf0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
29d00 3b 20 2f 2a 20 54 68 65 20 61 73 73 6f 63 69 61  ; /* The associa
29d10 74 65 64 20 70 61 67 65 72 2e 20 20 41 6c 73 6f  ted pager.  Also
29d20 20 61 63 63 65 73 73 69 62 6c 65 20 62 79 20 70   accessible by p
29d30 42 74 2d 3e 70 50 61 67 65 72 20 2a 2f 0a 20 20  Bt->pPager */.  
29d40 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 2f  int nPage;     /
29d50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
29d60 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
29d70 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 6e 52 65  e */.  int *anRe
29d80 66 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  f;    /* Number 
29d90 6f 66 20 74 69 6d 65 73 20 65 61 63 68 20 70 61  of times each pa
29da0 67 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64  ge is referenced
29db0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   */.  char *zErr
29dc0 4d 73 67 3b 20 2f 2a 20 41 6e 20 65 72 72 6f 72  Msg; /* An error
29dd0 20 6d 65 73 73 61 67 65 2e 20 20 4e 55 4c 4c 20   message.  NULL 
29de0 6f 66 20 6e 6f 20 65 72 72 6f 72 73 20 73 65 65  of no errors see
29df0 6e 2e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65  n. */.};..#ifnde
29e00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
29e10 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
29e20 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73  .** Append a mes
29e30 73 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f  sage to the erro
29e40 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67  r message string
29e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29e60 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
29e70 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
29e80 70 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a  pCheck,.  char *
29e90 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63  zMsg1,.  const c
29ea0 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20  har *zFormat,.  
29eb0 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74  ....){.  va_list
29ec0 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73   ap;.  char *zMs
29ed0 67 32 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  g2;.  va_start(a
29ee0 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
29ef0 4d 73 67 32 20 3d 20 73 71 6c 69 74 65 33 56 4d  Msg2 = sqlite3VM
29f00 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  Printf(zFormat, 
29f10 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
29f20 29 3b 0a 20 20 69 66 28 20 7a 4d 73 67 31 3d 3d  );.  if( zMsg1==
29f30 30 20 29 20 7a 4d 73 67 31 20 3d 20 22 22 3b 0a  0 ) zMsg1 = "";.
29f40 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 7a 45    if( pCheck->zE
29f50 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 63 68 61  rrMsg ){.    cha
29f60 72 20 2a 7a 4f 6c 64 20 3d 20 70 43 68 65 63 6b  r *zOld = pCheck
29f70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70  ->zErrMsg;.    p
29f80 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d  Check->zErrMsg =
29f90 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   0;.    sqlite3S
29fa0 65 74 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b  etString(&pCheck
29fb0 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c  ->zErrMsg, zOld,
29fc0 20 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d   "\n", zMsg1, zM
29fd0 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  sg2, (char*)0);.
29fe0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
29ff0 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Old);.  }else{. 
2a000 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
2a010 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72  ing(&pCheck->zEr
2a020 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73  rMsg, zMsg1, zMs
2a030 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  g2, (char*)0);. 
2a040 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
2a050 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69 66  zMsg2);.}.#endif
2a060 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2a070 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
2a080 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2a090 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
2a0a0 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64  Y_CHECK./*.** Ad
2a0b0 64 20 31 20 74 6f 20 74 68 65 20 72 65 66 65 72  d 1 to the refer
2a0c0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70  ence count for p
2a0d0 61 67 65 20 69 50 61 67 65 2e 20 20 49 66 20 74  age iPage.  If t
2a0e0 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
2a0f0 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  d.** reference t
2a100 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64 64 20  o the page, add 
2a110 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2a120 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72   to pCheck->zErr
2a130 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31  Msg..** Return 1
2a140 20 69 66 20 74 68 65 72 65 20 61 72 65 20 32 20   if there are 2 
2a150 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e  ore more referen
2a160 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
2a170 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74  and 0 if.** if t
2a180 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
2a190 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2a1a0 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  e page..**.** Al
2a1b0 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  so check that th
2a1c0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
2a1d0 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73   in bounds..*/.s
2a1e0 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
2a1f0 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  ef(IntegrityCk *
2a200 70 43 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67  pCheck, int iPag
2a210 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78  e, char *zContex
2a220 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d  t){.  if( iPage=
2a230 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
2a240 20 69 66 28 20 69 50 61 67 65 3e 70 43 68 65 63   if( iPage>pChec
2a250 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67  k->nPage || iPag
2a260 65 3c 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  e<0 ){.    check
2a270 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
2a280 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76  , zContext, "inv
2a290 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72  alid page number
2a2a0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
2a2b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2a2c0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e    if( pCheck->an
2a2d0 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b  Ref[iPage]==1 ){
2a2e0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
2a2f0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
2a300 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72  text, "2nd refer
2a310 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22  ence to page %d"
2a320 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65  , iPage);.    re
2a330 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2a340 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61  turn  (pCheck->a
2a350 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31  nRef[iPage]++)>1
2a360 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
2a370 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2a380 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  UUM./*.** Check 
2a390 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69  that the entry i
2a3a0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
2a3b0 70 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c  p for page iChil
2a3c0 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61  d maps to .** pa
2a3d0 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e  ge iParent, poin
2a3e0 74 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65  ter type ptrType
2a3f0 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64  . If not, append
2a400 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2a410 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a  e.** to pCheck..
2a420 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2a430 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e  heckPtrmap(.  In
2a440 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
2a450 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74  k,   /* Integrit
2a460 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20  y check context 
2a470 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
2a480 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
2a490 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72  hild page number
2a4a0 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
2a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a4c0 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72  Expected pointer
2a4d0 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50   map type */.  P
2a4e0 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20  gno iParent,    
2a4f0 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
2a500 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  d pointer map pa
2a510 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
2a520 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
2a530 74 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20  text         /* 
2a540 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70 74  Context descript
2a550 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72  ion (used for er
2a560 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20  ror msg) */.){. 
2a570 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50   int rc;.  u8 eP
2a580 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e  trmapType;.  Pgn
2a590 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b  o iPtrmapParent;
2a5a0 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47  ..  rc = ptrmapG
2a5b0 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20  et(pCheck->pBt, 
2a5c0 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70  iChild, &ePtrmap
2a5d0 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61  Type, &iPtrmapPa
2a5e0 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
2a5f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a600 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
2a610 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
2a620 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65  t, "Failed to re
2a630 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64  ad ptrmap key=%d
2a640 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ", iChild);.    
2a650 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
2a660 66 28 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d  f( ePtrmapType!=
2a670 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70  eType || iPtrmap
2a680 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20  Parent!=iParent 
2a690 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
2a6a0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
2a6b0 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22  ontext, .      "
2a6c0 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72  Bad ptr map entr
2a6d0 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65  y key=%d expecte
2a6e0 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25  d=(%d,%d) got=(%
2a6f0 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69  d,%d)", .      i
2a700 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50  Child, eType, iP
2a710 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79  arent, ePtrmapTy
2a720 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e  pe, iPtrmapParen
2a730 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  t);.  }.}.#endif
2a740 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
2a750 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
2a760 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f  he freelist or o
2a770 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
2a780 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69  ge list..** Veri
2a790 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
2a7a0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
2a7b0 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f  he list is N..*/
2a7c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
2a7d0 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72  ckList(.  Integr
2a7e0 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
2a7f0 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65  /* Integrity che
2a800 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  cking context */
2a810 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73  .  int isFreeLis
2a820 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  t,       /* True
2a830 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e   for a freelist.
2a840 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72    False for over
2a850 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a  flow page list *
2a860 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20  /.  int iPage,  
2a870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2a880 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72  e number for fir
2a890 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  st page in the l
2a8a0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  ist */.  int N, 
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a8c0 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65  * Expected numbe
2a8d0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
2a8e0 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72  e list */.  char
2a8f0 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20   *zContext      
2a900 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
2a910 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
2a920 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
2a930 20 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20   int expected = 
2a940 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20  N;.  int iFirst 
2a950 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65  = iPage;.  while
2a960 28 20 4e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( N-- > 0 ){.   
2a970 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2a980 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 69  pOvfl;.    if( i
2a990 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20  Page<1 ){.      
2a9a0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
2a9b0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
2a9c0 0a 20 20 20 20 20 20 20 20 20 22 25 64 20 6f 66  .         "%d of
2a9d0 20 25 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e   %d pages missin
2a9e0 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20  g from overflow 
2a9f0 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74  list starting at
2aa00 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
2aa10 4e 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69  N+1, expected, i
2aa20 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72  First);.      br
2aa30 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
2aa40 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65  f( checkRef(pChe
2aa50 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  ck, iPage, zCont
2aa60 65 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ext) ) break;.  
2aa70 20 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67    if( sqlite3pag
2aa80 65 72 5f 67 65 74 28 70 43 68 65 63 6b 2d 3e 70  er_get(pCheck->p
2aa90 50 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61  Pager, (Pgno)iPa
2aaa0 67 65 2c 20 28 76 6f 69 64 2a 2a 29 26 70 4f 76  ge, (void**)&pOv
2aab0 66 6c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  fl) ){.      che
2aac0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
2aad0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66  ck, zContext, "f
2aae0 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67  ailed to get pag
2aaf0 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
2ab00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2ab10 7d 0a 20 20 20 20 69 66 28 20 69 73 46 72 65 65  }.    if( isFree
2ab20 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  List ){.      in
2ab30 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26  t n = get4byte(&
2ab40 70 4f 76 66 6c 5b 34 5d 29 3b 0a 23 69 66 6e 64  pOvfl[4]);.#ifnd
2ab50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2ab60 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2ab70 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d  if( pCheck->pBt-
2ab80 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2ab90 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
2aba0 61 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ap(pCheck, iPage
2abb0 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
2abc0 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  E, 0, zContext);
2abd0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2abe0 20 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65        if( n>pChe
2abf0 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ck->pBt->usableS
2ac00 69 7a 65 2f 34 2d 38 20 29 7b 0a 20 20 20 20 20  ize/4-8 ){.     
2ac10 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
2ac20 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
2ac30 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22  xt,.           "
2ac40 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f  freelist leaf co
2ac50 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70  unt too big on p
2ac60 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b  age %d", iPage);
2ac70 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20  .        N--;.  
2ac80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ac90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
2aca0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2acb0 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20   Pgno iFreePage 
2acc0 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66  = get4byte(&pOvf
2acd0 6c 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64  l[8+i*4]);.#ifnd
2ace0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2acf0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2ad00 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
2ad10 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2ad20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
2ad30 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
2ad40 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 50 54  k, iFreePage, PT
2ad50 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
2ad60 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
2ad70 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
2ad80 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 52            checkR
2ad90 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65  ef(pCheck, iFree
2ada0 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
2adb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2adc0 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20     N -= n;.     
2add0 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
2ade0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2adf0 4f 56 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65  OVACUUM.    else
2ae00 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
2ae10 69 73 20 64 61 74 61 62 61 73 65 20 73 75 70 70  is database supp
2ae20 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
2ae30 20 61 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f   and iPage is no
2ae40 74 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20  t the last.     
2ae50 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
2ae60 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20   overflow list, 
2ae70 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  check that the p
2ae80 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
2ae90 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
2aea0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65  e following page
2aeb0 20 6d 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a   matches iPage..
2aec0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2aed0 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
2aee0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e  autoVacuum && N>
2aef0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  0 ){.        i =
2af00 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 29   get4byte(pOvfl)
2af10 3b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  ;.        checkP
2af20 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c  trmap(pCheck, i,
2af30 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
2af40 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  2, iPage, zConte
2af50 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
2af60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50   }.#endif.    iP
2af70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 70  age = get4byte(p
2af80 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ovfl);.    sqlit
2af90 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4f  e3pager_unref(pO
2afa0 76 66 6c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  vfl);.  }.}.#end
2afb0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2afc0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
2afd0 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
2afe0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
2aff0 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
2b000 44 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74  Do various sanit
2b010 79 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69  y checks on a si
2b020 6e 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74  ngle page of a t
2b030 72 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ree.  Return.** 
2b040 74 68 65 20 74 72 65 65 20 64 65 70 74 68 2e 20  the tree depth. 
2b050 20 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75   Root pages retu
2b060 72 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f  rn 0.  Parents o
2b070 66 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20  f root pages.** 
2b080 72 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f  return 1, and so
2b090 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54   forth..** .** T
2b0a0 68 65 73 65 20 63 68 65 63 6b 73 20 61 72 65 20  hese checks are 
2b0b0 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  done:.**.**     
2b0c0 20 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74   1.  Make sure t
2b0d0 68 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72  hat cells and fr
2b0e0 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20  eeblocks do not 
2b0f0 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20  overlap.**      
2b100 20 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20      but combine 
2b110 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f  to completely co
2b120 76 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  ver the page..**
2b130 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73    NO  2.  Make s
2b140 75 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72  ure cell keys ar
2b150 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20  e in order..**  
2b160 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72  NO  3.  Make sur
2b170 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73  e no key is less
2b180 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
2b190 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a  o zLowerBound..*
2b1a0 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20  *  NO  4.  Make 
2b1b0 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67  sure no key is g
2b1c0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
2b1d0 71 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f  qual to zUpperBo
2b1e0 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20  und..**      5. 
2b1f0 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
2b200 72 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77  rity of overflow
2b210 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20   pages..**      
2b220 36 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79 20  6.  Recursively 
2b230 63 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61  call checkTreePa
2b240 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72  ge on all childr
2b250 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20  en..**      7.  
2b260 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
2b270 64 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69  depth of all chi
2b280 6c 64 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d  ldren is the sam
2b290 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d  e..**      8.  M
2b2a0 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 70 61  ake sure this pa
2b2b0 67 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 33  ge is at least 3
2b2c0 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20  3% full or else 
2b2d0 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  it is.**        
2b2e0 20 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68    the root of th
2b2f0 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  e tree..*/.stati
2b300 63 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50  c int checkTreeP
2b310 61 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79  age(.  Integrity
2b320 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20  Ck *pCheck,  /* 
2b330 43 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20  Context for the 
2b340 73 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a  sanity check */.
2b350 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20    int iPage,    
2b360 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2b370 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
2b380 67 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  ge to check */. 
2b390 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
2b3a0 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74  t,     /* Parent
2b3b0 20 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20   page */.  char 
2b3c0 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 2c  *zParentContext,
2b3d0 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65   /* Parent conte
2b3e0 78 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c  xt */.  char *zL
2b3f0 6f 77 65 72 42 6f 75 6e 64 2c 20 20 20 20 2f 2a  owerBound,    /*
2b400 20 41 6c 6c 20 6b 65 79 73 20 73 68 6f 75 6c 64   All keys should
2b410 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2b420 20 74 68 69 73 2c 20 69 66 20 6e 6f 74 20 4e 55   this, if not NU
2b430 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 77  LL */.  int nLow
2b440 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er,           /*
2b450 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
2b460 63 74 65 72 73 20 69 6e 20 7a 4c 6f 77 65 72 42  cters in zLowerB
2b470 6f 75 6e 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ound */.  char *
2b480 7a 55 70 70 65 72 42 6f 75 6e 64 2c 20 20 20 20  zUpperBound,    
2b490 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 73 68 6f 75  /* All keys shou
2b4a0 6c 64 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ld be less than 
2b4b0 74 68 69 73 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  this, if not NUL
2b4c0 4c 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 70 70 65  L */.  int nUppe
2b4d0 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
2b4e0 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
2b4f0 74 65 72 73 20 69 6e 20 7a 55 70 70 65 72 42 6f  ters in zUpperBo
2b500 75 6e 64 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  und */.){.  MemP
2b510 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e  age *pPage;.  in
2b520 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68 2c 20  t i, rc, depth, 
2b530 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20  d2, pgno, cnt;. 
2b540 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53 74   int hdr, cellSt
2b550 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  art;.  int nCell
2b560 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20  ;.  u8 *data;.  
2b570 42 74 43 75 72 73 6f 72 20 63 75 72 3b 0a 20 20  BtCursor cur;.  
2b580 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e  Btree *pBt;.  in
2b590 74 20 6d 61 78 4c 6f 63 61 6c 2c 20 75 73 61 62  t maxLocal, usab
2b5a0 6c 65 53 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a  leSize;.  char z
2b5b0 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20  Context[100];.  
2b5c0 63 68 61 72 20 2a 68 69 74 3b 0a 0a 20 20 73 70  char *hit;..  sp
2b5d0 72 69 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20  rintf(zContext, 
2b5e0 22 50 61 67 65 20 25 64 3a 20 22 2c 20 69 50 61  "Page %d: ", iPa
2b5f0 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ge);..  /* Check
2b600 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 65   that the page e
2b610 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 63 75 72  xists.  */.  cur
2b620 2e 70 42 74 20 3d 20 70 42 74 20 3d 20 70 43 68  .pBt = pBt = pCh
2b630 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62  eck->pBt;.  usab
2b640 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
2b650 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  ableSize;.  if( 
2b660 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  iPage==0 ) retur
2b670 6e 20 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b  n 0;.  if( check
2b680 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67  Ref(pCheck, iPag
2b690 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78  e, zParentContex
2b6a0 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
2b6b0 20 69 66 28 20 28 72 63 20 3d 20 67 65 74 50 61   if( (rc = getPa
2b6c0 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50  ge(pBt, (Pgno)iP
2b6d0 61 67 65 2c 20 26 70 50 61 67 65 29 29 21 3d 30  age, &pPage))!=0
2b6e0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
2b6f0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
2b700 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
2b710 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 74  "unable to get t
2b720 68 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20 63  he page. error c
2b730 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20  ode=%d", rc);.  
2b740 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2b750 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
2b760 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3f 20 70  ge->leafData ? p
2b770 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3a 20 70 42  Bt->maxLeaf : pB
2b780 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 69  t->maxLocal;.  i
2b790 66 28 20 28 72 63 20 3d 20 69 6e 69 74 50 61 67  f( (rc = initPag
2b7a0 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  e(pPage, pParent
2b7b0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65  ))!=0 ){.    che
2b7c0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
2b7d0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69  ck, zContext, "i
2b7e0 6e 69 74 50 61 67 65 28 29 20 72 65 74 75 72 6e  nitPage() return
2b7f0 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64 22  s error code %d"
2b800 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c 65 61  , rc);.    relea
2b810 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2b820 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2b830 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74  ..  /* Check out
2b840 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a   all the cells..
2b850 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20 30    */.  depth = 0
2b860 3b 0a 20 20 63 75 72 2e 70 50 61 67 65 20 3d 20  ;.  cur.pPage = 
2b870 70 50 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30  pPage;.  for(i=0
2b880 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
2b890 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
2b8a0 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73  pCell;.    int s
2b8b0 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  z;.    CellInfo 
2b8c0 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  info;..    /* Ch
2b8d0 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72  eck payload over
2b8e0 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
2b8f0 2f 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 43  /.    sprintf(zC
2b900 6f 6e 74 65 78 74 2c 20 22 4f 6e 20 74 72 65 65  ontext, "On tree
2b910 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64   page %d cell %d
2b920 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a  : ", iPage, i);.
2b930 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2b940 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20  Cell(pPage,i);. 
2b950 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28     parseCellPtr(
2b960 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
2b970 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69  nfo);.    sz = i
2b980 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69  nfo.nData;.    i
2b990 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
2b9a0 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e  y ) sz += info.n
2b9b0 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e  Key;.    if( sz>
2b9c0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
2b9d0 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d       int nPage =
2b9e0 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63   (sz - info.nLoc
2b9f0 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20  al + usableSize 
2ba00 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65  - 5)/(usableSize
2ba10 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e   - 4);.      Pgn
2ba20 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74  o pgnoOvfl = get
2ba30 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
2ba40 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23  o.iOverflow]);.#
2ba50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ba60 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2ba70 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
2ba80 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2ba90 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
2baa0 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c  Check, pgnoOvfl,
2bab0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
2bac0 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  1, iPage, zConte
2bad0 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
2bae0 64 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c  dif.      checkL
2baf0 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70  ist(pCheck, 0, p
2bb00 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20  gnoOvfl, nPage, 
2bb10 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  zContext);.    }
2bb20 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73  ..    /* Check s
2bb30 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68  anity of left ch
2bb40 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ild page..    */
2bb50 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2bb60 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  >leaf ){.      p
2bb70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
2bb80 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
2bb90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2bba0 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
2bbb0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2bbc0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
2bbd0 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70  Ptrmap(pCheck, p
2bbe0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
2bbf0 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  E, iPage, zConte
2bc00 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
2bc10 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63  dif.      d2 = c
2bc20 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68  heckTreePage(pCh
2bc30 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a  eck,pgno,pPage,z
2bc40 43 6f 6e 74 65 78 74 2c 30 2c 30 2c 30 2c 30 29  Context,0,0,0,0)
2bc50 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20  ;.      if( i>0 
2bc60 26 26 20 64 32 21 3d 64 65 70 74 68 20 29 7b 0a  && d2!=depth ){.
2bc70 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
2bc80 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
2bc90 43 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c 64 20  Context, "Child 
2bca0 70 61 67 65 20 64 65 70 74 68 20 64 69 66 66 65  page depth diffe
2bcb0 72 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs");.      }.  
2bcc0 20 20 20 20 64 65 70 74 68 20 3d 20 64 32 3b 0a      depth = d2;.
2bcd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2bce0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2bcf0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2bd00 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2bd10 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2bd20 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73 70 72 69  et+8]);.    spri
2bd30 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22 4f  ntf(zContext, "O
2bd40 6e 20 70 61 67 65 20 25 64 20 61 74 20 72 69 67  n page %d at rig
2bd50 68 74 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61  ht child: ", iPa
2bd60 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge);.#ifndef SQL
2bd70 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2bd80 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
2bd90 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2bda0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
2bdb0 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50  (pCheck, pgno, P
2bdc0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61  TRMAP_BTREE, iPa
2bdd0 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65  ge, 0);.    }.#e
2bde0 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72  ndif.    checkTr
2bdf0 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70  eePage(pCheck, p
2be00 67 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e  gno, pPage, zCon
2be10 74 65 78 74 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20  text,0,0,0,0);. 
2be20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20   }. .  /* Check 
2be30 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76  for complete cov
2be40 65 72 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  erage of the pag
2be50 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20  e.  */.  data = 
2be60 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
2be70 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
2be80 4f 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20  Offset;.  hit = 
2be90 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
2bea0 6c 6c 6f 63 28 20 75 73 61 62 6c 65 53 69 7a 65  lloc( usableSize
2beb0 20 29 3b 0a 20 20 69 66 28 20 68 69 74 20 29 7b   );.  if( hit ){
2bec0 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c  .    memset(hit,
2bed0 20 31 2c 20 67 65 74 32 62 79 74 65 28 26 64 61   1, get2byte(&da
2bee0 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20  ta[hdr+5]));.   
2bef0 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
2bf00 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
2bf10 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d  .    cellStart =
2bf20 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
2bf30 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66  age->leaf;.    f
2bf40 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
2bf50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
2bf60 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
2bf70 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69  data[cellStart+i
2bf80 2a 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  *2]);.      int 
2bf90 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
2bfa0 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
2bfb0 70 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  pc]);.      int 
2bfc0 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 63  j;.      if( (pc
2bfd0 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
2bfe0 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a  Size || pc<0 ){.
2bff0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
2c000 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
2c010 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
2c020 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
2c030 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
2c040 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
2c050 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
2c060 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
2c070 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d  j=pc+size-1; j>=
2c080 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b  pc; j--) hit[j]+
2c090 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
2c0a0 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20  .    for(cnt=0, 
2c0b0 69 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  i=get2byte(&data
2c0c0 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26  [hdr+1]); i>0 &&
2c0d0 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26   i<usableSize &&
2c0e0 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20   cnt<10000; .   
2c0f0 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a          cnt++){.
2c100 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
2c110 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
2c120 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  i+2]);.      int
2c130 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   j;.      if( (i
2c140 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
2c150 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20  Size || i<0 ){. 
2c160 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
2c170 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
2c180 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22    .            "
2c190 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
2c1a0 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
2c1b0 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
2c1c0 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
2c1d0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
2c1e0 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69  j=i+size-1; j>=i
2c1f0 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b  ; j--) hit[j]++;
2c200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2c210 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
2c220 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  a[i]);.    }.   
2c230 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c   for(i=cnt=0; i<
2c240 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29  usableSize; i++)
2c250 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69 74 5b  {.      if( hit[
2c260 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
2c270 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65   cnt++;.      }e
2c280 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31  lse if( hit[i]>1
2c290 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
2c2a0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
2c2b0 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  k, 0,.          
2c2c0 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66  "Multiple uses f
2c2d0 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70 61  or byte %d of pa
2c2e0 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65  ge %d", i, iPage
2c2f0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2c300 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c310 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74      if( cnt!=dat
2c320 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20  a[hdr+7] ){.    
2c330 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
2c340 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20  (pCheck, 0, .   
2c350 20 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74         "Fragment
2c360 65 64 20 73 70 61 63 65 20 69 73 20 25 64 20 62  ed space is %d b
2c370 79 74 65 20 72 65 70 6f 72 74 65 64 20 61 73 20  yte reported as 
2c380 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a  %d on page %d",.
2c390 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64            cnt, d
2c3a0 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67  ata[hdr+7], iPag
2c3b0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
2c3c0 73 71 6c 69 74 65 46 72 65 65 28 68 69 74 29 3b  sqliteFree(hit);
2c3d0 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ..  releasePage(
2c3e0 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
2c3f0 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64   depth+1;.}.#end
2c400 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2c410 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
2c420 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
2c430 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
2c440 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
2c450 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
2c460 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68 65  s a complete che
2c470 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ck of the given 
2c480 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52 6f  BTree file.  aRo
2c490 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72  ot[] is.** an ar
2c4a0 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d  ray of pages num
2c4b0 62 65 72 73 20 77 65 72 65 20 65 61 63 68 20 70  bers were each p
2c4c0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74 68  age number is th
2c4d0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a  e root page of.*
2c4e0 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f  * a table.  nRoo
2c4f0 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
2c500 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52  of entries in aR
2c510 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  oot..**.** If ev
2c520 65 72 79 74 68 69 6e 67 20 63 68 65 63 6b 73 20  erything checks 
2c530 6f 75 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  out, this routin
2c540 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 20  e returns NULL. 
2c550 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 69 73   If something is
2c560 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e 20 65 72  .** amiss, an er
2c570 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
2c580 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f  ritten into memo
2c590 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
2c5a0 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64   malloc().** and
2c5b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2c5c0 61 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  at error message
2c5d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 54   is returned.  T
2c5e0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2c5f0 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ion.** is respon
2c600 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e  sible for freein
2c610 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  g the error mess
2c620 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
2c630 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  one..*/.char *sq
2c640 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 72  lite3BtreeIntegr
2c650 69 74 79 43 68 65 63 6b 28 42 74 72 65 65 20 2a  ityCheck(Btree *
2c660 70 42 74 2c 20 69 6e 74 20 2a 61 52 6f 6f 74 2c  pBt, int *aRoot,
2c670 20 69 6e 74 20 6e 52 6f 6f 74 29 7b 0a 20 20 69   int nRoot){.  i
2c680 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66  nt i;.  int nRef
2c690 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  ;.  IntegrityCk 
2c6a0 73 43 68 65 63 6b 3b 0a 0a 20 20 6e 52 65 66 20  sCheck;..  nRef 
2c6b0 3d 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  = *sqlite3pager_
2c6c0 73 74 61 74 73 28 70 42 74 2d 3e 70 50 61 67 65  stats(pBt->pPage
2c6d0 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74  r);.  if( lockBt
2c6e0 72 65 65 57 69 74 68 52 65 74 72 79 28 70 42 74  reeWithRetry(pBt
2c6f0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
2c700 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
2c710 65 53 74 72 44 75 70 28 22 55 6e 61 62 6c 65 20  eStrDup("Unable 
2c720 74 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  to acquire a rea
2c730 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
2c740 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20  tabase");.  }.  
2c750 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42 74  sCheck.pBt = pBt
2c760 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67 65  ;.  sCheck.pPage
2c770 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
2c780 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  .  sCheck.nPage 
2c790 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  = sqlite3pager_p
2c7a0 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e  agecount(sCheck.
2c7b0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 73  pPager);.  if( s
2c7c0 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29  Check.nPage==0 )
2c7d0 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  {.    unlockBtre
2c7e0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
2c7f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2c800 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  }.  sCheck.anRef
2c810 20 3d 20 28 69 6e 74 20 2a 29 73 71 6c 69 74 65   = (int *)sqlite
2c820 4d 61 6c 6c 6f 63 52 61 77 28 20 28 73 43 68 65  MallocRaw( (sChe
2c830 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65  ck.nPage+1)*size
2c840 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  of(sCheck.anRef[
2c850 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21 73 43  0]) );.  if( !sC
2c860 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20  heck.anRef ){.  
2c870 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
2c880 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
2c890 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 50  return sqlite3MP
2c8a0 72 69 6e 74 66 28 22 55 6e 61 62 6c 65 20 74 6f  rintf("Unable to
2c8b0 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79 74 65 73   malloc %d bytes
2c8c0 22 2c 20 0a 20 20 20 20 20 20 20 20 28 73 43 68  ", .        (sCh
2c8d0 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a  eck.nPage+1)*siz
2c8e0 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66  eof(sCheck.anRef
2c8f0 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  [0]));.  }.  for
2c900 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e  (i=0; i<=sCheck.
2c910 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68  nPage; i++){ sCh
2c920 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30  eck.anRef[i] = 0
2c930 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e  ; }.  i = PENDIN
2c940 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2c950 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43 68 65 63  ;.  if( i<=sChec
2c960 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 73  k.nPage ){.    s
2c970 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d  Check.anRef[i] =
2c980 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b   1;.  }.  sCheck
2c990 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  .zErrMsg = 0;.. 
2c9a0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e   /* Check the in
2c9b0 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66  tegrity of the f
2c9c0 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63  reelist.  */.  c
2c9d0 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65 63 6b  heckList(&sCheck
2c9e0 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28 26 70  , 1, get4byte(&p
2c9f0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
2ca00 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20 20 20  a[32]),.        
2ca10 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 42      get4byte(&pB
2ca20 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
2ca30 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65  [36]), "Main fre
2ca40 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a  elist: ");..  /*
2ca50 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65 20 74   Check all the t
2ca60 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
2ca70 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 3b 20  r(i=0; i<nRoot; 
2ca80 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52  i++){.    if( aR
2ca90 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  oot[i]==0 ) cont
2caa0 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  inue;.#ifndef SQ
2cab0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2cac0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
2cad0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
2cae0 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20  aRoot[i]>1 ){.  
2caf0 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
2cb00 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69  &sCheck, aRoot[i
2cb10 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  ], PTRMAP_ROOTPA
2cb20 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  GE, 0, 0);.    }
2cb30 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63  .#endif.    chec
2cb40 6b 54 72 65 65 50 61 67 65 28 26 73 43 68 65 63  kTreePage(&sChec
2cb50 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20  k, aRoot[i], 0, 
2cb60 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20 72 6f  "List of tree ro
2cb70 6f 74 73 3a 20 22 2c 20 30 2c 30 2c 30 2c 30 29  ots: ", 0,0,0,0)
2cb80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
2cb90 20 73 75 72 65 20 65 76 65 72 79 20 70 61 67 65   sure every page
2cba0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
2cbb0 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a  referenced.  */.
2cbc0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43    for(i=1; i<=sC
2cbd0 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29  heck.nPage; i++)
2cbe0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2cbf0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2cc00 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
2cc10 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  nRef[i]==0 ){.  
2cc20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
2cc30 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22  sg(&sCheck, 0, "
2cc40 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72  Page %d is never
2cc50 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20   used", i);.    
2cc60 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49  }.#else.    /* I
2cc70 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
2cc80 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
2cc90 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e  uum, make sure n
2cca0 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e  o tables contain
2ccb0 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
2ccc0 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61  es to pointer-ma
2ccd0 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a  p pages..    */.
2cce0 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
2ccf0 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20  nRef[i]==0 && . 
2cd00 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41        (PTRMAP_PA
2cd10 47 45 4e 4f 28 70 42 74 2d 3e 75 73 61 62 6c 65  GENO(pBt->usable
2cd20 53 69 7a 65 2c 20 69 29 21 3d 69 20 7c 7c 20 21  Size, i)!=i || !
2cd30 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
2cd40 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
2cd50 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
2cd60 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73  , 0, "Page %d is
2cd70 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29   never used", i)
2cd80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2cd90 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21  sCheck.anRef[i]!
2cda0 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28 50  =0 && .       (P
2cdb0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
2cdc0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2c 20 69 29  ->usableSize, i)
2cdd0 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74 6f  ==i && pBt->auto
2cde0 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20  Vacuum) ){.     
2cdf0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
2ce00 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69  &sCheck, 0, "Poi
2ce10 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 25 64  nter map page %d
2ce20 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 22 2c   is referenced",
2ce30 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   i);.    }.#endi
2ce40 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  f.  }..  /* Make
2ce50 20 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c 79   sure this analy
2ce60 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61 76  sis did not leav
2ce70 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70 61  e any unref() pa
2ce80 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63  ges.  */.  unloc
2ce90 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
2cea0 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66 20  Bt);.  if( nRef 
2ceb0 21 3d 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  != *sqlite3pager
2cec0 5f 73 74 61 74 73 28 70 42 74 2d 3e 70 50 61 67  _stats(pBt->pPag
2ced0 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  er) ){.    check
2cee0 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63  AppendMsg(&sChec
2cef0 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 4f 75  k, 0, .      "Ou
2cf00 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 63  tstanding page c
2cf10 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20 25  ount goes from %
2cf20 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67 20 74  d to %d during t
2cf30 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20  his analysis",. 
2cf40 20 20 20 20 20 6e 52 65 66 2c 20 2a 73 71 6c 69       nRef, *sqli
2cf50 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28 70  te3pager_stats(p
2cf60 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20  Bt->pPager).    
2cf70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65  );.  }..  /* Cle
2cf80 61 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72  an  up and repor
2cf90 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  t errors..  */. 
2cfa0 20 73 71 6c 69 74 65 46 72 65 65 28 73 43 68 65   sqliteFree(sChe
2cfb0 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 72 65 74  ck.anRef);.  ret
2cfc0 75 72 6e 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d  urn sCheck.zErrM
2cfd0 73 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  sg;.}.#endif /* 
2cfe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
2cff0 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a  GRITY_CHECK */..
2d000 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2d010 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
2d020 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
2d030 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2d040 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
2d050 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
2d060 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 42  lename(Btree *pB
2d070 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 42  t){.  assert( pB
2d080 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
2d090 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2d0a0 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 70  pager_filename(p
2d0b0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
2d0c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2d0d0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
2d0e0 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
2d0f0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
2d100 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
2d110 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
2d120 65 33 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d  e3BtreeGetDirnam
2d130 65 28 42 74 72 65 65 20 2a 70 42 74 29 7b 0a 20  e(Btree *pBt){. 
2d140 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
2d150 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  ager!=0 );.  ret
2d160 75 72 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72  urn sqlite3pager
2d170 5f 64 69 72 6e 61 6d 65 28 70 42 74 2d 3e 70 50  _dirname(pBt->pP
2d180 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
2d190 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e  Return the pathn
2d1a0 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
2d1b0 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69 73  al file for this
2d1c0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 72   database. The r
2d1d0 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f  eturn.** value o
2d1e0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
2d1f0 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 61 72  s the same regar
2d200 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2d210 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d220 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
2d230 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f  eated or not..*/
2d240 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
2d250 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
2d260 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  nalname(Btree *p
2d270 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Bt){.  assert( p
2d280 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
2d290 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2d2a0 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61  3pager_journalna
2d2b0 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  me(pBt->pPager);
2d2c0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2d2d0 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f  TE_OMIT_VACUUM./
2d2e0 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f  *.** Copy the co
2d2f0 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
2d300 66 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70  f pBtFrom into p
2d310 42 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63  BtTo.  A transac
2d320 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20  tion.** must be 
2d330 61 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20  active for both 
2d340 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  files..**.** The
2d350 20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 42   size of file pB
2d360 74 46 72 6f 6d 20 6d 61 79 20 62 65 20 72 65 64  tFrom may be red
2d370 75 63 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  uced by this ope
2d380 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e  ration..** If an
2d390 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
2d3a0 67 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  g, the transacti
2d3b0 6f 6e 20 6f 6e 20 70 42 74 46 72 6f 6d 20 69 73  on on pBtFrom is
2d3c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
2d3d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2d3e0 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20  eCopyFile(Btree 
2d3f0 2a 70 42 74 54 6f 2c 20 42 74 72 65 65 20 2a 70  *pBtTo, Btree *p
2d400 42 74 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72  BtFrom){.  int r
2d410 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2d420 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67 65 2c 20   Pgno i, nPage, 
2d430 6e 54 6f 50 61 67 65 3b 0a 0a 20 20 69 66 28 20  nToPage;..  if( 
2d440 70 42 74 54 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d  pBtTo->inTrans!=
2d450 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70  TRANS_WRITE || p
2d460 42 74 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21  BtFrom->inTrans!
2d470 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2d480 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d490 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
2d4a0 66 28 20 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f  f( pBtTo->pCurso
2d4b0 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
2d4c0 45 5f 42 55 53 59 3b 0a 20 20 6e 54 6f 50 61 67  E_BUSY;.  nToPag
2d4d0 65 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  e = sqlite3pager
2d4e0 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f  _pagecount(pBtTo
2d4f0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 6e 50 61  ->pPager);.  nPa
2d500 67 65 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  ge = sqlite3page
2d510 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 46  r_pagecount(pBtF
2d520 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  rom->pPager);.  
2d530 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c  for(i=1; rc==SQL
2d540 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 50 61  ITE_OK && i<=nPa
2d550 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 6f  ge; i++){.    vo
2d560 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 72  id *pPage;.    r
2d570 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
2d580 5f 67 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50  _get(pBtFrom->pP
2d590 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29  ager, i, &pPage)
2d5a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
2d5b0 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73  reak;.    rc = s
2d5c0 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72  qlite3pager_over
2d5d0 77 72 69 74 65 28 70 42 74 54 6f 2d 3e 70 50 61  write(pBtTo->pPa
2d5e0 67 65 72 2c 20 69 2c 20 70 50 61 67 65 29 3b 0a  ger, i, pPage);.
2d5f0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2d600 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70  ak;.    sqlite3p
2d610 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
2d620 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6e  );.  }.  for(i=n
2d630 50 61 67 65 2b 31 3b 20 72 63 3d 3d 53 51 4c 49  Page+1; rc==SQLI
2d640 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 54 6f 50  TE_OK && i<=nToP
2d650 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76  age; i++){.    v
2d660 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  oid *pPage;.    
2d670 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
2d680 72 5f 67 65 74 28 70 42 74 54 6f 2d 3e 70 50 61  r_get(pBtTo->pPa
2d690 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b  ger, i, &pPage);
2d6a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
2d6b0 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  eak;.    rc = sq
2d6c0 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
2d6d0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c  (pPage);.    sql
2d6e0 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
2d6f0 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69  pPage);.    sqli
2d700 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72  te3pager_dont_wr
2d710 69 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  ite(pBtTo->pPage
2d720 72 2c 20 69 29 3b 0a 20 20 7d 0a 20 20 69 66 28  r, i);.  }.  if(
2d730 20 21 72 63 20 26 26 20 6e 50 61 67 65 3c 6e 54   !rc && nPage<nT
2d740 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 72 63 20  oPage ){.    rc 
2d750 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74  = sqlite3pager_t
2d760 72 75 6e 63 61 74 65 28 70 42 74 54 6f 2d 3e 70  runcate(pBtTo->p
2d770 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20  Pager, nPage);. 
2d780 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
2d790 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
2d7a0 6f 6c 6c 62 61 63 6b 28 70 42 74 54 6f 29 3b 0a  ollback(pBtTo);.
2d7b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2d7c0 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53    .}.#endif /* S
2d7d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
2d7e0 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  M */../*.** Retu
2d7f0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
2d800 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2d810 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
2d820 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
2d830 72 61 6e 73 28 42 74 72 65 65 20 2a 70 42 74 29  rans(Btree *pBt)
2d840 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 42 74 20  {.  return (pBt 
2d850 26 26 20 28 70 42 74 2d 3e 69 6e 54 72 61 6e 73  && (pBt->inTrans
2d860 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 29 3b  ==TRANS_WRITE));
2d870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2d880 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73   non-zero if a s
2d890 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
2d8a0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2d8b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2d8c0 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74 72 65  reeIsInStmt(Btre
2d8d0 65 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  e *pBt){.  retur
2d8e0 6e 20 28 70 42 74 20 26 26 20 70 42 74 2d 3e 69  n (pBt && pBt->i
2d8f0 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nStmt);.}../*.**
2d900 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
2d910 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
2d920 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
2d930 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
2d940 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
2d950 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
2d960 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d970 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
2d980 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
2d990 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
2d9a0 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
2d9b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
2d9c0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
2d9d0 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
2d9e0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
2d9f0 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
2da00 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
2da10 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
2da20 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
2da30 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
2da40 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
2da50 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
2da60 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
2da70 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
2da80 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
2da90 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
2daa0 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
2dab0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
2dac0 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
2dad0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
2dae0 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
2daf0 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
2db00 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
2db10 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
2db20 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
2db30 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
2db40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2db50 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
2db60 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
2db70 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
2db80 28 42 74 72 65 65 20 2a 70 42 74 2c 20 63 6f 6e  (Btree *pBt, con
2db90 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
2dba0 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  ){.  if( pBt->in
2dbb0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
2dbc0 54 45 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  TE ){.#ifndef SQ
2dbd0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2dbe0 43 55 55 4d 0a 20 20 20 20 50 67 6e 6f 20 6e 54  CUUM.    Pgno nT
2dbf0 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20 69 66  runc = 0;.    if
2dc00 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2dc10 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  m ){.      int r
2dc20 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
2dc30 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54 72 75 6e  mmit(pBt, &nTrun
2dc40 63 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72  c); .      if( r
2dc50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2dc60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2dc70 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
2dc80 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 42 74  e3pager_sync(pBt
2dc90 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
2dca0 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 23 65 6e 64  r, nTrunc);.#end
2dcb0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  if.    return sq
2dcc0 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28  lite3pager_sync(
2dcd0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
2dce0 73 74 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ster, 0);.  }.  
2dcf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2dd00 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
2dd10 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41 4c 52  ITE_OMIT_GLOBALR
2dd20 45 43 4f 56 45 52 0a 2f 2a 0a 2a 2a 20 52 65 73  ECOVER./*.** Res
2dd30 65 74 20 74 68 65 20 62 74 72 65 65 20 61 6e 64  et the btree and
2dd40 20 75 6e 64 65 72 6c 79 69 6e 67 20 70 61 67 65   underlying page
2dd50 72 20 61 66 74 65 72 20 61 20 6d 61 6c 6c 6f 63  r after a malloc
2dd60 28 29 20 66 61 69 6c 75 72 65 2e 20 41 6e 79 0a  () failure. Any.
2dd70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
2dd80 68 61 74 20 77 61 73 20 61 63 74 69 76 65 20 77  hat was active w
2dd90 68 65 6e 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  hen malloc() fai
2dda0 6c 65 64 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  led is rolled ba
2ddb0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
2ddc0 65 33 42 74 72 65 65 52 65 73 65 74 28 42 74 72  e3BtreeReset(Btr
2ddd0 65 65 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ee *pBt){.  if( 
2dde0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 20 72  pBt->pCursor ) r
2ddf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
2de00 59 3b 0a 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y;.  pBt->inTran
2de10 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
2de20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
2de30 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65  nused(pBt);.  re
2de40 74 75 72 6e 20 73 71 6c 69 74 65 33 70 61 67 65  turn sqlite3page
2de50 72 5f 72 65 73 65 74 28 70 42 74 2d 3e 70 50 61  r_reset(pBt->pPa
2de60 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
2de70 7d 0a                                            }.