/ Hex Artifact Content
Login

Artifact 0659070eb438bae32cec8afebe6d8d390024d952:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 33 34 32 20 32 30 30 37 2f 30  c,v 1.342 2007/0
0190: 33 2f 32 36 20 32 32 3a 30 35 3a 30 31 20 64 72  3/26 22:05:01 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 46 6f 72 20 61 20 64 65 74 61 69  ..** For a detai
0200: 6c 65 64 20 64 69 73 63 75 73 73 69 6f 6e 20 6f  led discussion o
0210: 66 20 42 54 72 65 65 73 2c 20 72 65 66 65 72 20  f BTrees, refer 
0220: 74 6f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 6f 6e  to.**.**     Don
0230: 61 6c 64 20 45 2e 20 4b 6e 75 74 68 2c 20 54 48  ald E. Knuth, TH
0240: 45 20 41 52 54 20 4f 46 20 43 4f 4d 50 55 54 45  E ART OF COMPUTE
0250: 52 20 50 52 4f 47 52 41 4d 4d 49 4e 47 2c 20 56  R PROGRAMMING, V
0260: 6f 6c 75 6d 65 20 33 3a 0a 2a 2a 20 20 20 20 20  olume 3:.**     
0270: 22 53 6f 72 74 69 6e 67 20 41 6e 64 20 53 65 61  "Sorting And Sea
0280: 72 63 68 69 6e 67 22 2c 20 70 61 67 65 73 20 34  rching", pages 4
0290: 37 33 2d 34 38 30 2e 20 41 64 64 69 73 6f 6e 2d  73-480. Addison-
02a0: 57 65 73 6c 65 79 0a 2a 2a 20 20 20 20 20 50 75  Wesley.**     Pu
02b0: 62 6c 69 73 68 69 6e 67 20 43 6f 6d 70 61 6e 79  blishing Company
02c0: 2c 20 52 65 61 64 69 6e 67 2c 20 4d 61 73 73 61  , Reading, Massa
02d0: 63 68 75 73 65 74 74 73 2e 0a 2a 2a 0a 2a 2a 20  chusetts..**.** 
02e0: 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
02f0: 73 20 74 68 61 74 20 65 61 63 68 20 70 61 67 65  s that each page
0300: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
0310: 74 61 69 6e 73 20 4e 20 64 61 74 61 62 61 73 65  tains N database
0320: 0a 2a 2a 20 65 6e 74 72 69 65 73 20 61 6e 64 20  .** entries and 
0330: 4e 2b 31 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  N+1 pointers to 
0340: 73 75 62 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  subpages..**.** 
0350: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 0a 2a 2a 20 20 20 7c 20 20 50 74 72 28 30  --.**   |  Ptr(0
03a0: 29 20 7c 20 4b 65 79 28 30 29 20 7c 20 50 74 72  ) | Key(0) | Ptr
03b0: 28 31 29 20 7c 20 4b 65 79 28 31 29 20 7c 20 2e  (1) | Key(1) | .
03c0: 2e 2e 20 7c 20 4b 65 79 28 4e 29 20 7c 20 50 74  .. | Key(N) | Pt
03d0: 72 28 4e 2b 31 29 20 7c 0a 2a 2a 20 20 20 2d 2d  r(N+1) |.**   --
03e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
0420: 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
0430: 6b 65 79 73 20 6f 6e 20 74 68 65 20 70 61 67 65  keys on the page
0440: 20 74 68 61 74 20 50 74 72 28 30 29 20 70 6f 69   that Ptr(0) poi
0450: 6e 74 73 20 74 6f 20 68 61 76 65 20 76 61 6c 75  nts to have valu
0460: 65 73 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  es less.** than 
0470: 4b 65 79 28 30 29 2e 20 20 41 6c 6c 20 6f 66 20  Key(0).  All of 
0480: 74 68 65 20 6b 65 79 73 20 6f 6e 20 70 61 67 65  the keys on page
0490: 20 50 74 72 28 31 29 20 61 6e 64 20 69 74 73 20   Ptr(1) and its 
04a0: 73 75 62 70 61 67 65 73 20 68 61 76 65 0a 2a 2a  subpages have.**
04b0: 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20   values greater 
04c0: 74 68 61 6e 20 4b 65 79 28 30 29 20 61 6e 64 20  than Key(0) and 
04d0: 6c 65 73 73 20 74 68 61 6e 20 4b 65 79 28 31 29  less than Key(1)
04e0: 2e 20 20 41 6c 6c 20 6f 66 20 74 68 65 20 6b 65  .  All of the ke
04f0: 79 73 0a 2a 2a 20 6f 6e 20 50 74 72 28 4e 2b 31  ys.** on Ptr(N+1
0500: 29 20 61 6e 64 20 69 74 73 20 73 75 62 70 61 67  ) and its subpag
0510: 65 73 20 68 61 76 65 20 76 61 6c 75 65 73 20 67  es have values g
0520: 72 65 61 74 65 72 20 74 68 61 6e 20 4b 65 79 28  reater than Key(
0530: 4e 29 2e 20 20 41 6e 64 0a 2a 2a 20 73 6f 20 66  N).  And.** so f
0540: 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 64  orth..**.** Find
0550: 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
0560: 20 6b 65 79 20 72 65 71 75 69 72 65 73 20 72 65   key requires re
0570: 61 64 69 6e 67 20 4f 28 6c 6f 67 28 4d 29 29 20  ading O(log(M)) 
0580: 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 0a  pages from the .
0590: 2a 2a 20 64 69 73 6b 20 77 68 65 72 65 20 4d 20  ** disk where M 
05a0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
05b0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
05c0: 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  tree..**.** In t
05d0: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
05e0: 6f 6e 2c 20 61 20 73 69 6e 67 6c 65 20 66 69 6c  on, a single fil
05f0: 65 20 63 61 6e 20 68 6f 6c 64 20 6f 6e 65 20 6f  e can hold one o
0600: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
0610: 0a 2a 2a 20 42 54 72 65 65 73 2e 20 20 45 61 63  .** BTrees.  Eac
0620: 68 20 42 54 72 65 65 20 69 73 20 69 64 65 6e 74  h BTree is ident
0630: 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e 64  ified by the ind
0640: 65 78 20 6f 66 20 69 74 73 20 72 6f 6f 74 20 70  ex of its root p
0650: 61 67 65 2e 20 20 54 68 65 0a 2a 2a 20 6b 65 79  age.  The.** key
0660: 20 61 6e 64 20 64 61 74 61 20 66 6f 72 20 61 6e   and data for an
0670: 79 20 65 6e 74 72 79 20 61 72 65 20 63 6f 6d 62  y entry are comb
0680: 69 6e 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65  ined to form the
0690: 20 22 70 61 79 6c 6f 61 64 22 2e 20 20 41 0a 2a   "payload".  A.*
06a0: 2a 20 66 69 78 65 64 20 61 6d 6f 75 6e 74 20 6f  * fixed amount o
06b0: 66 20 70 61 79 6c 6f 61 64 20 63 61 6e 20 62 65  f payload can be
06c0: 20 63 61 72 72 69 65 64 20 64 69 72 65 63 74 6c   carried directl
06d0: 79 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  y on the databas
06e0: 65 0a 2a 2a 20 70 61 67 65 2e 20 20 49 66 20 74  e.** page.  If t
06f0: 68 65 20 70 61 79 6c 6f 61 64 20 69 73 20 6c 61  he payload is la
0700: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 72  rger than the pr
0710: 65 73 65 74 20 61 6d 6f 75 6e 74 20 74 68 65 6e  eset amount then
0720: 20 73 75 72 70 6c 75 73 0a 2a 2a 20 62 79 74 65   surplus.** byte
0730: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
0740: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
0750: 20 54 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   The payload for
0760: 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 61 6e 64   an entry.** and
0770: 20 74 68 65 20 70 72 65 63 65 64 69 6e 67 20 70   the preceding p
0780: 6f 69 6e 74 65 72 20 61 72 65 20 63 6f 6d 62 69  ointer are combi
0790: 6e 65 64 20 74 6f 20 66 6f 72 6d 20 61 20 22 43  ned to form a "C
07a0: 65 6c 6c 22 2e 20 20 45 61 63 68 20 0a 2a 2a 20  ell".  Each .** 
07b0: 70 61 67 65 20 68 61 73 20 61 20 73 6d 61 6c 6c  page has a small
07c0: 20 68 65 61 64 65 72 20 77 68 69 63 68 20 63 6f   header which co
07d0: 6e 74 61 69 6e 73 20 74 68 65 20 50 74 72 28 4e  ntains the Ptr(N
07e0: 2b 31 29 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  +1) pointer and 
07f0: 6f 74 68 65 72 0a 2a 2a 20 69 6e 66 6f 72 6d 61  other.** informa
0800: 74 69 6f 6e 20 73 75 63 68 20 61 73 20 74 68 65  tion such as the
0810: 20 73 69 7a 65 20 6f 66 20 6b 65 79 20 61 6e 64   size of key and
0820: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 46 4f 52   data..**.** FOR
0830: 4d 41 54 20 44 45 54 41 49 4c 53 0a 2a 2a 0a 2a  MAT DETAILS.**.*
0840: 2a 20 54 68 65 20 66 69 6c 65 20 69 73 20 64 69  * The file is di
0850: 76 69 64 65 64 20 69 6e 74 6f 20 70 61 67 65 73  vided into pages
0860: 2e 20 20 54 68 65 20 66 69 72 73 74 20 70 61 67  .  The first pag
0870: 65 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65  e is called page
0880: 20 31 2c 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e   1,.** the secon
0890: 64 20 69 73 20 70 61 67 65 20 32 2c 20 61 6e 64  d is page 2, and
08a0: 20 73 6f 20 66 6f 72 74 68 2e 20 20 41 20 70 61   so forth.  A pa
08b0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 7a 65 72  ge number of zer
08c0: 6f 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 22  o indicates.** "
08d0: 6e 6f 20 73 75 63 68 20 70 61 67 65 22 2e 20 20  no such page".  
08e0: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 61  The page size ca
08f0: 6e 20 62 65 20 61 6e 79 74 68 69 6e 67 20 62 65  n be anything be
0900: 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
0910: 35 33 36 2e 0a 2a 2a 20 45 61 63 68 20 70 61 67  536..** Each pag
0920: 65 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  e can be either 
0930: 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 61 20  a btree page, a 
0940: 66 72 65 65 6c 69 73 74 20 70 61 67 65 20 6f 72  freelist page or
0950: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
0960: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
0970: 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 6c  first page is al
0980: 77 61 79 73 20 61 20 62 74 72 65 65 20 70 61 67  ways a btree pag
0990: 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 31 30  e.  The first 10
09a0: 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 66  0 bytes of the f
09b0: 69 72 73 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e  irst.** page con
09c0: 74 61 69 6e 20 61 20 73 70 65 63 69 61 6c 20 68  tain a special h
09d0: 65 61 64 65 72 20 28 74 68 65 20 22 66 69 6c 65  eader (the "file
09e0: 20 68 65 61 64 65 72 22 29 20 74 68 61 74 20 64   header") that d
09f0: 65 73 63 72 69 62 65 73 20 74 68 65 20 66 69 6c  escribes the fil
0a00: 65 2e 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  e..** The format
0a10: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 65 61   of the file hea
0a20: 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  der is as follow
0a30: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 46 46 53 45  s:.**.**   OFFSE
0a40: 54 20 20 20 53 49 5a 45 20 20 20 20 44 45 53 43  T   SIZE    DESC
0a50: 52 49 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20  RIPTION.**      
0a60: 30 20 20 20 20 20 20 31 36 20 20 20 20 20 48 65  0      16     He
0a70: 61 64 65 72 20 73 74 72 69 6e 67 3a 20 22 53 51  ader string: "SQ
0a80: 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 5c 30 30  Lite format 3\00
0a90: 30 22 0a 2a 2a 20 20 20 20 20 31 36 20 20 20 20  0".**     16    
0aa0: 20 20 20 32 20 20 20 20 20 50 61 67 65 20 73 69     2     Page si
0ab0: 7a 65 20 69 6e 20 62 79 74 65 73 2e 20 20 0a 2a  ze in bytes.  .*
0ac0: 2a 20 20 20 20 20 31 38 20 20 20 20 20 20 20 31  *     18       1
0ad0: 20 20 20 20 20 46 69 6c 65 20 66 6f 72 6d 61 74       File format
0ae0: 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 0a 2a   write version.*
0af0: 2a 20 20 20 20 20 31 39 20 20 20 20 20 20 20 31  *     19       1
0b00: 20 20 20 20 20 46 69 6c 65 20 66 6f 72 6d 61 74       File format
0b10: 20 72 65 61 64 20 76 65 72 73 69 6f 6e 0a 2a 2a   read version.**
0b20: 20 20 20 20 20 32 30 20 20 20 20 20 20 20 31 20       20       1 
0b30: 20 20 20 20 42 79 74 65 73 20 6f 66 20 75 6e 75      Bytes of unu
0b40: 73 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65  sed space at the
0b50: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
0b60: 65 0a 2a 2a 20 20 20 20 20 32 31 20 20 20 20 20  e.**     21     
0b70: 20 20 31 20 20 20 20 20 4d 61 78 20 65 6d 62 65    1     Max embe
0b80: 64 64 65 64 20 70 61 79 6c 6f 61 64 20 66 72 61  dded payload fra
0b90: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 32 32 20  ction.**     22 
0ba0: 20 20 20 20 20 20 31 20 20 20 20 20 4d 69 6e 20        1     Min 
0bb0: 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
0bc0: 20 66 72 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20   fraction.**    
0bd0: 20 32 33 20 20 20 20 20 20 20 31 20 20 20 20 20   23       1     
0be0: 4d 69 6e 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  Min leaf payload
0bf0: 20 66 72 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20   fraction.**    
0c00: 20 32 34 20 20 20 20 20 20 20 34 20 20 20 20 20   24       4     
0c10: 46 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e  File change coun
0c20: 74 65 72 0a 2a 2a 20 20 20 20 20 32 38 20 20 20  ter.**     28   
0c30: 20 20 20 20 34 20 20 20 20 20 52 65 73 65 72 76      4     Reserv
0c40: 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
0c50: 65 0a 2a 2a 20 20 20 20 20 33 32 20 20 20 20 20  e.**     32     
0c60: 20 20 34 20 20 20 20 20 46 69 72 73 74 20 66 72    4     First fr
0c70: 65 65 6c 69 73 74 20 70 61 67 65 0a 2a 2a 20 20  eelist page.**  
0c80: 20 20 20 33 36 20 20 20 20 20 20 20 34 20 20 20     36       4   
0c90: 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65    Number of free
0ca0: 6c 69 73 74 20 70 61 67 65 73 20 69 6e 20 74 68  list pages in th
0cb0: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 34 30  e file.**     40
0cc0: 20 20 20 20 20 20 36 30 20 20 20 20 20 31 35 20        60     15 
0cd0: 34 2d 62 79 74 65 20 6d 65 74 61 20 76 61 6c 75  4-byte meta valu
0ce0: 65 73 20 70 61 73 73 65 64 20 74 6f 20 68 69 67  es passed to hig
0cf0: 68 65 72 20 6c 61 79 65 72 73 0a 2a 2a 0a 2a 2a  her layers.**.**
0d00: 20 41 6c 6c 20 6f 66 20 74 68 65 20 69 6e 74 65   All of the inte
0d10: 67 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 62  ger values are b
0d20: 69 67 2d 65 6e 64 69 61 6e 20 28 6d 6f 73 74 20  ig-endian (most 
0d30: 73 69 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65  significant byte
0d40: 20 66 69 72 73 74 29 2e 0a 2a 2a 0a 2a 2a 20 54   first)..**.** T
0d50: 68 65 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63  he file change c
0d60: 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d  ounter is increm
0d70: 65 6e 74 65 64 20 77 68 65 6e 20 74 68 65 20 64  ented when the d
0d80: 61 74 61 62 61 73 65 20 69 73 20 63 68 61 6e 67  atabase is chang
0d90: 65 64 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20  ed more.** than 
0da0: 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20  once within the 
0db0: 73 61 6d 65 20 73 65 63 6f 6e 64 2e 20 20 54 68  same second.  Th
0dc0: 69 73 20 63 6f 75 6e 74 65 72 2c 20 74 6f 67 65  is counter, toge
0dd0: 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
0de0: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69   modification ti
0df0: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20  me of the file, 
0e00: 61 6c 6c 6f 77 73 20 6f 74 68 65 72 20 70 72 6f  allows other pro
0e10: 63 65 73 73 65 73 20 74 6f 20 6b 6e 6f 77 0a 2a  cesses to know.*
0e20: 2a 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65 20  * when the file 
0e30: 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
0e40: 74 68 75 73 20 77 68 65 6e 20 74 68 65 79 20 6e  thus when they n
0e50: 65 65 64 20 74 6f 20 66 6c 75 73 68 20 74 68 65  eed to flush the
0e60: 69 72 0a 2a 2a 20 63 61 63 68 65 2e 0a 2a 2a 0a  ir.** cache..**.
0e70: 2a 2a 20 54 68 65 20 6d 61 78 20 65 6d 62 65 64  ** The max embed
0e80: 64 65 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63  ded payload frac
0e90: 74 69 6f 6e 20 69 73 20 74 68 65 20 61 6d 6f 75  tion is the amou
0ea0: 6e 74 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  nt of the total 
0eb0: 75 73 61 62 6c 65 0a 2a 2a 20 73 70 61 63 65 20  usable.** space 
0ec0: 69 6e 20 61 20 70 61 67 65 20 74 68 61 74 20 63  in a page that c
0ed0: 61 6e 20 62 65 20 63 6f 6e 73 75 6d 65 64 20 62  an be consumed b
0ee0: 79 20 61 20 73 69 6e 67 6c 65 20 63 65 6c 6c 20  y a single cell 
0ef0: 66 6f 72 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20  for standard.** 
0f00: 42 2d 74 72 65 65 20 28 6e 6f 6e 2d 4c 45 41 46  B-tree (non-LEAF
0f10: 44 41 54 41 29 20 74 61 62 6c 65 73 2e 20 20 41  DATA) tables.  A
0f20: 20 76 61 6c 75 65 20 6f 66 20 32 35 35 20 6d 65   value of 255 me
0f30: 61 6e 73 20 31 30 30 25 2e 20 20 54 68 65 20 64  ans 100%.  The d
0f40: 65 66 61 75 6c 74 0a 2a 2a 20 69 73 20 74 6f 20  efault.** is to 
0f50: 6c 69 6d 69 74 20 74 68 65 20 6d 61 78 69 6d 75  limit the maximu
0f60: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 73 6f 20 74  m cell size so t
0f70: 68 61 74 20 61 74 20 6c 65 61 73 74 20 34 20 63  hat at least 4 c
0f80: 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 0a 2a 2a  ells will fit.**
0f90: 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 54   on one page.  T
0fa0: 68 75 73 20 74 68 65 20 64 65 66 61 75 6c 74 20  hus the default 
0fb0: 6d 61 78 20 65 6d 62 65 64 64 65 64 20 70 61 79  max embedded pay
0fc0: 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 69 73  load fraction is
0fd0: 20 36 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   64..**.** If th
0fe0: 65 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 61 20  e payload for a 
0ff0: 63 65 6c 6c 20 69 73 20 6c 61 72 67 65 72 20 74  cell is larger t
1000: 68 61 6e 20 74 68 65 20 6d 61 78 20 70 61 79 6c  han the max payl
1010: 6f 61 64 2c 20 74 68 65 6e 20 65 78 74 72 61 0a  oad, then extra.
1020: 2a 2a 20 70 61 79 6c 6f 61 64 20 69 73 20 73 70  ** payload is sp
1030: 69 6c 6c 65 64 20 74 6f 20 6f 76 65 72 66 6c 6f  illed to overflo
1040: 77 20 70 61 67 65 73 2e 20 20 4f 6e 63 65 20 61  w pages.  Once a
1050: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
1060: 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a  is allocated,.**
1070: 20 61 73 20 6d 61 6e 79 20 62 79 74 65 73 20 61   as many bytes a
1080: 73 20 70 6f 73 73 69 62 6c 65 20 61 72 65 20 6d  s possible are m
1090: 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 6f 76  oved into the ov
10a0: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 69 74  erflow pages wit
10b0: 68 6f 75 74 20 6c 65 74 74 69 6e 67 0a 2a 2a 20  hout letting.** 
10c0: 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 20 64 72  the cell size dr
10d0: 6f 70 20 62 65 6c 6f 77 20 74 68 65 20 6d 69 6e  op below the min
10e0: 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
10f0: 64 20 66 72 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  d fraction..**.*
1100: 2a 20 54 68 65 20 6d 69 6e 20 6c 65 61 66 20 70  * The min leaf p
1110: 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20  ayload fraction 
1120: 69 73 20 6c 69 6b 65 20 74 68 65 20 6d 69 6e 20  is like the min 
1130: 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
1140: 20 66 72 61 63 74 69 6f 6e 0a 2a 2a 20 65 78 63   fraction.** exc
1150: 65 70 74 20 74 68 61 74 20 69 74 20 61 70 70 6c  ept that it appl
1160: 69 65 73 20 74 6f 20 6c 65 61 66 20 6e 6f 64 65  ies to leaf node
1170: 73 20 69 6e 20 61 20 4c 45 41 46 44 41 54 41 20  s in a LEAFDATA 
1180: 74 72 65 65 2e 20 20 54 68 65 20 6d 61 78 69 6d  tree.  The maxim
1190: 75 6d 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 66 72  um.** payload fr
11a0: 61 63 74 69 6f 6e 20 66 6f 72 20 61 20 4c 45 41  action for a LEA
11b0: 46 44 41 54 41 20 74 72 65 65 20 69 73 20 61 6c  FDATA tree is al
11c0: 77 61 79 73 20 31 30 30 25 20 28 6f 72 20 32 35  ways 100% (or 25
11d0: 35 29 20 61 6e 64 20 69 74 0a 2a 2a 20 6e 6f 74  5) and it.** not
11e0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
11f0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
1200: 45 61 63 68 20 62 74 72 65 65 20 70 61 67 65 73  Each btree pages
1210: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
1220: 20 74 68 72 65 65 20 73 65 63 74 69 6f 6e 73 3a   three sections:
1230: 20 20 54 68 65 20 68 65 61 64 65 72 2c 20 74 68    The header, th
1240: 65 0a 2a 2a 20 63 65 6c 6c 20 70 6f 69 6e 74 65  e.** cell pointe
1250: 72 20 61 72 72 61 79 2c 20 61 6e 64 20 74 68 65  r array, and the
1260: 20 63 65 6c 6c 20 61 72 65 61 20 61 72 65 61 2e   cell area area.
1270: 20 20 50 61 67 65 20 31 20 61 6c 73 6f 20 68 61    Page 1 also ha
1280: 73 20 61 20 31 30 30 2d 62 79 74 65 0a 2a 2a 20  s a 100-byte.** 
1290: 66 69 6c 65 20 68 65 61 64 65 72 20 74 68 61 74  file header that
12a0: 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 74   occurs before t
12b0: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  he page header..
12c0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d  **.**      |----
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a  ------------|.**
12e0: 20 20 20 20 20 20 7c 20 66 69 6c 65 20 68 65 61        | file hea
12f0: 64 65 72 20 20 20 20 7c 20 20 20 31 30 30 20 62  der    |   100 b
1300: 79 74 65 73 2e 20 20 50 61 67 65 20 31 20 6f 6e  ytes.  Page 1 on
1310: 6c 79 2e 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d  ly..**      |---
1320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a  -------------|.*
1330: 2a 20 20 20 20 20 20 7c 20 70 61 67 65 20 68 65  *      | page he
1340: 61 64 65 72 20 20 20 20 7c 20 20 20 38 20 62 79  ader    |   8 by
1350: 74 65 73 20 66 6f 72 20 6c 65 61 76 65 73 2e 20  tes for leaves. 
1360: 20 31 32 20 62 79 74 65 73 20 66 6f 72 20 69 6e   12 bytes for in
1370: 74 65 72 69 6f 72 20 6e 6f 64 65 73 0a 2a 2a 20  terior nodes.** 
1380: 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       |----------
1390: 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20  ------|.**      
13a0: 7c 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 20  | cell pointer  
13b0: 20 7c 20 20 20 7c 20 20 32 20 62 79 74 65 73 20   |   |  2 bytes 
13c0: 70 65 72 20 63 65 6c 6c 2e 20 20 53 6f 72 74 65  per cell.  Sorte
13d0: 64 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 20 20 20  d order..**     
13e0: 20 7c 20 61 72 72 61 79 20 20 20 20 20 20 20 20   | array        
13f0: 20 20 7c 20 20 20 7c 20 20 47 72 6f 77 73 20 64    |   |  Grows d
1400: 6f 77 6e 77 61 72 64 0a 2a 2a 20 20 20 20 20 20  ownward.**      
1410: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |               
1420: 20 7c 20 20 20 76 0a 2a 2a 20 20 20 20 20 20 7c   |   v.**      |
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1440: 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 75 6e 61 6c  |.**      | unal
1450: 6c 6f 63 61 74 65 64 20 20 20 20 7c 0a 2a 2a 20  located    |.** 
1460: 20 20 20 20 20 7c 20 73 70 61 63 65 20 20 20 20       | space    
1470: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1480: 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  |---------------
1490: 2d 7c 20 20 20 5e 20 20 47 72 6f 77 73 20 75 70  -|   ^  Grows up
14a0: 77 61 72 64 73 0a 2a 2a 20 20 20 20 20 20 7c 20  wards.**      | 
14b0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 20 20 7c  cell content   |
14c0: 20 20 20 7c 20 20 41 72 62 69 74 72 61 72 79 20     |  Arbitrary 
14d0: 6f 72 64 65 72 20 69 6e 74 65 72 73 70 65 72 73  order interspers
14e0: 65 64 20 77 69 74 68 20 66 72 65 65 62 6c 6f 63  ed with freebloc
14f0: 6b 73 2e 0a 2a 2a 20 20 20 20 20 20 7c 20 61 72  ks..**      | ar
1500: 65 61 20 20 20 20 20 20 20 20 20 20 20 7c 20 20  ea           |  
1510: 20 7c 20 20 61 6e 64 20 66 72 65 65 20 73 70 61   |  and free spa
1520: 63 65 20 66 72 61 67 6d 65 6e 74 73 2e 0a 2a 2a  ce fragments..**
1530: 20 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d        |---------
1540: 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 0a 2a 2a 20 54  -------|.**.** T
1550: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 73 20  he page headers 
1560: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
1570: 0a 2a 2a 0a 2a 2a 20 20 20 4f 46 46 53 45 54 20  .**.**   OFFSET 
1580: 20 20 53 49 5a 45 20 20 20 20 20 44 45 53 43 52    SIZE     DESCR
1590: 49 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 30  IPTION.**      0
15a0: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 46 6c         1      Fl
15b0: 61 67 73 2e 20 31 3a 20 69 6e 74 6b 65 79 2c 20  ags. 1: intkey, 
15c0: 32 3a 20 7a 65 72 6f 64 61 74 61 2c 20 34 3a 20  2: zerodata, 4: 
15d0: 6c 65 61 66 64 61 74 61 2c 20 38 3a 20 6c 65 61  leafdata, 8: lea
15e0: 66 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  f.**      1     
15f0: 20 20 32 20 20 20 20 20 20 62 79 74 65 20 6f 66    2      byte of
1600: 66 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73  fset to the firs
1610: 74 20 66 72 65 65 62 6c 6f 63 6b 0a 2a 2a 20 20  t freeblock.**  
1620: 20 20 20 20 33 20 20 20 20 20 20 20 32 20 20 20      3       2   
1630: 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c     number of cel
1640: 6c 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a  ls on this page.
1650: 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20  **      5       
1660: 32 20 20 20 20 20 20 66 69 72 73 74 20 62 79 74  2      first byt
1670: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
1680: 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 20 20  ntent area.**   
1690: 20 20 20 37 20 20 20 20 20 20 20 31 20 20 20 20     7       1    
16a0: 20 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 67    number of frag
16b0: 6d 65 6e 74 65 64 20 66 72 65 65 20 62 79 74 65  mented free byte
16c0: 73 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  s.**      8     
16d0: 20 20 34 20 20 20 20 20 20 52 69 67 68 74 20 63    4      Right c
16e0: 68 69 6c 64 20 28 74 68 65 20 50 74 72 28 4e 2b  hild (the Ptr(N+
16f0: 31 29 20 76 61 6c 75 65 29 2e 20 20 4f 6d 69 74  1) value).  Omit
1700: 74 65 64 20 6f 6e 20 6c 65 61 76 65 73 2e 0a 2a  ted on leaves..*
1710: 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 64  *.** The flags d
1720: 65 66 69 6e 65 20 74 68 65 20 66 6f 72 6d 61 74  efine the format
1730: 20 6f 66 20 74 68 69 73 20 62 74 72 65 65 20 70   of this btree p
1740: 61 67 65 2e 20 20 54 68 65 20 6c 65 61 66 20 66  age.  The leaf f
1750: 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a  lag means that.*
1760: 2a 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20  * this page has 
1770: 6e 6f 20 63 68 69 6c 64 72 65 6e 2e 20 20 54 68  no children.  Th
1780: 65 20 7a 65 72 6f 64 61 74 61 20 66 6c 61 67 20  e zerodata flag 
1790: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
17a0: 70 61 67 65 20 63 61 72 72 69 65 73 0a 2a 2a 20  page carries.** 
17b0: 6f 6e 6c 79 20 6b 65 79 73 20 61 6e 64 20 6e 6f  only keys and no
17c0: 20 64 61 74 61 2e 20 20 54 68 65 20 69 6e 74 6b   data.  The intk
17d0: 65 79 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68  ey flag means th
17e0: 61 74 20 74 68 65 20 6b 65 79 20 69 73 20 61 20  at the key is a 
17f0: 69 6e 74 65 67 65 72 0a 2a 2a 20 77 68 69 63 68  integer.** which
1800: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
1810: 65 20 6b 65 79 20 73 69 7a 65 20 65 6e 74 72 79  e key size entry
1820: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 68 65 61   of the cell hea
1830: 64 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  der rather than 
1840: 69 6e 0a 2a 2a 20 74 68 65 20 70 61 79 6c 6f 61  in.** the payloa
1850: 64 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 54 68  d area..**.** Th
1860: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
1870: 72 72 61 79 20 62 65 67 69 6e 73 20 6f 6e 20 74  rray begins on t
1880: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 61 66  he first byte af
1890: 74 65 72 20 74 68 65 20 70 61 67 65 20 68 65 61  ter the page hea
18a0: 64 65 72 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  der..** The cell
18b0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 63   pointer array c
18c0: 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 6f 72 20  ontains zero or 
18d0: 6d 6f 72 65 20 32 2d 62 79 74 65 20 6e 75 6d 62  more 2-byte numb
18e0: 65 72 73 20 77 68 69 63 68 20 61 72 65 0a 2a 2a  ers which are.**
18f0: 20 6f 66 66 73 65 74 73 20 66 72 6f 6d 20 74 68   offsets from th
1900: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
1910: 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 63  he page to the c
1920: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74  ell content in t
1930: 68 65 20 63 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 65  he cell.** conte
1940: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 63 65  nt area.  The ce
1950: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 6f 63 63 75  ll pointers occu
1960: 72 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  r in sorted orde
1970: 72 2e 20 20 54 68 65 20 73 79 73 74 65 6d 20 73  r.  The system s
1980: 74 72 69 76 65 73 0a 2a 2a 20 74 6f 20 6b 65 65  trives.** to kee
1990: 70 20 66 72 65 65 20 73 70 61 63 65 20 61 66 74  p free space aft
19a0: 65 72 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  er the last cell
19b0: 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74   pointer so that
19c0: 20 6e 65 77 20 63 65 6c 6c 73 20 63 61 6e 0a 2a   new cells can.*
19d0: 2a 20 62 65 20 65 61 73 69 6c 79 20 61 64 64 65  * be easily adde
19e0: 64 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  d without having
19f0: 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 74   to defragment t
1a00: 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 43  he page..**.** C
1a10: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 73  ell content is s
1a20: 74 6f 72 65 64 20 61 74 20 74 68 65 20 76 65 72  tored at the ver
1a30: 79 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  y end of the pag
1a40: 65 20 61 6e 64 20 67 72 6f 77 73 20 74 6f 77 61  e and grows towa
1a50: 72 64 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  rd the.** beginn
1a60: 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ing of the page.
1a70: 0a 2a 2a 0a 2a 2a 20 55 6e 75 73 65 64 20 73 70  .**.** Unused sp
1a80: 61 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 63  ace within the c
1a90: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
1aa0: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
1ab0: 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  to a linked list
1ac0: 20 6f 66 0a 2a 2a 20 66 72 65 65 62 6c 6f 63 6b   of.** freeblock
1ad0: 73 2e 20 20 45 61 63 68 20 66 72 65 65 62 6c 6f  s.  Each freeblo
1ae0: 63 6b 20 69 73 20 61 74 20 6c 65 61 73 74 20 34  ck is at least 4
1af0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
1b00: 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   The byte offset
1b10: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
1b20: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 67 69   freeblock is gi
1b30: 76 65 6e 20 69 6e 20 74 68 65 20 68 65 61 64 65  ven in the heade
1b40: 72 2e 20 20 46 72 65 65 62 6c 6f 63 6b 73 20 6f  r.  Freeblocks o
1b50: 63 63 75 72 20 69 6e 0a 2a 2a 20 69 6e 63 72 65  ccur in.** incre
1b60: 61 73 69 6e 67 20 6f 72 64 65 72 2e 20 20 42 65  asing order.  Be
1b70: 63 61 75 73 65 20 61 20 66 72 65 65 62 6c 6f 63  cause a freebloc
1b80: 6b 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  k must be at lea
1b90: 73 74 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  st 4 bytes in si
1ba0: 7a 65 2c 0a 2a 2a 20 61 6e 79 20 67 72 6f 75 70  ze,.** any group
1bb0: 20 6f 66 20 33 20 6f 72 20 66 65 77 65 72 20 75   of 3 or fewer u
1bc0: 6e 75 73 65 64 20 62 79 74 65 73 20 69 6e 20 74  nused bytes in t
1bd0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
1be0: 61 72 65 61 20 63 61 6e 6e 6f 74 0a 2a 2a 20 65  area cannot.** e
1bf0: 78 69 73 74 20 6f 6e 20 74 68 65 20 66 72 65 65  xist on the free
1c00: 62 6c 6f 63 6b 20 63 68 61 69 6e 2e 20 20 41 20  block chain.  A 
1c10: 67 72 6f 75 70 20 6f 66 20 33 20 6f 72 20 66 65  group of 3 or fe
1c20: 77 65 72 20 66 72 65 65 20 62 79 74 65 73 20 69  wer free bytes i
1c30: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 20 66 72  s called.** a fr
1c40: 61 67 6d 65 6e 74 2e 20 20 54 68 65 20 74 6f 74  agment.  The tot
1c50: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
1c60: 65 73 20 69 6e 20 61 6c 6c 20 66 72 61 67 6d 65  es in all fragme
1c70: 6e 74 73 20 69 73 20 72 65 63 6f 72 64 65 64 2e  nts is recorded.
1c80: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
1c90: 68 65 61 64 65 72 20 61 74 20 6f 66 66 73 65 74  header at offset
1ca0: 20 37 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a   7..**.**    SIZ
1cb0: 45 20 20 20 20 44 45 53 43 52 49 50 54 49 4f 4e  E    DESCRIPTION
1cc0: 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 42  .**      2     B
1cd0: 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  yte offset of th
1ce0: 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  e next freeblock
1cf0: 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 42  .**      2     B
1d00: 79 74 65 73 20 69 6e 20 74 68 69 73 20 66 72 65  ytes in this fre
1d10: 65 62 6c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 43 65 6c  eblock.**.** Cel
1d20: 6c 73 20 61 72 65 20 6f 66 20 76 61 72 69 61 62  ls are of variab
1d30: 6c 65 20 6c 65 6e 67 74 68 2e 20 20 43 65 6c 6c  le length.  Cell
1d40: 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
1d50: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
1d60: 20 61 72 65 61 20 61 74 0a 2a 2a 20 74 68 65 20   area at.** the 
1d70: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
1d80: 20 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 74 68    Pointers to th
1d90: 65 20 63 65 6c 6c 73 20 61 72 65 20 69 6e 20 74  e cells are in t
1da0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
1db0: 61 72 72 61 79 0a 2a 2a 20 74 68 61 74 20 69 6d  array.** that im
1dc0: 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
1dd0: 73 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  s the page heade
1de0: 72 2e 20 20 43 65 6c 6c 73 20 69 73 20 6e 6f 74  r.  Cells is not
1df0: 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20   necessarily.** 
1e00: 63 6f 6e 74 69 67 75 6f 75 73 20 6f 72 20 69 6e  contiguous or in
1e10: 20 6f 72 64 65 72 2c 20 62 75 74 20 63 65 6c 6c   order, but cell
1e20: 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
1e30: 6e 74 69 67 75 6f 75 73 20 61 6e 64 20 69 6e 20  ntiguous and in 
1e40: 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 65 6c  order..**.** Cel
1e50: 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 6b 65 73 20  l content makes 
1e60: 75 73 65 20 6f 66 20 76 61 72 69 61 62 6c 65 20  use of variable 
1e70: 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e  length integers.
1e80: 20 20 41 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20    A variable.** 
1e90: 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 69  length integer i
1ea0: 73 20 31 20 74 6f 20 39 20 62 79 74 65 73 20 77  s 1 to 9 bytes w
1eb0: 68 65 72 65 20 74 68 65 20 6c 6f 77 65 72 20 37  here the lower 7
1ec0: 20 62 69 74 73 20 6f 66 20 65 61 63 68 20 0a 2a   bits of each .*
1ed0: 2a 20 62 79 74 65 20 61 72 65 20 75 73 65 64 2e  * byte are used.
1ee0: 20 20 54 68 65 20 69 6e 74 65 67 65 72 20 63 6f    The integer co
1ef0: 6e 73 69 73 74 73 20 6f 66 20 61 6c 6c 20 62 79  nsists of all by
1f00: 74 65 73 20 74 68 61 74 20 68 61 76 65 20 62 69  tes that have bi
1f10: 74 20 38 20 73 65 74 20 61 6e 64 0a 2a 2a 20 74  t 8 set and.** t
1f20: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 77 69  he first byte wi
1f30: 74 68 20 62 69 74 20 38 20 63 6c 65 61 72 2e 20  th bit 8 clear. 
1f40: 20 54 68 65 20 6d 6f 73 74 20 73 69 67 6e 69 66   The most signif
1f50: 69 63 61 6e 74 20 62 79 74 65 20 6f 66 20 74 68  icant byte of th
1f60: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 61 70 70  e integer.** app
1f70: 65 61 72 73 20 66 69 72 73 74 2e 20 20 41 20 76  ears first.  A v
1f80: 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69  ariable-length i
1f90: 6e 74 65 67 65 72 20 6d 61 79 20 6e 6f 74 20 62  nteger may not b
1fa0: 65 20 6d 6f 72 65 20 74 68 61 6e 20 39 20 62 79  e more than 9 by
1fb0: 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20 41 73 20  tes long..** As 
1fc0: 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20  a special case, 
1fd0: 61 6c 6c 20 38 20 62 79 74 65 73 20 6f 66 20 74  all 8 bytes of t
1fe0: 68 65 20 39 74 68 20 62 79 74 65 20 61 72 65 20  he 9th byte are 
1ff0: 75 73 65 64 20 61 73 20 64 61 74 61 2e 20 20 54  used as data.  T
2000: 68 69 73 0a 2a 2a 20 61 6c 6c 6f 77 73 20 61 20  his.** allows a 
2010: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 74  64-bit integer t
2020: 6f 20 62 65 20 65 6e 63 6f 64 65 64 20 69 6e 20  o be encoded in 
2030: 39 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  9 bytes..**.**  
2040: 20 20 30 78 30 30 20 20 20 20 20 20 20 20 20 20    0x00          
2050: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63 6f              beco
2060: 6d 65 73 20 20 30 78 30 30 30 30 30 30 30 30 0a  mes  0x00000000.
2070: 2a 2a 20 20 20 20 30 78 37 66 20 20 20 20 20 20  **    0x7f      
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30 30  becomes  0x00000
20a0: 30 37 66 0a 2a 2a 20 20 20 20 30 78 38 31 20 30  07f.**    0x81 0
20b0: 78 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  x00             
20c0: 20 20 20 20 62 65 63 6f 6d 65 73 20 20 30 78 30      becomes  0x0
20d0: 30 30 30 30 30 38 30 0a 2a 2a 20 20 20 20 30 78  0000080.**    0x
20e0: 38 32 20 30 78 30 30 20 20 20 20 20 20 20 20 20  82 0x00         
20f0: 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20          becomes 
2100: 20 30 78 30 30 30 30 30 31 30 30 0a 2a 2a 20 20   0x00000100.**  
2110: 20 20 30 78 38 30 20 30 78 37 66 20 20 20 20 20    0x80 0x7f     
2120: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63 6f              beco
2130: 6d 65 73 20 20 30 78 30 30 30 30 30 30 37 66 0a  mes  0x0000007f.
2140: 2a 2a 20 20 20 20 30 78 38 61 20 30 78 39 31 20  **    0x8a 0x91 
2150: 30 78 64 31 20 30 78 61 63 20 30 78 37 38 20 20  0xd1 0xac 0x78  
2160: 62 65 63 6f 6d 65 73 20 20 30 78 31 32 33 34 35  becomes  0x12345
2170: 36 37 38 0a 2a 2a 20 20 20 20 30 78 38 31 20 30  678.**    0x81 0
2180: 78 38 31 20 30 78 38 31 20 30 78 38 31 20 30 78  x81 0x81 0x81 0x
2190: 30 31 20 20 62 65 63 6f 6d 65 73 20 20 30 78 31  01  becomes  0x1
21a0: 30 32 30 34 30 38 31 0a 2a 2a 0a 2a 2a 20 56 61  0204081.**.** Va
21b0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
21c0: 74 65 67 65 72 73 20 61 72 65 20 75 73 65 64 20  tegers are used 
21d0: 66 6f 72 20 72 6f 77 69 64 73 20 61 6e 64 20 74  for rowids and t
21e0: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 75 6d 62 65  o hold the numbe
21f0: 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 6f 66  r of.** bytes of
2200: 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 69 6e   key and data in
2210: 20 61 20 62 74 72 65 65 20 63 65 6c 6c 2e 0a 2a   a btree cell..*
2220: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
2230: 20 6f 66 20 61 20 63 65 6c 6c 20 6c 6f 6f 6b 73   of a cell looks
2240: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
2250: 2a 20 20 20 20 53 49 5a 45 20 20 20 20 44 45 53  *    SIZE    DES
2260: 43 52 49 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20  CRIPTION.**     
2270: 20 34 20 20 20 20 20 50 61 67 65 20 6e 75 6d 62   4     Page numb
2280: 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74 20 63  er of the left c
2290: 68 69 6c 64 2e 20 4f 6d 69 74 74 65 64 20 69 66  hild. Omitted if
22a0: 20 6c 65 61 66 20 66 6c 61 67 20 69 73 20 73 65   leaf flag is se
22b0: 74 2e 0a 2a 2a 20 20 20 20 20 76 61 72 20 20 20  t..**     var   
22c0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
22d0: 20 6f 66 20 64 61 74 61 2e 20 4f 6d 69 74 74 65   of data. Omitte
22e0: 64 20 69 66 20 74 68 65 20 7a 65 72 6f 64 61 74  d if the zerodat
22f0: 61 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a  a flag is set..*
2300: 2a 20 20 20 20 20 76 61 72 20 20 20 20 4e 75 6d  *     var    Num
2310: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2320: 6b 65 79 2e 20 4f 72 20 74 68 65 20 6b 65 79 20  key. Or the key 
2330: 69 74 73 65 6c 66 20 69 66 20 69 6e 74 6b 65 79  itself if intkey
2340: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a 2a   flag is set..**
2350: 20 20 20 20 20 20 2a 20 20 20 20 20 50 61 79 6c        *     Payl
2360: 6f 61 64 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  oad.**      4   
2370: 20 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20    First page of 
2380: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
2390: 69 6e 2e 20 20 4f 6d 69 74 74 65 64 20 69 66 20  in.  Omitted if 
23a0: 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 0a 2a  no overflow.**.*
23b0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  * Overflow pages
23c0: 20 66 6f 72 6d 20 61 20 6c 69 6e 6b 65 64 20 6c   form a linked l
23d0: 69 73 74 2e 20 20 45 61 63 68 20 70 61 67 65 20  ist.  Each page 
23e0: 65 78 63 65 70 74 20 74 68 65 20 6c 61 73 74 20  except the last 
23f0: 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a  is completely.**
2400: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 64 61 74   filled with dat
2410: 61 20 28 70 61 67 65 73 69 7a 65 20 2d 20 34 20  a (pagesize - 4 
2420: 62 79 74 65 73 29 2e 20 20 54 68 65 20 6c 61 73  bytes).  The las
2430: 74 20 70 61 67 65 20 63 61 6e 20 68 61 76 65 20  t page can have 
2440: 61 73 20 6c 69 74 74 6c 65 0a 2a 2a 20 61 73 20  as little.** as 
2450: 31 20 62 79 74 65 20 6f 66 20 64 61 74 61 2e 0a  1 byte of data..
2460: 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20 20  **.**    SIZE   
2470: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
2480: 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65 20       4     Page 
2490: 6e 75 6d 62 65 72 20 6f 66 20 6e 65 78 74 20 6f  number of next o
24a0: 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 2a 2a 20  verflow page.** 
24b0: 20 20 20 20 20 2a 20 20 20 20 20 44 61 74 61 0a       *     Data.
24c0: 2a 2a 0a 2a 2a 20 46 72 65 65 6c 69 73 74 20 70  **.** Freelist p
24d0: 61 67 65 73 20 63 6f 6d 65 20 69 6e 20 74 77 6f  ages come in two
24e0: 20 73 75 62 74 79 70 65 73 3a 20 74 72 75 6e 6b   subtypes: trunk
24f0: 20 70 61 67 65 73 20 61 6e 64 20 6c 65 61 66 20   pages and leaf 
2500: 70 61 67 65 73 2e 20 20 54 68 65 0a 2a 2a 20 66  pages.  The.** f
2510: 69 6c 65 20 68 65 61 64 65 72 20 70 6f 69 6e 74  ile header point
2520: 73 20 74 6f 20 66 69 72 73 74 20 69 6e 20 61 20  s to first in a 
2530: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 74  linked list of t
2540: 72 75 6e 6b 20 70 61 67 65 2e 20 20 45 61 63 68  runk page.  Each
2550: 20 74 72 75 6e 6b 0a 2a 2a 20 70 61 67 65 20 70   trunk.** page p
2560: 6f 69 6e 74 73 20 74 6f 20 6d 75 6c 74 69 70 6c  oints to multipl
2570: 65 20 6c 65 61 66 20 70 61 67 65 73 2e 20 20 54  e leaf pages.  T
2580: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
2590: 6c 65 61 66 20 70 61 67 65 20 69 73 0a 2a 2a 20  leaf page is.** 
25a0: 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 41 20  unspecified.  A 
25b0: 74 72 75 6e 6b 20 70 61 67 65 20 6c 6f 6f 6b 73  trunk page looks
25c0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
25d0: 2a 20 20 20 20 53 49 5a 45 20 20 20 20 44 45 53  *    SIZE    DES
25e0: 43 52 49 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20  CRIPTION.**     
25f0: 20 34 20 20 20 20 20 50 61 67 65 20 6e 75 6d 62   4     Page numb
2600: 65 72 20 6f 66 20 6e 65 78 74 20 74 72 75 6e 6b  er of next trunk
2610: 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 34 20   page.**      4 
2620: 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65      Number of le
2630: 61 66 20 70 6f 69 6e 74 65 72 73 20 6f 6e 20 74  af pointers on t
2640: 68 69 73 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  his page.**     
2650: 20 2a 20 20 20 20 20 7a 65 72 6f 20 6f 72 20 6d   *     zero or m
2660: 6f 72 65 20 70 61 67 65 73 20 6e 75 6d 62 65 72  ore pages number
2670: 73 20 6f 66 20 6c 65 61 76 65 73 0a 2a 2f 0a 23  s of leaves.*/.#
2680: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
2690: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
26a0: 70 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64  pager.h".#includ
26b0: 65 20 22 62 74 72 65 65 2e 68 22 0a 23 69 6e 63  e "btree.h".#inc
26c0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
26d0: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
26e0: 0a 2f 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 6e  ./* Round up a n
26f0: 75 6d 62 65 72 20 74 6f 20 74 68 65 20 6e 65 78  umber to the nex
2700: 74 20 6c 61 72 67 65 72 20 6d 75 6c 74 69 70 6c  t larger multipl
2710: 65 20 6f 66 20 38 2e 20 20 54 68 69 73 20 69 73  e of 8.  This is
2720: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 66 6f 72 63   used.** to forc
2730: 65 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  e 8-byte alignme
2740: 6e 74 20 6f 6e 20 36 34 2d 62 69 74 20 61 72 63  nt on 64-bit arc
2750: 68 69 74 65 63 74 75 72 65 73 2e 0a 2a 2f 0a 23  hitectures..*/.#
2760: 64 65 66 69 6e 65 20 52 4f 55 4e 44 38 28 78 29  define ROUND8(x)
2770: 20 20 20 28 28 78 2b 37 29 26 7e 37 29 0a 0a 0a     ((x+7)&~7)...
2780: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2790: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6d 61   value is the ma
27a0: 78 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  ximum cell size 
27b0: 61 73 73 75 6d 69 6e 67 20 61 20 6d 61 78 69 6d  assuming a maxim
27c0: 75 6d 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  um page.** size 
27d0: 67 69 76 65 20 61 62 6f 76 65 2e 0a 2a 2f 0a 23  give above..*/.#
27e0: 64 65 66 69 6e 65 20 4d 58 5f 43 45 4c 4c 5f 53  define MX_CELL_S
27f0: 49 5a 45 28 70 42 74 29 20 20 28 70 42 74 2d 3e  IZE(pBt)  (pBt->
2800: 70 61 67 65 53 69 7a 65 2d 38 29 0a 0a 2f 2a 20  pageSize-8)../* 
2810: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
2820: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61  er of cells on a
2830: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20   single page of 
2840: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
2850: 68 69 73 0a 2a 2a 20 61 73 73 75 6d 65 73 20 61  his.** assumes a
2860: 20 6d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   minimum cell si
2870: 7a 65 20 6f 66 20 33 20 62 79 74 65 73 2e 20 20  ze of 3 bytes.  
2880: 53 75 63 68 20 73 6d 61 6c 6c 20 63 65 6c 6c 73  Such small cells
2890: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 65 78 63 65   will be.** exce
28a0: 65 64 69 6e 67 6c 79 20 72 61 72 65 2c 20 62 75  edingly rare, bu
28b0: 74 20 74 68 65 79 20 61 72 65 20 70 6f 73 73 69  t they are possi
28c0: 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ble..*/.#define 
28d0: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 28 28 70  MX_CELL(pBt) ((p
28e0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 38 29 2f  Bt->pageSize-8)/
28f0: 33 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  3)../* Forward d
2900: 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 74  eclarations */.t
2910: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 65  ypedef struct Me
2920: 6d 50 61 67 65 20 4d 65 6d 50 61 67 65 3b 0a 74  mPage MemPage;.t
2930: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 42 74  ypedef struct Bt
2940: 4c 6f 63 6b 20 42 74 4c 6f 63 6b 3b 0a 0a 2f 2a  Lock BtLock;../*
2950: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6d 61  .** This is a ma
2960: 67 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20  gic string that 
2970: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62  appears at the b
2980: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72  eginning of ever
2990: 79 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61  y.** SQLite data
29a0: 62 61 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  base in order to
29b0: 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 66 69   identify the fi
29c0: 6c 65 20 61 73 20 61 20 72 65 61 6c 20 64 61 74  le as a real dat
29d0: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 59 6f 75  abase..**.** You
29e0: 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 69 73   can change this
29f0: 20 76 61 6c 75 65 20 61 74 20 63 6f 6d 70 69 6c   value at compil
2a00: 65 2d 74 69 6d 65 20 62 79 20 73 70 65 63 69 66  e-time by specif
2a10: 79 69 6e 67 20 61 0a 2a 2a 20 2d 44 53 51 4c 49  ying a.** -DSQLI
2a20: 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3d 22  TE_FILE_HEADER="
2a30: 2e 2e 2e 22 20 6f 6e 20 74 68 65 20 63 6f 6d 70  ..." on the comp
2a40: 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  iler command-lin
2a50: 65 2e 20 20 54 68 65 0a 2a 2a 20 68 65 61 64 65  e.  The.** heade
2a60: 72 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  r must be exactl
2a70: 79 20 31 36 20 62 79 74 65 73 20 69 6e 63 6c 75  y 16 bytes inclu
2a80: 64 69 6e 67 20 74 68 65 20 7a 65 72 6f 2d 74 65  ding the zero-te
2a90: 72 6d 69 6e 61 74 6f 72 20 73 6f 0a 2a 2a 20 74  rminator so.** t
2aa0: 68 65 20 73 74 72 69 6e 67 20 69 74 73 65 6c 66  he string itself
2ab0: 20 73 68 6f 75 6c 64 20 62 65 20 31 35 20 63 68   should be 15 ch
2ac0: 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 20  aracters long.  
2ad0: 49 66 20 79 6f 75 20 63 68 61 6e 67 65 0a 2a 2a  If you change.**
2ae0: 20 74 68 65 20 68 65 61 64 65 72 2c 20 74 68 65   the header, the
2af0: 6e 20 79 6f 75 72 20 63 75 73 74 6f 6d 20 6c 69  n your custom li
2b00: 62 72 61 72 79 20 77 69 6c 6c 20 6e 6f 74 20 62  brary will not b
2b10: 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 0a  e able to read .
2b20: 2a 2a 20 64 61 74 61 62 61 73 65 73 20 67 65 6e  ** databases gen
2b30: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 73 74  erated by the st
2b40: 61 6e 64 61 72 64 20 74 6f 6f 6c 73 20 61 6e 64  andard tools and
2b50: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 74 6f   the standard to
2b60: 6f 6c 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  ols.** will not 
2b70: 62 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20  be able to read 
2b80: 64 61 74 61 62 61 73 65 73 20 63 72 65 61 74 65  databases create
2b90: 64 20 62 79 20 79 6f 75 72 20 63 75 73 74 6f 6d  d by your custom
2ba0: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
2bb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 46 49 4c 45  ndef SQLITE_FILE
2bc0: 5f 48 45 41 44 45 52 20 2f 2a 20 31 32 33 34 35  _HEADER /* 12345
2bd0: 36 37 38 39 20 31 32 33 34 35 36 20 2a 2f 0a 23  6789 123456 */.#
2be0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2bf0: 46 49 4c 45 5f 48 45 41 44 45 52 20 22 53 51 4c  FILE_HEADER "SQL
2c00: 69 74 65 20 66 6f 72 6d 61 74 20 33 22 0a 23 65  ite format 3".#e
2c10: 6e 64 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73  ndif.static cons
2c20: 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48 65 61  t char zMagicHea
2c30: 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 46  der[] = SQLITE_F
2c40: 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f 2a 0a  ILE_HEADER;../*.
2c50: 2a 2a 20 50 61 67 65 20 74 79 70 65 20 66 6c 61  ** Page type fla
2c60: 67 73 2e 20 20 41 6e 20 4f 52 65 64 20 63 6f 6d  gs.  An ORed com
2c70: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73  bination of thes
2c80: 65 20 66 6c 61 67 73 20 61 70 70 65 61 72 20 61  e flags appear a
2c90: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 62  s the.** first b
2ca0: 79 74 65 20 6f 66 20 65 76 65 72 79 20 42 54 72  yte of every BTr
2cb0: 65 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 64 65 66  ee page..*/.#def
2cc0: 69 6e 65 20 50 54 46 5f 49 4e 54 4b 45 59 20 20  ine PTF_INTKEY  
2cd0: 20 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 50    0x01.#define P
2ce0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 20 30 78 30  TF_ZERODATA  0x0
2cf0: 32 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 4c 45  2.#define PTF_LE
2d00: 41 46 44 41 54 41 20 20 30 78 30 34 0a 23 64 65  AFDATA  0x04.#de
2d10: 66 69 6e 65 20 50 54 46 5f 4c 45 41 46 20 20 20  fine PTF_LEAF   
2d20: 20 20 20 30 78 30 38 0a 0a 2f 2a 0a 2a 2a 20 41     0x08../*.** A
2d30: 73 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 74  s each page of t
2d40: 68 65 20 66 69 6c 65 20 69 73 20 6c 6f 61 64 65  he file is loade
2d50: 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2c 20 61  d into memory, a
2d60: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2d70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73  e following.** s
2d80: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 65  tructure is appe
2d90: 6e 64 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c  nded and initial
2da0: 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2e 20 20 54  ized to zero.  T
2db0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 73 74  his structure st
2dc0: 6f 72 65 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ores.** informat
2dd0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 70 61  ion about the pa
2de0: 67 65 20 74 68 61 74 20 69 73 20 64 65 63 6f 64  ge that is decod
2df0: 65 64 20 66 72 6f 6d 20 74 68 65 20 72 61 77 20  ed from the raw 
2e00: 66 69 6c 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  file page..**.**
2e10: 20 54 68 65 20 70 50 61 72 65 6e 74 20 66 69 65   The pParent fie
2e20: 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 20 74  ld points back t
2e30: 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2e40: 65 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  e.  This allows 
2e50: 75 73 20 74 6f 0a 2a 2a 20 77 61 6c 6b 20 75 70  us to.** walk up
2e60: 20 74 68 65 20 42 54 72 65 65 20 66 72 6f 6d 20   the BTree from 
2e70: 61 6e 79 20 6c 65 61 66 20 74 6f 20 74 68 65 20  any leaf to the 
2e80: 72 6f 6f 74 2e 20 20 43 61 72 65 20 6d 75 73 74  root.  Care must
2e90: 20 62 65 20 74 61 6b 65 6e 20 74 6f 0a 2a 2a 20   be taken to.** 
2ea0: 75 6e 72 65 66 28 29 20 74 68 65 20 70 61 72 65  unref() the pare
2eb0: 6e 74 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  nt page pointer 
2ec0: 77 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69  when this page i
2ed0: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 66 65  s no longer refe
2ee0: 72 65 6e 63 65 64 2e 0a 2a 2a 20 54 68 65 20 70  renced..** The p
2ef0: 61 67 65 44 65 73 74 72 75 63 74 6f 72 28 29 20  ageDestructor() 
2f00: 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20  routine handles 
2f10: 74 68 61 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 73  that chore..*/.s
2f20: 74 72 75 63 74 20 4d 65 6d 50 61 67 65 20 7b 0a  truct MemPage {.
2f30: 20 20 75 38 20 69 73 49 6e 69 74 3b 20 20 20 20    u8 isInit;    
2f40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2f50: 66 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 69  f previously ini
2f60: 74 69 61 6c 69 7a 65 64 2e 20 4d 55 53 54 20 42  tialized. MUST B
2f70: 45 20 46 49 52 53 54 21 20 2a 2f 0a 20 20 75 38  E FIRST! */.  u8
2f80: 20 69 64 78 53 68 69 66 74 3b 20 20 20 20 20 20   idxShift;      
2f90: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 43 65     /* True if Ce
2fa0: 6c 6c 20 69 6e 64 69 63 65 73 20 68 61 76 65 20  ll indices have 
2fb0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20  changed */.  u8 
2fc0: 6e 4f 76 65 72 66 6c 6f 77 3b 20 20 20 20 20 20  nOverflow;      
2fd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
2fe0: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 62 6f 64  verflow cell bod
2ff0: 69 65 73 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 2a  ies in aCell[] *
3000: 2f 0a 20 20 75 38 20 69 6e 74 4b 65 79 3b 20 20  /.  u8 intKey;  
3010: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3020: 20 69 66 20 69 6e 74 6b 65 79 20 66 6c 61 67 20   if intkey flag 
3030: 69 73 20 73 65 74 20 2a 2f 0a 20 20 75 38 20 6c  is set */.  u8 l
3040: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
3050: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 61 66   /* True if leaf
3060: 20 66 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a   flag is set */.
3070: 20 20 75 38 20 7a 65 72 6f 44 61 74 61 3b 20 20    u8 zeroData;  
3080: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3090: 66 20 74 61 62 6c 65 20 73 74 6f 72 65 73 20 6b  f table stores k
30a0: 65 79 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38  eys only */.  u8
30b0: 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20   leafData;      
30c0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 61     /* True if ta
30d0: 62 6c 65 73 20 73 74 6f 72 65 73 20 64 61 74 61  bles stores data
30e0: 20 6f 6e 20 6c 65 61 76 65 73 20 6f 6e 6c 79 20   on leaves only 
30f0: 2a 2f 0a 20 20 75 38 20 68 61 73 44 61 74 61 3b  */.  u8 hasData;
3100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3110: 65 20 69 66 20 74 68 69 73 20 70 61 67 65 20 73  e if this page s
3120: 74 6f 72 65 73 20 64 61 74 61 20 2a 2f 0a 20 20  tores data */.  
3130: 75 38 20 68 64 72 4f 66 66 73 65 74 3b 20 20 20  u8 hdrOffset;   
3140: 20 20 20 20 20 2f 2a 20 31 30 30 20 66 6f 72 20       /* 100 for 
3150: 70 61 67 65 20 31 2e 20 20 30 20 6f 74 68 65 72  page 1.  0 other
3160: 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 63 68 69  wise */.  u8 chi
3170: 6c 64 50 74 72 53 69 7a 65 3b 20 20 20 20 20 2f  ldPtrSize;     /
3180: 2a 20 30 20 69 66 20 6c 65 61 66 3d 3d 31 2e 20  * 0 if leaf==1. 
3190: 20 34 20 69 66 20 6c 65 61 66 3d 3d 30 20 2a 2f   4 if leaf==0 */
31a0: 0a 20 20 75 31 36 20 6d 61 78 4c 6f 63 61 6c 3b  .  u16 maxLocal;
31b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
31c0: 6f 66 20 42 74 72 65 65 2e 6d 61 78 4c 6f 63 61  of Btree.maxLoca
31d0: 6c 20 6f 72 20 42 74 72 65 65 2e 6d 61 78 4c 65  l or Btree.maxLe
31e0: 61 66 20 2a 2f 0a 20 20 75 31 36 20 6d 69 6e 4c  af */.  u16 minL
31f0: 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  ocal;        /* 
3200: 43 6f 70 79 20 6f 66 20 42 74 72 65 65 2e 6d 69  Copy of Btree.mi
3210: 6e 4c 6f 63 61 6c 20 6f 72 20 42 74 72 65 65 2e  nLocal or Btree.
3220: 6d 69 6e 4c 65 61 66 20 2a 2f 0a 20 20 75 31 36  minLeaf */.  u16
3230: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
3240: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 44    /* Index in aD
3250: 61 74 61 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ata of first cel
3260: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75  l pointer */.  u
3270: 31 36 20 69 64 78 50 61 72 65 6e 74 3b 20 20 20  16 idxParent;   
3280: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
3290: 70 61 72 65 6e 74 20 6f 66 20 74 68 69 73 20 6e  parent of this n
32a0: 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 46 72  ode */.  u16 nFr
32b0: 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ee;           /*
32c0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   Number of free 
32d0: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
32e0: 65 20 2a 2f 0a 20 20 75 31 36 20 6e 43 65 6c 6c  e */.  u16 nCell
32f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
3300: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
3310: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 6c 6f 63  n this page, loc
3320: 61 6c 20 61 6e 64 20 6f 76 66 6c 20 2a 2f 0a 20  al and ovfl */. 
3330: 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c   struct _OvflCel
3340: 6c 20 7b 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74  l {   /* Cells t
3350: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  hat will not fit
3360: 20 6f 6e 20 61 44 61 74 61 5b 5d 20 2a 2f 0a 20   on aData[] */. 
3370: 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
3380: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3390: 72 73 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f  rs to the body o
33a0: 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  f the overflow c
33b0: 65 6c 6c 20 2a 2f 0a 20 20 20 20 75 31 36 20 69  ell */.    u16 i
33c0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx;            /
33d0: 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20 63 65  * Insert this ce
33e0: 6c 6c 20 62 65 66 6f 72 65 20 69 64 78 2d 74 68  ll before idx-th
33f0: 20 6e 6f 6e 2d 6f 76 65 72 66 6c 6f 77 20 63 65   non-overflow ce
3400: 6c 6c 20 2a 2f 0a 20 20 7d 20 61 4f 76 66 6c 5b  ll */.  } aOvfl[
3410: 35 5d 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  5];.  BtShared *
3420: 70 42 74 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  pBt;       /* Po
3430: 69 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 42 54  inter back to BT
3440: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
3450: 0a 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20  .  u8 *aData;   
3460: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
3470: 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  er back to the s
3480: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
3490: 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
34a0: 62 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 50 61  bPage;     /* Pa
34b0: 67 65 72 20 70 61 67 65 20 68 61 6e 64 6c 65 20  ger page handle 
34c0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
34d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
34e0: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  e number for thi
34f0: 73 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50  s page */.  MemP
3500: 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20  age *pParent;   
3510: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
3520: 66 20 74 68 69 73 20 70 61 67 65 2e 20 20 4e 55  f this page.  NU
3530: 4c 4c 20 66 6f 72 20 72 6f 6f 74 20 2a 2f 0a 7d  LL for root */.}
3540: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 2d  ;../*.** The in-
3550: 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
3560: 61 20 64 69 73 6b 20 70 61 67 65 20 68 61 73 20  a disk page has 
3570: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
3580: 66 6f 72 6d 61 74 69 6f 6e 20 61 70 70 65 6e 64  formation append
3590: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 65 6e 64  ed.** to the end
35a0: 2e 20 20 45 58 54 52 41 5f 53 49 5a 45 20 69 73  .  EXTRA_SIZE is
35b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
35c0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65  ytes of space ne
35d0: 65 64 65 64 20 74 6f 20 68 6f 6c 64 0a 2a 2a 20  eded to hold.** 
35e0: 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72  that extra infor
35f0: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69  mation..*/.#defi
3600: 6e 65 20 45 58 54 52 41 5f 53 49 5a 45 20 73 69  ne EXTRA_SIZE si
3610: 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 0a 0a 2f  zeof(MemPage)../
3620: 2a 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 2a  * Btree handle *
3630: 2f 0a 73 74 72 75 63 74 20 42 74 72 65 65 20 7b  /.struct Btree {
3640: 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 53 71 6c  .  sqlite3 *pSql
3650: 69 74 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ite;.  BtShared 
3660: 2a 70 42 74 3b 0a 20 20 75 38 20 69 6e 54 72 61  *pBt;.  u8 inTra
3670: 6e 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ns;            /
3680: 2a 20 54 52 41 4e 53 5f 4e 4f 4e 45 2c 20 54 52  * TRANS_NONE, TR
3690: 41 4e 53 5f 52 45 41 44 20 6f 72 20 54 52 41 4e  ANS_READ or TRAN
36a0: 53 5f 57 52 49 54 45 20 2a 2f 0a 7d 3b 0a 0a 2f  S_WRITE */.};../
36b0: 2a 0a 2a 2a 20 42 74 72 65 65 2e 69 6e 54 72 61  *.** Btree.inTra
36c0: 6e 73 20 6d 61 79 20 74 61 6b 65 20 6f 6e 65 20  ns may take one 
36d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
36e0: 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   values..**.** I
36f0: 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74  f the shared-dat
3700: 61 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 65  a extension is e
3710: 6e 61 62 6c 65 64 2c 20 74 68 65 72 65 20 6d 61  nabled, there ma
3720: 79 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 75 73  y be multiple us
3730: 65 72 73 0a 2a 2a 20 6f 66 20 74 68 65 20 42 74  ers.** of the Bt
3740: 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 41  ree structure. A
3750: 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 66 20 74 68  t most one of th
3760: 65 73 65 20 6d 61 79 20 6f 70 65 6e 20 61 20 77  ese may open a w
3770: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
3780: 2c 0a 2a 2a 20 62 75 74 20 61 6e 79 20 6e 75 6d  ,.** but any num
3790: 62 65 72 20 6d 61 79 20 68 61 76 65 20 61 63 74  ber may have act
37a0: 69 76 65 20 72 65 61 64 20 74 72 61 6e 73 61 63  ive read transac
37b0: 74 69 6f 6e 73 2e 20 56 61 72 69 61 62 6c 65 20  tions. Variable 
37c0: 42 74 72 65 65 2e 70 44 62 20 0a 2a 2a 20 70 6f  Btree.pDb .** po
37d0: 69 6e 74 73 20 74 6f 20 74 68 65 20 68 61 6e 64  ints to the hand
37e0: 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 61 6e 79  le that owns any
37f0: 20 63 75 72 72 65 6e 74 20 77 72 69 74 65 2d 74   current write-t
3800: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 23  ransaction..*/.#
3810: 64 65 66 69 6e 65 20 54 52 41 4e 53 5f 4e 4f 4e  define TRANS_NON
3820: 45 20 20 30 0a 23 64 65 66 69 6e 65 20 54 52 41  E  0.#define TRA
3830: 4e 53 5f 52 45 41 44 20 20 31 0a 23 64 65 66 69  NS_READ  1.#defi
3840: 6e 65 20 54 52 41 4e 53 5f 57 52 49 54 45 20 32  ne TRANS_WRITE 2
3850: 0a 0a 2f 2a 0a 2a 2a 20 45 76 65 72 79 74 68 69  ../*.** Everythi
3860: 6e 67 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e  ng we need to kn
3870: 6f 77 20 61 62 6f 75 74 20 61 6e 20 6f 70 65 6e  ow about an open
3880: 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 72   database.*/.str
3890: 75 63 74 20 42 74 53 68 61 72 65 64 20 7b 0a 20  uct BtShared {. 
38a0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
38b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
38c0: 67 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 42 74  ge cache */.  Bt
38d0: 43 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 3b  Cursor *pCursor;
38e0: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
38f0: 20 61 6c 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72   all open cursor
3900: 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
3910: 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20  pPage1;      /* 
3920: 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
3930: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
3940: 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20  u8 inStmt;      
3950: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3960: 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74 61   we are in a sta
3970: 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
3980: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 72 65  ction */.  u8 re
3990: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
39a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
39b0: 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20  underlying file 
39c0: 69 73 20 72 65 61 64 6f 6e 6c 79 20 2a 2f 0a 20  is readonly */. 
39d0: 20 75 38 20 6d 61 78 45 6d 62 65 64 46 72 61 63   u8 maxEmbedFrac
39e0: 3b 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75  ;      /* Maximu
39f0: 6d 20 70 61 79 6c 6f 61 64 20 61 73 20 25 20 6f  m payload as % o
3a00: 66 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a  f total page siz
3a10: 65 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 45 6d 62  e */.  u8 minEmb
3a20: 65 64 46 72 61 63 3b 20 20 20 20 20 20 2f 2a 20  edFrac;      /* 
3a30: 4d 69 6e 69 6d 75 6d 20 70 61 79 6c 6f 61 64 20  Minimum payload 
3a40: 61 73 20 25 20 6f 66 20 74 6f 74 61 6c 20 70 61  as % of total pa
3a50: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38 20  ge size */.  u8 
3a60: 6d 69 6e 4c 65 61 66 46 72 61 63 3b 20 20 20 20  minLeafFrac;    
3a70: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65     /* Minimum le
3a80: 61 66 20 70 61 79 6c 6f 61 64 20 61 73 20 25 20  af payload as % 
3a90: 6f 66 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69  of total page si
3aa0: 7a 65 20 2a 2f 0a 20 20 75 38 20 70 61 67 65 53  ze */.  u8 pageS
3ab0: 69 7a 65 46 69 78 65 64 3b 20 20 20 20 20 2f 2a  izeFixed;     /*
3ac0: 20 54 72 75 65 20 69 66 20 74 68 65 20 70 61 67   True if the pag
3ad0: 65 20 73 69 7a 65 20 63 61 6e 20 6e 6f 20 6c 6f  e size can no lo
3ae0: 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 20  nger be changed 
3af0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
3b00: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
3b10: 4d 0a 20 20 75 38 20 61 75 74 6f 56 61 63 75 75  M.  u8 autoVacuu
3b20: 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  m;        /* Tru
3b30: 65 20 69 66 20 64 61 74 61 62 61 73 65 20 73 75  e if database su
3b40: 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
3b50: 75 6d 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 75  um */.#endif.  u
3b60: 31 36 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20  16 pageSize;    
3b70: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
3b80: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e  mber of bytes on
3b90: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36   a page */.  u16
3ba0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
3bb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3bc0: 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20  usable bytes on 
3bd0: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  each page */.  i
3be0: 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 20 20  nt maxLocal;    
3bf0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
3c00: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69 6e  local payload in
3c10: 20 6e 6f 6e 2d 4c 45 41 46 44 41 54 41 20 74 61   non-LEAFDATA ta
3c20: 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 69  bles */.  int mi
3c30: 6e 4c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 20  nLocal;         
3c40: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 6f 63 61 6c  /* Minimum local
3c50: 20 70 61 79 6c 6f 61 64 20 69 6e 20 6e 6f 6e 2d   payload in non-
3c60: 4c 45 41 46 44 41 54 41 20 74 61 62 6c 65 73 20  LEAFDATA tables 
3c70: 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 65 61 66  */.  int maxLeaf
3c80: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  ;          /* Ma
3c90: 78 69 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79 6c  ximum local payl
3ca0: 6f 61 64 20 69 6e 20 61 20 4c 45 41 46 44 41 54  oad in a LEAFDAT
3cb0: 41 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  A table */.  int
3cc0: 20 6d 69 6e 4c 65 61 66 3b 20 20 20 20 20 20 20   minLeaf;       
3cd0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 6f     /* Minimum lo
3ce0: 63 61 6c 20 70 61 79 6c 6f 61 64 20 69 6e 20 61  cal payload in a
3cf0: 20 4c 45 41 46 44 41 54 41 20 74 61 62 6c 65 20   LEAFDATA table 
3d00: 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72  */.  BusyHandler
3d10: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20   *pBusyHandler; 
3d20: 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f    /* Callback fo
3d30: 72 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  r when there is 
3d40: 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 20  lock contention 
3d50: 2a 2f 0a 20 20 75 38 20 69 6e 54 72 61 6e 73 61  */.  u8 inTransa
3d60: 63 74 69 6f 6e 3b 20 20 20 20 20 2f 2a 20 54 72  ction;     /* Tr
3d70: 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
3d80: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3da0: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
3db0: 65 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  es to this struc
3dc0: 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ture */.  int nT
3dd0: 72 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20 20  ransaction;     
3de0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 65  /* Number of ope
3df0: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 28  n transactions (
3e00: 72 65 61 64 20 2b 20 77 72 69 74 65 29 20 2a 2f  read + write) */
3e10: 0a 20 20 76 6f 69 64 20 2a 70 53 63 68 65 6d 61  .  void *pSchema
3e20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ;        /* Poin
3e30: 74 65 72 20 74 6f 20 73 70 61 63 65 20 61 6c 6c  ter to space all
3e40: 6f 63 61 74 65 64 20 62 79 20 73 71 6c 69 74 65  ocated by sqlite
3e50: 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 20 2a  3BtreeSchema() *
3e60: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 46 72 65 65  /.  void (*xFree
3e70: 53 63 68 65 6d 61 29 28 76 6f 69 64 2a 29 3b 20  Schema)(void*); 
3e80: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
3e90: 6f 72 20 42 74 53 68 61 72 65 64 2e 70 53 63 68  or BtShared.pSch
3ea0: 65 6d 61 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ema */.#ifndef S
3eb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
3ec0: 44 5f 43 41 43 48 45 0a 20 20 42 74 4c 6f 63 6b  D_CACHE.  BtLock
3ed0: 20 2a 70 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   *pLock;        
3ee0: 2f 2a 20 4c 69 73 74 20 6f 66 20 6c 6f 63 6b 73  /* List of locks
3ef0: 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 73 68   held on this sh
3f00: 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
3f10: 74 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  t */.  BtShared 
3f20: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20  *pNext;      /* 
3f30: 4e 65 78 74 20 69 6e 20 54 68 72 65 61 64 44 61  Next in ThreadDa
3f40: 74 61 2e 70 42 74 72 65 65 20 6c 69 6e 6b 65 64  ta.pBtree linked
3f50: 20 6c 69 73 74 20 2a 2f 0a 23 65 6e 64 69 66 0a   list */.#endif.
3f60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
3f70: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
3f80: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3f90: 20 69 73 20 75 73 65 64 20 74 6f 20 68 6f 6c 64   is used to hold
3fa0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
3fb0: 61 62 6f 75 74 20 61 20 63 65 6c 6c 2e 20 20 54  about a cell.  T
3fc0: 68 65 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28  he parseCellPtr(
3fd0: 29 20 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 73  ) function fills
3fe0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
3ff0: 72 65 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 69  re.** based on i
4000: 6e 66 6f 72 6d 61 74 69 6f 6e 20 65 78 74 72 61  nformation extra
4010: 63 74 20 66 72 6f 6d 20 74 68 65 20 72 61 77 20  ct from the raw 
4020: 64 69 73 6b 20 70 61 67 65 2e 0a 2a 2f 0a 74 79  disk page..*/.ty
4030: 70 65 64 65 66 20 73 74 72 75 63 74 20 43 65 6c  pedef struct Cel
4040: 6c 49 6e 66 6f 20 43 65 6c 6c 49 6e 66 6f 3b 0a  lInfo CellInfo;.
4050: 73 74 72 75 63 74 20 43 65 6c 6c 49 6e 66 6f 20  struct CellInfo 
4060: 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20  {.  u8 *pCell;  
4070: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
4080: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 65   the start of ce
4090: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
40a0: 69 36 34 20 6e 4b 65 79 3b 20 20 20 20 20 20 2f  i64 nKey;      /
40b0: 2a 20 54 68 65 20 6b 65 79 20 66 6f 72 20 49 4e  * The key for IN
40c0: 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f 72 20  TKEY tables, or 
40d0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
40e0: 69 6e 20 6b 65 79 20 2a 2f 0a 20 20 75 33 32 20  in key */.  u32 
40f0: 6e 44 61 74 61 3b 20 20 20 20 20 2f 2a 20 4e 75  nData;     /* Nu
4100: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
4110: 20 64 61 74 61 20 2a 2f 0a 20 20 75 33 32 20 6e   data */.  u32 n
4120: 50 61 79 6c 6f 61 64 3b 20 20 2f 2a 20 54 6f 74  Payload;  /* Tot
4130: 61 6c 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  al amount of pay
4140: 6c 6f 61 64 20 2a 2f 0a 20 20 75 31 36 20 6e 48  load */.  u16 nH
4150: 65 61 64 65 72 3b 20 20 20 2f 2a 20 53 69 7a 65  eader;   /* Size
4160: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
4170: 74 65 6e 74 20 68 65 61 64 65 72 20 69 6e 20 62  tent header in b
4180: 79 74 65 73 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  ytes */.  u16 nL
4190: 6f 63 61 6c 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  ocal;    /* Amou
41a0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
41b0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
41c0: 75 31 36 20 69 4f 76 65 72 66 6c 6f 77 3b 20 2f  u16 iOverflow; /
41d0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 6f 76 65 72  * Offset to over
41e0: 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
41f0: 2e 20 20 5a 65 72 6f 20 69 66 20 6e 6f 20 6f 76  .  Zero if no ov
4200: 65 72 66 6c 6f 77 20 2a 2f 0a 20 20 75 31 36 20  erflow */.  u16 
4210: 6e 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 53 69  nSize;     /* Si
4220: 7a 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  ze of the cell c
4230: 6f 6e 74 65 6e 74 20 6f 6e 20 74 68 65 20 6d 61  ontent on the ma
4240: 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 20 2a  in b-tree page *
4250: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 75  /.};../*.** A cu
4260: 72 73 6f 72 20 69 73 20 61 20 70 6f 69 6e 74 65  rsor is a pointe
4270: 72 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  r to a particula
4280: 72 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 42  r entry in the B
4290: 54 72 65 65 2e 0a 2a 2a 20 54 68 65 20 65 6e 74  Tree..** The ent
42a0: 72 79 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  ry is identified
42b0: 20 62 79 20 69 74 73 20 4d 65 6d 50 61 67 65 20   by its MemPage 
42c0: 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
42d0: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 43 65 6c  .** MemPage.aCel
42e0: 6c 5b 5d 20 6f 66 20 74 68 65 20 65 6e 74 72 79  l[] of the entry
42f0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42 74 43 75  ..*/.struct BtCu
4300: 72 73 6f 72 20 7b 0a 20 20 42 74 72 65 65 20 2a  rsor {.  Btree *
4310: 70 42 74 72 65 65 3b 20 20 20 20 20 20 20 20 20  pBtree;         
4320: 20 20 20 2f 2a 20 54 68 65 20 42 74 72 65 65 20     /* The Btree 
4330: 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 63 75  to which this cu
4340: 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  rsor belongs */.
4350: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 4e 65 78    BtCursor *pNex
4360: 74 2c 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 46  t, *pPrev;  /* F
4370: 6f 72 6d 73 20 61 20 6c 69 6e 6b 65 64 20 6c 69  orms a linked li
4380: 73 74 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  st of all cursor
4390: 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6f  s */.  int (*xCo
43a0: 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
43b0: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
43c0: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 3b 20 2f  ,const void*); /
43d0: 2a 20 4b 65 79 20 63 6f 6d 70 20 66 75 6e 63 20  * Key comp func 
43e0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 3b  */.  void *pArg;
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4400: 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
4410: 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 50  Compare() */.  P
4420: 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 20 20 20  gno pgnoRoot;   
4430: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4440: 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 69  root page of thi
4450: 73 20 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50  s tree */.  MemP
4460: 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
4470: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 68        /* Page th
4480: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
4490: 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  entry */.  int i
44a0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
44b0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
44c0: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 70 50   the entry in pP
44d0: 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  age->aCell[] */.
44e0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4500: 20 70 61 72 73 65 20 6f 66 20 74 68 65 20 63 65   parse of the ce
4510: 6c 6c 20 77 65 20 61 72 65 20 70 6f 69 6e 74 69  ll we are pointi
4520: 6e 67 20 61 74 20 2a 2f 0a 20 20 75 38 20 77 72  ng at */.  u8 wr
4530: 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20  Flag;           
4540: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
4550: 77 72 69 74 61 62 6c 65 20 2a 2f 0a 20 20 75 38  writable */.  u8
4560: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
4570: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
4580: 66 20 74 68 65 20 43 55 52 53 4f 52 5f 58 58 58  f the CURSOR_XXX
4590: 20 63 6f 6e 73 74 61 6e 74 73 20 28 73 65 65 20   constants (see 
45a0: 62 65 6c 6f 77 29 20 2a 2f 0a 20 20 76 6f 69 64  below) */.  void
45b0: 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 2f 2a 20   *pKey;      /* 
45c0: 53 61 76 65 64 20 6b 65 79 20 74 68 61 74 20 77  Saved key that w
45d0: 61 73 20 63 75 72 73 6f 72 27 73 20 6c 61 73 74  as cursor's last
45e0: 20 6b 6e 6f 77 6e 20 70 6f 73 69 74 69 6f 6e 20   known position 
45f0: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 3b 20 20  */.  i64 nKey;  
4600: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
4610: 20 70 4b 65 79 2c 20 6f 72 20 6c 61 73 74 20 69   pKey, or last i
4620: 6e 74 65 67 65 72 20 6b 65 79 20 2a 2f 0a 20 20  nteger key */.  
4630: 69 6e 74 20 73 6b 69 70 3b 20 20 20 20 20 20 20  int skip;       
4640: 20 2f 2a 20 28 73 6b 69 70 3c 30 29 20 2d 3e 20   /* (skip<0) -> 
4650: 50 72 65 76 28 29 20 69 73 20 61 20 6e 6f 2d 6f  Prev() is a no-o
4660: 70 2e 20 28 73 6b 69 70 3e 30 29 20 2d 3e 20 4e  p. (skip>0) -> N
4670: 65 78 74 28 29 20 69 73 20 2a 2f 0a 7d 3b 0a 0a  ext() is */.};..
4680: 2f 2a 0a 2a 2a 20 50 6f 74 65 6e 74 69 61 6c 20  /*.** Potential 
4690: 76 61 6c 75 65 73 20 66 6f 72 20 42 74 43 75 72  values for BtCur
46a0: 73 6f 72 2e 65 53 74 61 74 65 2e 0a 2a 2a 0a 2a  sor.eState..**.*
46b0: 2a 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 0a  * CURSOR_VALID:.
46c0: 2a 2a 20 20 20 43 75 72 73 6f 72 20 70 6f 69 6e  **   Cursor poin
46d0: 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ts to a valid en
46e0: 74 72 79 2e 20 67 65 74 50 61 79 6c 6f 61 64 28  try. getPayload(
46f0: 29 20 65 74 63 2e 20 6d 61 79 20 62 65 20 63 61  ) etc. may be ca
4700: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53  lled..**.** CURS
4710: 4f 52 5f 49 4e 56 41 4c 49 44 3a 0a 2a 2a 20 20  OR_INVALID:.**  
4720: 20 43 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74   Cursor does not
4730: 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69   point to a vali
4740: 64 20 65 6e 74 72 79 2e 20 54 68 69 73 20 63 61  d entry. This ca
4750: 6e 20 68 61 70 70 65 6e 20 28 66 6f 72 20 65 78  n happen (for ex
4760: 61 6d 70 6c 65 29 20 0a 2a 2a 20 20 20 62 65 63  ample) .**   bec
4770: 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 69  ause the table i
4780: 73 20 65 6d 70 74 79 20 6f 72 20 62 65 63 61 75  s empty or becau
4790: 73 65 20 42 74 72 65 65 43 75 72 73 6f 72 46 69  se BtreeCursorFi
47a0: 72 73 74 28 29 20 68 61 73 20 6e 6f 74 20 62 65  rst() has not be
47b0: 65 6e 0a 2a 2a 20 20 20 63 61 6c 6c 65 64 2e 0a  en.**   called..
47c0: 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51  **.** CURSOR_REQ
47d0: 55 49 52 45 53 45 45 4b 3a 0a 2a 2a 20 20 20 54  UIRESEEK:.**   T
47e0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 74 68  he table that th
47f0: 69 73 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  is cursor was op
4800: 65 6e 65 64 20 6f 6e 20 73 74 69 6c 6c 20 65 78  ened on still ex
4810: 69 73 74 73 2c 20 62 75 74 20 68 61 73 20 62 65  ists, but has be
4820: 65 6e 20 0a 2a 2a 20 20 20 6d 6f 64 69 66 69 65  en .**   modifie
4830: 64 20 73 69 6e 63 65 20 74 68 65 20 63 75 72 73  d since the curs
4840: 6f 72 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  or was last used
4850: 2e 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 73  . The cursor pos
4860: 69 74 69 6f 6e 20 69 73 20 73 61 76 65 64 0a 2a  ition is saved.*
4870: 2a 20 20 20 69 6e 20 76 61 72 69 61 62 6c 65 73  *   in variables
4880: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 20 61   BtCursor.pKey a
4890: 6e 64 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  nd BtCursor.nKey
48a0: 2e 20 57 68 65 6e 20 61 20 63 75 72 73 6f 72 20  . When a cursor 
48b0: 69 73 20 69 6e 20 0a 2a 2a 20 20 20 74 68 69 73  is in .**   this
48c0: 20 73 74 61 74 65 2c 20 72 65 73 74 6f 72 65 4f   state, restoreO
48d0: 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
48e0: 74 69 6f 6e 28 29 20 63 61 6e 20 62 65 20 63 61  tion() can be ca
48f0: 6c 6c 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  lled to attempt 
4900: 74 6f 0a 2a 2a 20 20 20 73 65 65 6b 20 74 68 65  to.**   seek the
4910: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73   cursor to the s
4920: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  aved position..*
4930: 2f 0a 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52  /.#define CURSOR
4940: 5f 49 4e 56 41 4c 49 44 20 20 20 20 20 20 20 20  _INVALID        
4950: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 43 55 52     0.#define CUR
4960: 53 4f 52 5f 56 41 4c 49 44 20 20 20 20 20 20 20  SOR_VALID       
4970: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
4980: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
4990: 45 4b 20 20 20 20 20 20 20 32 0a 0a 2f 2a 0a 2a  EK       2../*.*
49a0: 2a 20 54 68 65 20 54 52 41 43 45 20 6d 61 63 72  * The TRACE macr
49b0: 6f 20 77 69 6c 6c 20 70 72 69 6e 74 20 68 69 67  o will print hig
49c0: 68 2d 6c 65 76 65 6c 20 73 74 61 74 75 73 20 69  h-level status i
49d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
49e0: 20 74 68 65 0a 2a 2a 20 62 74 72 65 65 20 6f 70   the.** btree op
49f0: 65 72 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65  eration when the
4a00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
4a10: 20 73 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74   sqlite3_btree_t
4a20: 72 61 63 65 20 69 73 0a 2a 2a 20 65 6e 61 62 6c  race is.** enabl
4a30: 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ed..*/.#if SQLIT
4a40: 45 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20  E_TEST.# define 
4a50: 54 52 41 43 45 28 58 29 20 20 20 69 66 28 20 73  TRACE(X)   if( s
4a60: 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61  qlite3_btree_tra
4a70: 63 65 20 29 5c 0a 2f 2a 20 20 20 20 20 20 20 20  ce )\./*        
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a90: 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  { sqlite3DebugPr
4aa0: 69 6e 74 66 20 58 3b 20 66 66 6c 75 73 68 28 73  intf X; fflush(s
4ab0: 74 64 6f 75 74 29 3b 20 7d 20 2a 2f 20 5c 0a 7b  tdout); } */ \.{
4ac0: 20 70 72 69 6e 74 66 20 58 3b 20 66 66 6c 75 73   printf X; fflus
4ad0: 68 28 73 74 64 6f 75 74 29 3b 20 7d 0a 69 6e 74  h(stdout); }.int
4ae0: 20 73 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74   sqlite3_btree_t
4af0: 72 61 63 65 3d 30 3b 20 20 2f 2a 20 54 72 75 65  race=0;  /* True
4b00: 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69   to enable traci
4b10: 6e 67 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65  ng */.#else.# de
4b20: 66 69 6e 65 20 54 52 41 43 45 28 58 29 0a 23 65  fine TRACE(X).#e
4b30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  ndif../*.** Forw
4b40: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
4b50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
4b60: 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74 72  eckReadLocks(Btr
4b70: 65 65 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f  ee*,Pgno,BtCurso
4b80: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r*);../*.** Read
4b90: 20 6f 72 20 77 72 69 74 65 20 61 20 74 77 6f 2d   or write a two-
4ba0: 20 61 6e 64 20 66 6f 75 72 2d 62 79 74 65 20 62   and four-byte b
4bb0: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
4bc0: 72 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  r values..*/.sta
4bd0: 74 69 63 20 75 33 32 20 67 65 74 32 62 79 74 65  tic u32 get2byte
4be0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4bf0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 5b  p){.  return (p[
4c00: 30 5d 3c 3c 38 29 20 7c 20 70 5b 31 5d 3b 0a 7d  0]<<8) | p[1];.}
4c10: 0a 73 74 61 74 69 63 20 75 33 32 20 67 65 74 34  .static u32 get4
4c20: 62 79 74 65 28 75 6e 73 69 67 6e 65 64 20 63 68  byte(unsigned ch
4c30: 61 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ar *p){.  return
4c40: 20 28 70 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 70   (p[0]<<24) | (p
4c50: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 70 5b 32 5d  [1]<<16) | (p[2]
4c60: 3c 3c 38 29 20 7c 20 70 5b 33 5d 3b 0a 7d 0a 73  <<8) | p[3];.}.s
4c70: 74 61 74 69 63 20 76 6f 69 64 20 70 75 74 32 62  tatic void put2b
4c80: 79 74 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61  yte(unsigned cha
4c90: 72 20 2a 70 2c 20 75 33 32 20 76 29 7b 0a 20 20  r *p, u32 v){.  
4ca0: 70 5b 30 5d 20 3d 20 76 3e 3e 38 3b 0a 20 20 70  p[0] = v>>8;.  p
4cb0: 5b 31 5d 20 3d 20 76 3b 0a 7d 0a 73 74 61 74 69  [1] = v;.}.stati
4cc0: 63 20 76 6f 69 64 20 70 75 74 34 62 79 74 65 28  c void put4byte(
4cd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
4ce0: 2c 20 75 33 32 20 76 29 7b 0a 20 20 70 5b 30 5d  , u32 v){.  p[0]
4cf0: 20 3d 20 76 3e 3e 32 34 3b 0a 20 20 70 5b 31 5d   = v>>24;.  p[1]
4d00: 20 3d 20 76 3e 3e 31 36 3b 0a 20 20 70 5b 32 5d   = v>>16;.  p[2]
4d10: 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 33 5d 20   = v>>8;.  p[3] 
4d20: 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  = v;.}../*.** Ro
4d30: 75 74 69 6e 65 73 20 74 6f 20 72 65 61 64 20 61  utines to read a
4d40: 6e 64 20 77 72 69 74 65 20 76 61 72 69 61 62 6c  nd write variabl
4d50: 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e-length integer
4d60: 73 2e 20 20 54 68 65 73 65 20 75 73 65 64 20 74  s.  These used t
4d70: 6f 0a 2a 2a 20 62 65 20 64 65 66 69 6e 65 64 20  o.** be defined 
4d80: 6c 6f 63 61 6c 6c 79 2c 20 62 75 74 20 6e 6f 77  locally, but now
4d90: 20 77 65 20 75 73 65 20 74 68 65 20 76 61 72 69   we use the vari
4da0: 6e 74 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  nt routines in t
4db0: 68 65 20 75 74 69 6c 2e 63 0a 2a 2a 20 66 69 6c  he util.c.** fil
4dc0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  e..*/.#define ge
4dd0: 74 56 61 72 69 6e 74 20 20 20 20 73 71 6c 69 74  tVarint    sqlit
4de0: 65 33 47 65 74 56 61 72 69 6e 74 0a 2f 2a 20 23  e3GetVarint./* #
4df0: 64 65 66 69 6e 65 20 67 65 74 56 61 72 69 6e 74  define getVarint
4e00: 33 32 20 20 73 71 6c 69 74 65 33 47 65 74 56 61  32  sqlite3GetVa
4e10: 72 69 6e 74 33 32 20 2a 2f 0a 23 64 65 66 69 6e  rint32 */.#defin
4e20: 65 20 67 65 74 56 61 72 69 6e 74 33 32 28 41 2c  e getVarint32(A,
4e30: 42 29 20 20 28 28 2a 42 3d 2a 28 41 29 29 3c 3d  B)  ((*B=*(A))<=
4e40: 30 78 37 66 3f 31 3a 73 71 6c 69 74 65 33 47 65  0x7f?1:sqlite3Ge
4e50: 74 56 61 72 69 6e 74 33 32 28 41 2c 42 29 29 0a  tVarint32(A,B)).
4e60: 23 64 65 66 69 6e 65 20 70 75 74 56 61 72 69 6e  #define putVarin
4e70: 74 20 20 20 20 73 71 6c 69 74 65 33 50 75 74 56  t    sqlite3PutV
4e80: 61 72 69 6e 74 0a 0a 2f 2a 20 54 68 65 20 64 61  arint../* The da
4e90: 74 61 62 61 73 65 20 70 61 67 65 20 74 68 65 20  tabase page the 
4ea0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6f 63 63  PENDING_BYTE occ
4eb0: 75 70 69 65 73 2e 20 54 68 69 73 20 70 61 67 65  upies. This page
4ec0: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 0a   is never used..
4ed0: 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 6d 61  ** TODO: This ma
4ee0: 63 72 6f 20 69 73 20 76 65 72 79 20 73 69 6d 69  cro is very simi
4ef0: 6c 61 72 79 20 74 6f 20 50 41 47 45 52 5f 4d 4a  lary to PAGER_MJ
4f00: 5f 50 47 4e 4f 28 29 20 69 6e 20 70 61 67 65 72  _PGNO() in pager
4f10: 2e 63 2e 20 54 68 65 79 0a 2a 2a 20 73 68 6f 75  .c. They.** shou
4f20: 6c 64 20 70 6f 73 73 69 62 6c 79 20 62 65 20 63  ld possibly be c
4f30: 6f 6e 73 6f 6c 69 64 61 74 65 64 20 28 70 72 65  onsolidated (pre
4f40: 73 75 6d 61 62 6c 79 20 69 6e 20 70 61 67 65 72  sumably in pager
4f50: 2e 68 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 69  .h)..**.** If di
4f60: 73 6b 20 49 2f 4f 20 69 73 20 6f 6d 69 74 74 65  sk I/O is omitte
4f70: 64 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  d (meaning that 
4f80: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
4f90: 73 74 6f 72 65 64 20 70 75 72 65 6c 79 0a 2a 2a  stored purely.**
4fa0: 20 69 6e 20 6d 65 6d 6f 72 79 29 20 74 68 65 6e   in memory) then
4fb0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 65 6e   there is no pen
4fc0: 64 69 6e 67 20 62 79 74 65 2e 0a 2a 2f 0a 23 69  ding byte..*/.#i
4fd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
4fe0: 5f 44 49 53 4b 49 4f 0a 23 20 64 65 66 69 6e 65  _DISKIO.# define
4ff0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
5000: 47 45 28 70 42 74 29 20 20 30 78 37 66 66 66 66  GE(pBt)  0x7ffff
5010: 66 66 66 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  fff.#else.# defi
5020: 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ne PENDING_BYTE_
5030: 50 41 47 45 28 70 42 74 29 20 28 28 50 45 4e 44  PAGE(pBt) ((PEND
5040: 49 4e 47 5f 42 59 54 45 2f 28 70 42 74 29 2d 3e  ING_BYTE/(pBt)->
5050: 70 61 67 65 53 69 7a 65 29 2b 31 29 0a 23 65 6e  pageSize)+1).#en
5060: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 6e  dif../*.** A lin
5070: 6b 65 64 20 6c 69 73 74 20 6f 66 20 74 68 65 20  ked list of the 
5080: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5090: 75 72 65 73 20 69 73 20 73 74 6f 72 65 64 20 61  ures is stored a
50a0: 74 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b  t BtShared.pLock
50b0: 2e 0a 2a 2a 20 4c 6f 63 6b 73 20 61 72 65 20 61  ..** Locks are a
50c0: 64 64 65 64 20 28 6f 72 20 75 70 67 72 61 64 65  dded (or upgrade
50d0: 64 20 66 72 6f 6d 20 52 45 41 44 5f 4c 4f 43 4b  d from READ_LOCK
50e0: 20 74 6f 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   to WRITE_LOCK) 
50f0: 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 0a 2a  when a cursor .*
5100: 2a 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  * is opened on t
5110: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
5120: 6f 74 20 70 61 67 65 20 42 74 53 68 61 72 65 64  ot page BtShared
5130: 2e 69 54 61 62 6c 65 2e 20 4c 6f 63 6b 73 20 61  .iTable. Locks a
5140: 72 65 20 72 65 6d 6f 76 65 64 0a 2a 2a 20 66 72  re removed.** fr
5150: 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 77 68 65  om this list whe
5160: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
5170: 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  is committed or 
5180: 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 6f 72 20  rolled back, or 
5190: 77 68 65 6e 0a 2a 2a 20 61 20 62 74 72 65 65 20  when.** a btree 
51a0: 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64  handle is closed
51b0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42 74 4c 6f  ..*/.struct BtLo
51c0: 63 6b 20 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ck {.  Btree *pB
51d0: 74 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  tree;        /* 
51e0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 68 6f 6c  Btree handle hol
51f0: 64 69 6e 67 20 74 68 69 73 20 6c 6f 63 6b 20 2a  ding this lock *
5200: 2f 0a 20 20 50 67 6e 6f 20 69 54 61 62 6c 65 3b  /.  Pgno iTable;
5210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
5220: 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
5230: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
5240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45             /* RE
5250: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
5260: 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 42 74 4c 6f 63  _LOCK */.  BtLoc
5270: 6b 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  k *pNext;       
5280: 20 2f 2a 20 4e 65 78 74 20 69 6e 20 42 74 53 68   /* Next in BtSh
5290: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 20  ared.pLock list 
52a0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 43 61 6e 64 69 64  */.};../* Candid
52b0: 61 74 65 20 76 61 6c 75 65 73 20 66 6f 72 20 42  ate values for B
52c0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 2a 2f 0a 23  tLock.eLock */.#
52d0: 64 65 66 69 6e 65 20 52 45 41 44 5f 4c 4f 43 4b  define READ_LOCK
52e0: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57       1.#define W
52f0: 52 49 54 45 5f 4c 4f 43 4b 20 20 20 20 32 0a 0a  RITE_LOCK    2..
5300: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
5310: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
5320: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75    /*.  ** The fu
5330: 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 54 61 62  nctions queryTab
5340: 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54 61  leLock(), lockTa
5350: 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63 6b  ble() and unlock
5360: 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a 2a  AllTables().  **
5370: 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74 72   manipulate entr
5380: 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68 61  ies in the BtSha
5390: 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64  red.pLock linked
53a0: 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73 74   list used to st
53b0: 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ore.  ** shared-
53c0: 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76 65  cache table leve
53d0: 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65 20  l locks. If the 
53e0: 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 69  library is compi
53f0: 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  led with the.  *
5400: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66  * shared-cache f
5410: 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64 2c  eature disabled,
5420: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6f   then there is o
5430: 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73 65  nly ever one use
5440: 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 42  r.  ** of each B
5450: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
5460: 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c 6f  e and so this lo
5470: 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63  cking is not nec
5480: 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53 6f  essary. .  ** So
5490: 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63 6b   define the lock
54a0: 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f   related functio
54b0: 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ns as no-ops..  
54c0: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75 65  */.  #define que
54d0: 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  ryTableLock(a,b,
54e0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
54f0: 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c 65  define lockTable
5500: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
5510: 4b 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 6c 6f  K.  #define unlo
5520: 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a 23  ckAllTables(a).#
5530: 65 6c 73 65 0a 0a 0a 2f 2a 0a 2a 2a 20 51 75 65  else.../*.** Que
5540: 72 79 20 74 6f 20 73 65 65 20 69 66 20 62 74 72  ry to see if btr
5550: 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79 20  ee handle p may 
5560: 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
5570: 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20   type eLock .** 
5580: 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52  (READ_LOCK or WR
5590: 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65  ITE_LOCK) on the
55a0: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
55b0: 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65 74 75  -page iTab. Retu
55c0: 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  rn.** SQLITE_OK 
55d0: 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20  if the lock may 
55e0: 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79 20  be obtained (by 
55f0: 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61 62 6c  calling lockTabl
5600: 65 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49  e()), or.** SQLI
5610: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
5620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5630: 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 42  queryTableLock(B
5640: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
5650: 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20  ab, u8 eLock){. 
5660: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
5670: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
5680: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 2f 2a 20  k *pIter;..  /* 
5690: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
56a0: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
56b0: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
56c0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  ed */.  if( 0==s
56d0: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
56e0: 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53  ReadOnly()->useS
56f0: 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20 20 20  haredData ){.   
5700: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5710: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  K;.  }..  /* Thi
5720: 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f  s (along with lo
5730: 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20 77 68  ckTable()) is wh
5740: 65 72 65 20 74 68 65 20 52 65 61 64 55 6e 63 6f  ere the ReadUnco
5750: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 0a  mmitted flag is.
5760: 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 2e    ** dealt with.
5770: 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
5780: 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61  s querying for a
5790: 20 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74   read-lock and t
57a0: 68 65 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20  he flag is.  ** 
57b0: 73 65 74 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e  set, it is uncon
57c0: 64 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74  ditionally grant
57d0: 65 64 20 2d 20 65 76 65 6e 20 69 66 20 74 68 65  ed - even if the
57e0: 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63  re are write-loc
57f0: 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74  ks.  ** on the t
5800: 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65  able. If a write
5810: 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74  -lock is request
5820: 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f  ed, the ReadUnco
5830: 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a  mmitted flag.  *
5840: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
5850: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  red..  **.  ** I
5860: 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54  n function lockT
5870: 61 62 6c 65 28 29 2c 20 69 66 20 61 20 72 65 61  able(), if a rea
5880: 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64  d-lock is demand
5890: 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a  ed and the .  **
58a0: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
58b0: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6e 6f   flag is set, no
58c0: 20 65 6e 74 72 79 20 69 73 20 61 64 64 65 64 20   entry is added 
58d0: 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73  to the locks lis
58e0: 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61 72 65  t .  ** (BtShare
58f0: 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20  d.pLock)..  **. 
5900: 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65   ** To summarize
5910: 3a 20 49 66 20 74 68 65 20 52 65 61 64 55 6e 63  : If the ReadUnc
5920: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
5930: 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61 64 20   set, then read 
5940: 63 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20  cursors do.  ** 
5950: 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72 65  not create or re
5960: 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b  spect table lock
5970: 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70  s. The locking p
5980: 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61 20 0a  rocedure for a .
5990: 20 20 2a 2a 20 77 72 69 74 65 2d 63 75 72 73 6f    ** write-curso
59a0: 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67  r does not chang
59b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  e..  */.  if( . 
59c0: 20 20 20 21 70 2d 3e 70 53 71 6c 69 74 65 20 7c     !p->pSqlite |
59d0: 7c 20 0a 20 20 20 20 30 3d 3d 28 70 2d 3e 70 53  | .    0==(p->pS
59e0: 71 6c 69 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c  qlite->flags&SQL
59f0: 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
5a00: 74 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f  ted) || .    eLo
5a10: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c  ck==WRITE_LOCK |
5a20: 7c 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53 54  |.    iTab==MAST
5a30: 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20  ER_ROOT.  ){.   
5a40: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
5a50: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
5a60: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
5a70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
5a80: 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26  er->pBtree!=p &&
5a90: 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d   pIter->iTable==
5aa0: 69 54 61 62 20 26 26 20 0a 20 20 20 20 20 20 20  iTab && .       
5ab0: 20 20 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b     (pIter->eLock
5ac0: 21 3d 65 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b  !=eLock || eLock
5ad0: 21 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a  !=READ_LOCK) ){.
5ae0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
5af0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
5b00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5b10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5b20: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  OK;.}../*.** Add
5b30: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
5b40: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
5b50: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
5b60: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
5b70: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
5b80: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
5b90: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
5ba0: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
5bb0: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
5bc0: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  LOCK..**.** SQLI
5bd0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
5be0: 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  d if the lock is
5bf0: 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
5c00: 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53 59  lly. SQLITE_BUSY
5c10: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   and.** SQLITE_N
5c20: 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65  OMEM may also be
5c30: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
5c40: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62  atic int lockTab
5c50: 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  le(Btree *p, Pgn
5c60: 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f  o iTable, u8 eLo
5c70: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
5c80: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
5c90: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d   BtLock *pLock =
5ca0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49   0;.  BtLock *pI
5cb0: 74 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  ter;..  /* This 
5cc0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
5cd0: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
5ce0: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
5cf0: 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
5d00: 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
5d10: 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64  nly()->useShared
5d20: 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65 74 75  Data ){.    retu
5d30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
5d40: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  }..  assert( SQL
5d50: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61 62  ITE_OK==queryTab
5d60: 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
5d70: 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f  , eLock) );..  /
5d80: 2a 20 49 66 20 74 68 65 20 72 65 61 64 2d 75 6e  * If the read-un
5d90: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
5da0: 73 20 73 65 74 20 61 6e 64 20 61 20 72 65 61 64  s set and a read
5db0: 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74  -lock is request
5dc0: 65 64 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  ed,.  ** return 
5dd0: 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 61 64  early without ad
5de0: 64 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74 6f  ding an entry to
5df0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
5e00: 6f 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20 20  ock list. See.  
5e10: 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75  ** comment in fu
5e20: 6e 63 74 69 6f 6e 20 71 75 65 72 79 54 61 62 6c  nction queryTabl
5e30: 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65  eLock() for more
5e40: 20 69 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e   info on handlin
5e50: 67 20 0a 20 20 2a 2a 20 74 68 65 20 52 65 61 64  g .  ** the Read
5e60: 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  Uncommitted flag
5e70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20  ..  */.  if( .  
5e80: 20 20 28 70 2d 3e 70 53 71 6c 69 74 65 29 20 26    (p->pSqlite) &
5e90: 26 20 0a 20 20 20 20 28 70 2d 3e 70 53 71 6c 69  & .    (p->pSqli
5ea0: 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  te->flags&SQLITE
5eb0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
5ec0: 29 20 26 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b  ) && .    (eLock
5ed0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a  ==READ_LOCK) &&.
5ee0: 20 20 20 20 69 54 61 62 6c 65 21 3d 4d 41 53 54      iTable!=MAST
5ef0: 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20  ER_ROOT.  ){.   
5f00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5f10: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72  K;.  }..  /* Fir
5f20: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
5f30: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
5f40: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
5f50: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
5f60: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
5f70: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
5f80: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
5f90: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
5fa0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
5fb0: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
5fc0: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
5fd0: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
5fe0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
5ff0: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
6000: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
6010: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
6020: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
6030: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
6040: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
6050: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
6060: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
6070: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
6080: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
6090: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
60a0: 63 6b 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ck *)sqliteMallo
60b0: 63 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29  c(sizeof(BtLock)
60c0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f 63  );.    if( !pLoc
60d0: 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  k ){.      retur
60e0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
60f0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d      }.    pLock-
6100: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  >iTable = iTable
6110: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74  ;.    pLock->pBt
6120: 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f  ree = p;.    pLo
6130: 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ck->pNext = pBt-
6140: 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  >pLock;.    pBt-
6150: 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a  >pLock = pLock;.
6160: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
6170: 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76  e BtLock.eLock v
6180: 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6d  ariable to the m
6190: 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63 75  aximum of the cu
61a0: 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20  rrent lock.  ** 
61b0: 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
61c0: 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61  d lock. This mea
61d0: 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c 6f  ns if a write-lo
61e0: 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20 68  ck was already h
61f0: 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  eld.  ** and a r
6200: 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74  ead-lock request
6210: 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e 63  ed, we don't inc
6220: 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72 61  orrectly downgra
6230: 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a  de the lock..  *
6240: 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49 54  /.  assert( WRIT
6250: 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b  E_LOCK>READ_LOCK
6260: 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e   );.  if( eLock>
6270: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a  pLock->eLock ){.
6280: 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b      pLock->eLock
6290: 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = eLock;.  }.. 
62a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
62b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  K;.}../*.** Rele
62c0: 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62 6c  ase all the tabl
62d0: 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f  e locks (locks o
62e0: 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c 6c  btained via call
62f0: 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61 62  s to the lockTab
6300: 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75 72  le().** procedur
6310: 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  e) held by Btree
6320: 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74   handle p..*/.st
6330: 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
6340: 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65 65 20  AllTables(Btree 
6350: 2a 70 29 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  *p){.  BtLock **
6360: 70 70 49 74 65 72 20 3d 20 26 70 2d 3e 70 42 74  ppIter = &p->pBt
6370: 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49  ->pLock;..  /* I
6380: 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  f the shared-cac
6390: 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20  he extension is 
63a0: 6e 6f 74 20 65 6e 61 62 6c 65 64 2c 20 74 68 65  not enabled, the
63b0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 0a  re should be no.
63c0: 20 20 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 74 68    ** locks in th
63d0: 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b  e BtShared.pLock
63e0: 20 6c 69 73 74 2c 20 6d 61 6b 69 6e 67 20 74 68   list, making th
63f0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 61 20 6e  is procedure a n
6400: 6f 2d 6f 70 2e 20 41 73 73 65 72 74 0a 20 20 2a  o-op. Assert.  *
6410: 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20 74  * that this is t
6420: 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  he case..  */.  
6430: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 54  assert( sqlite3T
6440: 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c  hreadDataReadOnl
6450: 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61  y()->useSharedDa
6460: 74 61 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  ta || 0==*ppIter
6470: 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70   );..  while( *p
6480: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c  pIter ){.    BtL
6490: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70  ock *pLock = *pp
64a0: 49 74 65 72 3b 0a 20 20 20 20 69 66 28 20 70 4c  Iter;.    if( pL
64b0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
64c0: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
64d0: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
64e0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
64f0: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c  (pLock);.    }el
6500: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
6510: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
6520: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
6530: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6540: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
6550: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
6560: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
6570: 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f  Page *pPage);  /
6580: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
6590: 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61  nce */../*.** Sa
65a0: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ve the current c
65b0: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69  ursor position i
65c0: 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20  n the variables 
65d0: 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a  BtCursor.nKey .*
65e0: 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70  * and BtCursor.p
65f0: 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27  Key. The cursor'
6600: 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  s state is set t
6610: 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  o CURSOR_REQUIRE
6620: 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  SEEK..*/.static 
6630: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
6640: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
6650: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
6660: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
6670: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
6680: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
6690: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
66a0: 65 79 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  ey );..  rc = sq
66b0: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
66c0: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
66d0: 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Key);..  /* If t
66e0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
66f0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
6700: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
6710: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
6720: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
6730: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
6740: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
6750: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
6760: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
6770: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
6780: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
6790: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
67a0: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
67b0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
67c0: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
67d0: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
67e0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
67f0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
6800: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
6810: 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43  LITE_OK && 0==pC
6820: 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
6830: 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b  y){.    void *pK
6840: 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ey = sqliteMallo
6850: 63 28 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20  c(pCur->nKey);. 
6860: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
6870: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6880: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
6890: 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70  0, pCur->nKey, p
68a0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
68b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
68c0: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
68d0: 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Key = pKey;.    
68e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
68f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79   sqliteFree(pKey
6900: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6910: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
6920: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6930: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
6940: 74 28 20 21 70 43 75 72 2d 3e 70 50 61 67 65 2d  t( !pCur->pPage-
6950: 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72  >intKey || !pCur
6960: 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28  ->pKey );..  if(
6970: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6980: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
6990: 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
69a0: 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
69b0: 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  = 0;.    pCur->e
69c0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
69d0: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
69e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
69f0: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
6a00: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
6a10: 20 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20   cursors except 
6a20: 70 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20  pExcept open on 
6a30: 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69  the table .** wi
6a40: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f  th root-page iRo
6a50: 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69  ot. Usually, thi
6a60: 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  s is called just
6a70: 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a   before cursor.*
6a80: 2a 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65  * pExcept is use
6a90: 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  d to modify the 
6aa0: 74 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65  table (BtreeDele
6ab0: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
6ac0: 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69  ert())..*/.stati
6ad0: 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72  c int saveAllCur
6ae0: 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
6af0: 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  Bt, Pgno iRoot, 
6b00: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
6b10: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
6b20: 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  p;.  for(p=pBt->
6b30: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
6b40: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
6b50: 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28   p!=pExcept && (
6b60: 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70  0==iRoot || p->p
6b70: 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20  gnoRoot==iRoot) 
6b80: 26 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  && .        p->e
6b90: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6ba0: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  LID ){.      int
6bb0: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
6bc0: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
6bd0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6be0: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6bf0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
6c00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
6c10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
6c30: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
6c40: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
6c50: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
6c60: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
6c70: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
6c80: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6c90: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
6ca0: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
6cb0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
6cc0: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
6cd0: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
6ce0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6cf0: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
6d00: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
6d10: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
6d20: 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
6d30: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
6d40: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
6d50: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6d60: 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ion()..**.** If 
6d70: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
6d80: 65 6e 74 20 61 72 67 75 6d 65 6e 74 20 2d 20 64  ent argument - d
6d90: 6f 53 65 65 6b 20 2d 20 69 73 20 66 61 6c 73 65  oSeek - is false
6da0: 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20 6f  , then instead o
6db0: 66 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20  f .** returning 
6dc0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
6dd0: 27 73 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  's saved positio
6de0: 6e 2c 20 61 6e 79 20 73 61 76 65 64 20 70 6f 73  n, any saved pos
6df0: 69 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64  ition is deleted
6e00: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 75 72 73  .** and the curs
6e10: 6f 72 20 73 74 61 74 65 20 73 65 74 20 74 6f 20  or state set to 
6e20: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a  CURSOR_INVALID..
6e30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
6e40: 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
6e50: 6f 72 50 6f 73 69 74 69 6f 6e 58 28 42 74 43 75  orPositionX(BtCu
6e60: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
6e70: 64 6f 53 65 65 6b 29 7b 0a 20 20 69 6e 74 20 72  doSeek){.  int r
6e80: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6e90: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6ea0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45  State==CURSOR_RE
6eb0: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 70  QUIRESEEK );.  p
6ec0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6ed0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
6ee0: 69 66 28 20 64 6f 53 65 65 6b 20 29 7b 0a 20 20  if( doSeek ){.  
6ef0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
6f00: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
6f10: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
6f20: 2d 3e 6e 4b 65 79 2c 20 26 70 43 75 72 2d 3e 73  ->nKey, &pCur->s
6f30: 6b 69 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  kip);.  }.  if( 
6f40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6f50: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
6f60: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
6f70: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6f80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 55 52  .    assert( CUR
6f90: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
6fa0: 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f  >eState || CURSO
6fb0: 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
6fc0: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 7d 0a 20  >eState );.  }. 
6fd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
6fe0: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 4f 72  define restoreOr
6ff0: 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
7000: 69 6f 6e 28 70 2c 78 29 20 5c 0a 20 20 28 70 2d  ion(p,x) \.  (p-
7010: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
7020: 52 45 51 55 49 52 45 53 45 45 4b 3f 72 65 73 74  REQUIRESEEK?rest
7030: 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
7040: 50 6f 73 69 74 69 6f 6e 58 28 70 2c 78 29 3a 53  PositionX(p,x):S
7050: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64  QLITE_OK)..#ifnd
7060: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
7070: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
7080: 54 68 65 73 65 20 6d 61 63 72 6f 73 20 64 65 66  These macros def
7090: 69 6e 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ine the location
70a0: 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
70b0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 61 20  map entry for a 
70c0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67  .** database pag
70d0: 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  e. The first arg
70e0: 75 6d 65 6e 74 20 74 6f 20 65 61 63 68 20 69 73  ument to each is
70f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
7100: 73 61 62 6c 65 0a 2a 2a 20 62 79 74 65 73 20 6f  sable.** bytes o
7110: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 74  n each page of t
7120: 68 65 20 64 61 74 61 62 61 73 65 20 28 6f 66 74  he database (oft
7130: 65 6e 20 31 30 32 34 29 2e 20 54 68 65 20 73 65  en 1024). The se
7140: 63 6f 6e 64 20 69 73 20 74 68 65 0a 2a 2a 20 70  cond is the.** p
7150: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f  age number to lo
7160: 6f 6b 20 75 70 20 69 6e 20 74 68 65 20 70 6f 69  ok up in the poi
7170: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
7180: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20 72 65  PTRMAP_PAGENO re
7190: 74 75 72 6e 73 20 74 68 65 20 64 61 74 61 62 61  turns the databa
71a0: 73 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  se page number o
71b0: 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  f the pointer-ma
71c0: 70 0a 2a 2a 20 70 61 67 65 20 74 68 61 74 20 73  p.** page that s
71d0: 74 6f 72 65 73 20 74 68 65 20 72 65 71 75 69 72  tores the requir
71e0: 65 64 20 70 6f 69 6e 74 65 72 2e 20 50 54 52 4d  ed pointer. PTRM
71f0: 41 50 5f 50 54 52 4f 46 46 53 45 54 20 72 65 74  AP_PTROFFSET ret
7200: 75 72 6e 73 0a 2a 2a 20 74 68 65 20 6f 66 66 73  urns.** the offs
7210: 65 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  et of the reques
7220: 74 65 64 20 6d 61 70 20 65 6e 74 72 79 2e 0a 2a  ted map entry..*
7230: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 67 6e 6f  *.** If the pgno
7240: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
7250: 20 74 6f 20 50 54 52 4d 41 50 5f 50 41 47 45 4e   to PTRMAP_PAGEN
7260: 4f 20 69 73 20 61 20 70 6f 69 6e 74 65 72 2d 6d  O is a pointer-m
7270: 61 70 20 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e  ap page,.** then
7280: 20 70 67 6e 6f 20 69 73 20 72 65 74 75 72 6e 65   pgno is returne
7290: 64 2e 20 53 6f 20 28 70 67 6e 6f 3d 3d 50 54 52  d. So (pgno==PTR
72a0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 67 73 7a 2c  MAP_PAGENO(pgsz,
72b0: 20 70 67 6e 6f 29 29 20 63 61 6e 20 62 65 0a 2a   pgno)) can be.*
72c0: 2a 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 69  * used to test i
72d0: 66 20 70 67 6e 6f 20 69 73 20 61 20 70 6f 69 6e  f pgno is a poin
72e0: 74 65 72 2d 6d 61 70 20 70 61 67 65 2e 20 50 54  ter-map page. PT
72f0: 52 4d 41 50 5f 49 53 50 41 47 45 20 69 6d 70 6c  RMAP_ISPAGE impl
7300: 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 69 73 20 74  ements.** this t
7310: 65 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  est..*/.#define 
7320: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
7330: 74 2c 20 70 67 6e 6f 29 20 70 74 72 6d 61 70 50  t, pgno) ptrmapP
7340: 61 67 65 6e 6f 28 70 42 74 2c 20 70 67 6e 6f 29  ageno(pBt, pgno)
7350: 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f  .#define PTRMAP_
7360: 50 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20 70  PTROFFSET(pBt, p
7370: 67 6e 6f 29 20 28 35 2a 28 70 67 6e 6f 2d 70 74  gno) (5*(pgno-pt
7380: 72 6d 61 70 50 61 67 65 6e 6f 28 70 42 74 2c 20  rmapPageno(pBt, 
7390: 70 67 6e 6f 29 2d 31 29 29 0a 23 64 65 66 69 6e  pgno)-1)).#defin
73a0: 65 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  e PTRMAP_ISPAGE(
73b0: 70 42 74 2c 20 70 67 6e 6f 29 20 28 50 54 52 4d  pBt, pgno) (PTRM
73c0: 41 50 5f 50 41 47 45 4e 4f 28 28 70 42 74 29 2c  AP_PAGENO((pBt),
73d0: 28 70 67 6e 6f 29 29 3d 3d 28 70 67 6e 6f 29 29  (pgno))==(pgno))
73e0: 0a 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74  ..static Pgno pt
73f0: 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61  rmapPageno(BtSha
7400: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
7410: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  gno){.  int nPag
7420: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
7430: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
7440: 35 29 2b 31 3b 0a 20 20 69 6e 74 20 69 50 74 72  5)+1;.  int iPtr
7450: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
7460: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
7470: 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 28 69 50  .  int ret = (iP
7480: 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d  trMap*nPagesPerM
7490: 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20  apPage) + 2; .  
74a0: 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47  if( ret==PENDING
74b0: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
74c0: 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20  ){.    ret++;.  
74d0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
74e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  }../*.** The poi
74f0: 6e 74 65 72 20 6d 61 70 20 69 73 20 61 20 6c 6f  nter map is a lo
7500: 6f 6b 75 70 20 74 61 62 6c 65 20 74 68 61 74 20  okup table that 
7510: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70  identifies the p
7520: 61 72 65 6e 74 20 70 61 67 65 20 66 6f 72 0a 2a  arent page for.*
7530: 2a 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67  * each child pag
7540: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
7550: 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 61 72  e file.  The par
7560: 65 6e 74 20 70 61 67 65 20 69 73 20 74 68 65 20  ent page is the 
7570: 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 63 6f 6e  page that.** con
7580: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
7590: 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 45  to the child.  E
75a0: 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
75b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
75c0: 6e 73 0a 2a 2a 20 30 20 6f 72 20 31 20 70 61 72  ns.** 0 or 1 par
75d0: 65 6e 74 20 70 61 67 65 73 2e 20 20 28 49 6e 20  ent pages.  (In 
75e0: 74 68 69 73 20 63 6f 6e 74 65 78 74 20 27 64 61  this context 'da
75f0: 74 61 62 61 73 65 20 70 61 67 65 27 20 72 65 66  tabase page' ref
7600: 65 72 73 0a 2a 2a 20 74 6f 20 61 6e 79 20 70 61  ers.** to any pa
7610: 67 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70  ge that is not p
7620: 61 72 74 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  art of the point
7630: 65 72 20 6d 61 70 20 69 74 73 65 6c 66 2e 29 20  er map itself.) 
7640: 20 45 61 63 68 20 70 6f 69 6e 74 65 72 20 6d 61   Each pointer ma
7650: 70 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 6e 73 69  p.** entry consi
7660: 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
7670: 62 79 74 65 20 27 74 79 70 65 27 20 61 6e 64 20  byte 'type' and 
7680: 61 20 34 20 62 79 74 65 20 70 61 72 65 6e 74 20  a 4 byte parent 
7690: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
76a0: 54 68 65 20 50 54 52 4d 41 50 5f 58 58 58 20 69  The PTRMAP_XXX i
76b0: 64 65 6e 74 69 66 69 65 72 73 20 62 65 6c 6f 77  dentifiers below
76c0: 20 61 72 65 20 74 68 65 20 76 61 6c 69 64 20 74   are the valid t
76d0: 79 70 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ypes..**.** The 
76e0: 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 70  purpose of the p
76f0: 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 74 6f  ointer map is to
7700: 20 66 61 63 69 6c 69 74 79 20 6d 6f 76 69 6e 67   facility moving
7710: 20 70 61 67 65 73 20 66 72 6f 6d 20 6f 6e 65 0a   pages from one.
7720: 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  ** position in t
7730: 68 65 20 66 69 6c 65 20 74 6f 20 61 6e 6f 74 68  he file to anoth
7740: 65 72 20 61 73 20 70 61 72 74 20 6f 66 20 61 75  er as part of au
7750: 74 6f 76 61 63 75 75 6d 2e 20 20 57 68 65 6e 20  tovacuum.  When 
7760: 61 20 70 61 67 65 0a 2a 2a 20 69 73 20 6d 6f 76  a page.** is mov
7770: 65 64 2c 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ed, the pointer 
7780: 69 6e 20 69 74 73 20 70 61 72 65 6e 74 20 6d 75  in its parent mu
7790: 73 74 20 62 65 20 75 70 64 61 74 65 64 20 74 6f  st be updated to
77a0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
77b0: 20 6e 65 77 20 6c 6f 63 61 74 69 6f 6e 2e 20 20   new location.  
77c0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
77d0: 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74  is used to locat
77e0: 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
77f0: 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 0a 2a 2a  e quickly..**.**
7800: 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
7810: 3a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70  : The database p
7820: 61 67 65 20 69 73 20 61 20 72 6f 6f 74 2d 70 61  age is a root-pa
7830: 67 65 2e 20 54 68 65 20 70 61 67 65 2d 6e 75 6d  ge. The page-num
7840: 62 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ber is not.**   
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
7860: 73 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  sed in this case
7870: 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 46  ..**.** PTRMAP_F
7880: 52 45 45 50 41 47 45 3a 20 54 68 65 20 64 61 74  REEPAGE: The dat
7890: 61 62 61 73 65 20 70 61 67 65 20 69 73 20 61 6e  abase page is an
78a0: 20 75 6e 75 73 65 64 20 28 66 72 65 65 29 20 70   unused (free) p
78b0: 61 67 65 2e 20 54 68 65 20 70 61 67 65 2d 6e 75  age. The page-nu
78c0: 6d 62 65 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  mber .**        
78d0: 20 20 20 20 20 20 20 20 20 20 69 73 20 6e 6f 74            is not
78e0: 20 75 73 65 64 20 69 6e 20 74 68 69 73 20 63 61   used in this ca
78f0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  se..**.** PTRMAP
7900: 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 54 68 65 20  _OVERFLOW1: The 
7910: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73  database page is
7920: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
7930: 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a  in a list of .**
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
7960: 73 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  s. The page numb
7970: 65 72 20 69 64 65 6e 74 69 66 69 65 73 20 74 68  er identifies th
7980: 65 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 20  e page that.**  
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
79b0: 6c 6c 20 77 69 74 68 20 61 20 70 6f 69 6e 74 65  ll with a pointe
79c0: 72 20 74 6f 20 74 68 69 73 20 6f 76 65 72 66 6c  r to this overfl
79d0: 6f 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  ow page..**.** P
79e0: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
79f0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70 61   The database pa
7a00: 67 65 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  ge is the second
7a10: 20 6f 72 20 6c 61 74 65 72 20 70 61 67 65 20 69   or later page i
7a20: 6e 20 61 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20  n a list of.**  
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a40: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
7a50: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
7a60: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
7a70: 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20  previous.**     
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
7a90: 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
7aa0: 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a  ow page list..**
7ab0: 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
7ac0: 3a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70  : The database p
7ad0: 61 67 65 20 69 73 20 61 20 6e 6f 6e 2d 72 6f 6f  age is a non-roo
7ae0: 74 20 62 74 72 65 65 20 70 61 67 65 2e 20 54 68  t btree page. Th
7af0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a  e page number.**
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
7b10: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 61  dentifies the pa
7b20: 72 65 6e 74 20 70 61 67 65 20 69 6e 20 74 68 65  rent page in the
7b30: 20 62 74 72 65 65 2e 0a 2a 2f 0a 23 64 65 66 69   btree..*/.#defi
7b40: 6e 65 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  ne PTRMAP_ROOTPA
7b50: 47 45 20 31 0a 23 64 65 66 69 6e 65 20 50 54 52  GE 1.#define PTR
7b60: 4d 41 50 5f 46 52 45 45 50 41 47 45 20 32 0a 23  MAP_FREEPAGE 2.#
7b70: 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 4f 56  define PTRMAP_OV
7b80: 45 52 46 4c 4f 57 31 20 33 0a 23 64 65 66 69 6e  ERFLOW1 3.#defin
7b90: 65 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  e PTRMAP_OVERFLO
7ba0: 57 32 20 34 0a 23 64 65 66 69 6e 65 20 50 54 52  W2 4.#define PTR
7bb0: 4d 41 50 5f 42 54 52 45 45 20 35 0a 0a 2f 2a 0a  MAP_BTREE 5../*.
7bc0: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
7bd0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
7be0: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
7bf0: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
7c00: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
7c10: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
7c20: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
7c30: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
7c40: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
7c50: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
7c60: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
7c70: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
7c80: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
7c90: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
7ca0: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
7cb0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
7cc0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
7cd0: 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Put(BtShared *pB
7ce0: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
7cf0: 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65  eType, Pgno pare
7d00: 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  nt){.  DbPage *p
7d10: 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20  DbPage;  /* The 
7d20: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7d30: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
7d40: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  p;      /* The p
7d50: 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20  ointer map data 
7d60: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  */.  Pgno iPtrma
7d70: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  p;     /* The po
7d80: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e  inter map page n
7d90: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  umber */.  int o
7da0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
7db0: 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65  Offset in pointe
7dc0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
7dd0: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
7de0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
7df0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
7e00: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
7e10: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
7e20: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
7e30: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
7e40: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
7e50: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
7e60: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
7e70: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
7e80: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
7e90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7ea0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7eb0: 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20  ;.  }.  iPtrmap 
7ec0: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
7ed0: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
7ee0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
7ef0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
7f00: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
7f10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7f20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
7f30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f  turn rc;.  }.  o
7f40: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
7f50: 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65  TROFFSET(pBt, ke
7f60: 79 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20  y);.  pPtrmap = 
7f70: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
7f80: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
7f90: 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  e);..  if( eType
7fa0: 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  !=pPtrmap[offset
7fb0: 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70  ] || get4byte(&p
7fc0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
7fd0: 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20  )!=parent ){.   
7fe0: 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f   TRACE(("PTRMAP_
7ff0: 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c  UPDATE: %d->(%d,
8000: 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79  %d)\n", key, eTy
8010: 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20  pe, parent));.  
8020: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
8030: 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
8040: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
8050: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8060: 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74    pPtrmap[offset
8070: 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20  ] = eType;.     
8080: 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d   put4byte(&pPtrm
8090: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61  ap[offset+1], pa
80a0: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
80b0: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
80c0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
80d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
80e0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
80f0: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
8100: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
8110: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
8120: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
8130: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
8140: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
8150: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
8160: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
8170: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
8180: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
8190: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
81a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
81b0: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
81c0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
81d0: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
81e0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
81f0: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
8200: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
8210: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
8220: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
8230: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
8240: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
8250: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
8260: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
8270: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
8280: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
8290: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
82a0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
82b0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
82c0: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
82d0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
82e0: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
82f0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
8300: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 50 74 72   int rc;..  iPtr
8310: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
8320: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
8330: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
8340: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
8350: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
8360: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
8370: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
8380: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
8390: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
83a0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
83b0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
83c0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
83d0: 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b  FFSET(pBt, key);
83e0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
83f0: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
8400: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
8410: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
8420: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
8430: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
8440: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
8450: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
8460: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
8470: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
8480: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
8490: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
84a0: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
84b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
84c0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
84d0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a  _AUTOVACUUM */..
84e0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
84f0: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
8500: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
8510: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
8520: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
8530: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
8540: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
8550: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
8560: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8570: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8580: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8590: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
85a0: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
85b0: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
85c0: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
85d0: 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64  .static u8 *find
85e0: 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
85f0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
8600: 0a 20 20 75 38 20 2a 64 61 74 61 20 3d 20 70 50  .  u8 *data = pP
8610: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73  age->aData;.  as
8620: 73 65 72 74 28 20 69 43 65 6c 6c 3e 3d 30 20 29  sert( iCell>=0 )
8630: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 65 6c  ;.  assert( iCel
8640: 6c 3c 67 65 74 32 62 79 74 65 28 26 64 61 74 61  l<get2byte(&data
8650: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
8660: 74 2b 33 5d 29 20 29 3b 0a 20 20 72 65 74 75 72  t+3]) );.  retur
8670: 6e 20 64 61 74 61 20 2b 20 67 65 74 32 62 79 74  n data + get2byt
8680: 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  e(&data[pPage->c
8690: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 69 43 65 6c  ellOffset+2*iCel
86a0: 6c 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  l]);.}../*.** Th
86b0: 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  is a more comple
86c0: 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e  x version of fin
86d0: 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72  dCell() that wor
86e0: 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20  ks for.** pages 
86f0: 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20  that do contain 
8700: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20  overflow cells. 
8710: 20 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73   See insert.*/.s
8720: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
8730: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
8740: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
8750: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
8760: 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e    for(i=pPage->n
8770: 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30  Overflow-1; i>=0
8780: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
8790: 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f  k;.    struct _O
87a0: 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a  vflCell *pOvfl;.
87b0: 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61      pOvfl = &pPa
87c0: 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20  ge->aOvfl[i];.  
87d0: 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78    k = pOvfl->idx
87e0: 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65  ;.    if( k<=iCe
87f0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
8800: 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k==iCell ){.    
8810: 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c      return pOvfl
8820: 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d  ->pCell;.      }
8830: 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a  .      iCell--;.
8840: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8850: 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  rn findCell(pPag
8860: 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  e, iCell);.}../*
8870: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
8880: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
8890: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
88a0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
88b0: 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65  e.  There.** are
88c0: 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
88d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
88e0: 20 70 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b   parseCell() tak
88f0: 65 73 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 0a  es a cell index.
8900: 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
8910: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 70 61   argument and pa
8920: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 61 6b  rseCellPtr() tak
8930: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
8940: 74 68 65 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 74  the.** body of t
8950: 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73  he cell as its s
8960: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
8970: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8980: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
8990: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
89a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
89b0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
89c0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
89d0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
89e0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
89f0: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
8a00: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
8a10: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
8a20: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
8a30: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ure */.){.  int 
8a40: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
8a50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79      /* Number by
8a60: 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74  tes in cell cont
8a70: 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ent header */.  
8a80: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
8a90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8aa0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
8ab0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
8ac0: 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20   pInfo->pCell = 
8ad0: 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pCell;.  assert(
8ae0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
8af0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
8b00: 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65  1 );.  n = pPage
8b10: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
8b20: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34    assert( n==4-4
8b30: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
8b40: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
8b50: 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Data ){.    n +=
8b60: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43   getVarint32(&pC
8b70: 65 6c 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61  ell[n], &nPayloa
8b80: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
8b90: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
8ba0: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74   }.  pInfo->nDat
8bb0: 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  a = nPayload;.  
8bc0: 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
8bd0: 79 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  y ){.    n += ge
8be0: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
8bf0: 5d 2c 20 28 75 36 34 20 2a 29 26 70 49 6e 66 6f  ], (u64 *)&pInfo
8c00: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  ->nKey);.  }else
8c10: 7b 0a 20 20 20 20 75 33 32 20 78 3b 0a 20 20 20  {.    u32 x;.   
8c20: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
8c30: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29  2(&pCell[n], &x)
8c40: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  ;.    pInfo->nKe
8c50: 79 20 3d 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c  y = x;.    nPayl
8c60: 6f 61 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20  oad += x;.  }.  
8c70: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
8c80: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
8c90: 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e  nfo->nHeader = n
8ca0: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
8cb0: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
8cc0: 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  l ){.    /* This
8cd0: 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63   is the (easy) c
8ce0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
8cf0: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c   the entire payl
8d00: 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20  oad fits.    ** 
8d10: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
8d20: 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20  e.  No overflow 
8d30: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
8d40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a   */.    int nSiz
8d50: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
8d60: 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c  otal size of cel
8d70: 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74  l content in byt
8d80: 65 73 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d  es */.    pInfo-
8d90: 3e 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f  >nLocal = nPaylo
8da0: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
8db0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
8dc0: 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f    nSize = nPaylo
8dd0: 61 64 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20  ad + n;.    if( 
8de0: 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20  nSize<4 ){.     
8df0: 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20   nSize = 4;     
8e00: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
8e10: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
8e20: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d      }.    pInfo-
8e30: 3e 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a  >nSize = nSize;.
8e40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
8e50: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77  If the payload w
8e60: 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70  ill not fit comp
8e70: 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f  letely on the lo
8e80: 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76  cal page, we hav
8e90: 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69  e.    ** to deci
8ea0: 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  de how much to s
8eb0: 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64  tore locally and
8ec0: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69   how much to spi
8ed0: 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f  ll onto.    ** o
8ee0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
8ef0: 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20  The strategy is 
8f00: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
8f10: 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64  amount of unused
8f20: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e  .    ** space on
8f30: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
8f40: 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68  while keeping th
8f50: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61  e amount of loca
8f60: 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a  l storage.    **
8f70: 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c   in between minL
8f80: 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61  ocal and maxLoca
8f90: 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
8fa0: 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67   Warning:  chang
8fb0: 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72  ing the way over
8fc0: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20  flow payload is 
8fd0: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61  distributed in a
8fe0: 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69  ny.    ** way wi
8ff0: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
9000: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  incompatible fil
9010: 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f  e format..    */
9020: 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  .    int minLoca
9030: 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61  l;  /* Minimum a
9040: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
9050: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
9060: 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  .    int maxLoca
9070: 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61  l;  /* Maximum a
9080: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
9090: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
90a0: 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73  .    int surplus
90b0: 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  ;   /* Overflow 
90c0: 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c  payload availabl
90d0: 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72  e for local stor
90e0: 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c  age */..    minL
90f0: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
9100: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c  nLocal;.    maxL
9110: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61  ocal = pPage->ma
9120: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70  xLocal;.    surp
9130: 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  lus = minLocal +
9140: 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e   (nPayload - min
9150: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
9160: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
9170: 20 34 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72   4);.    if( sur
9180: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
9190: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
91a0: 3e 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75  >nLocal = surplu
91b0: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
91c0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
91d0: 6c 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  l = minLocal;.  
91e0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69    }.    pInfo->i
91f0: 4f 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f  Overflow = pInfo
9200: 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20  ->nLocal + n;.  
9210: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
9220: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
9230: 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61  w + 4;.  }.}.sta
9240: 74 69 63 20 76 6f 69 64 20 70 61 72 73 65 43 65  tic void parseCe
9250: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
9260: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
9270: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
9280: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
9290: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
92a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
92b0: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
92c0: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
92d0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
92e0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
92f0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9300: 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43  e */.){.  parseC
9310: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69  ellPtr(pPage, fi
9320: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
9330: 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  ell), pInfo);.}.
9340: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
9350: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
9360: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
9370: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
9380: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
9390: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
93a0: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
93b0: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
93c0: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
93d0: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
93e0: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
93f0: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
9400: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
9410: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
9420: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
9430: 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  nter..*/.#ifndef
9440: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69   NDEBUG.static i
9450: 6e 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  nt cellSize(MemP
9460: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
9470: 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  iCell){.  CellIn
9480: 66 6f 20 69 6e 66 6f 3b 0a 20 20 70 61 72 73 65  fo info;.  parse
9490: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
94a0: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74  l, &info);.  ret
94b0: 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  urn info.nSize;.
94c0: 7d 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  }.#endif.static 
94d0: 69 6e 74 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  int cellSizePtr(
94e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
94f0: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65  u8 *pCell){.  Ce
9500: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 70  llInfo info;.  p
9510: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
9520: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
9530: 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e  ;.  return info.
9540: 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  nSize;.}..#ifnde
9550: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
9560: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
9570: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
9580: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
9590: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
95a0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
95b0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
95c0: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
95d0: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
95e0: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
95f0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
9600: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
9610: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
9620: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
9630: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 69 66 28 20   *pCell){.  if( 
9640: 70 43 65 6c 6c 20 29 7b 0a 20 20 20 20 43 65 6c  pCell ){.    Cel
9650: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
9660: 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  parseCellPtr(pPa
9670: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
9680: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
9690: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
96a0: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
96b0: 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
96c0: 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66  ayload );.    if
96d0: 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
96e0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
96f0: 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e  nfo.nKey))>info.
9700: 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
9710: 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34  Pgno ovfl = get4
9720: 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
9730: 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
9740: 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61      return ptrma
9750: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
9760: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
9770: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
9780: 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pgno);.    }.  }
9790: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
97a0: 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20  _OK;.}./*.** If 
97b0: 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e  the cell with in
97c0: 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67  dex iCell on pag
97d0: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
97e0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
97f0: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
9800: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
9810: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
9820: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
9830: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
9840: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9850: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65  ptrmapPutOvfl(Me
9860: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9870: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a  t iCell){.  u8 *
9880: 70 43 65 6c 6c 3b 0a 20 20 70 43 65 6c 6c 20 3d  pCell;.  pCell =
9890: 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c   findOverflowCel
98a0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b  l(pPage, iCell);
98b0: 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70  .  return ptrmap
98c0: 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
98d0: 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64  , pCell);.}.#end
98e0: 69 66 0a 0a 0a 2f 2a 20 41 20 62 75 6e 63 68 20  if.../* A bunch 
98f0: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
9900: 65 6d 65 6e 74 73 20 74 6f 20 63 68 65 63 6b 20  ements to check 
9910: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
9920: 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 0a  state variables.
9930: 2a 2a 20 6f 66 20 68 61 6e 64 6c 65 20 70 20 28  ** of handle p (
9940: 74 79 70 65 20 42 74 72 65 65 2a 29 20 61 72 65  type Btree*) are
9950: 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73   internally cons
9960: 69 73 74 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  istent..*/.#defi
9970: 6e 65 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  ne btreeIntegrit
9980: 79 28 70 29 20 5c 0a 20 20 61 73 73 65 72 74 28  y(p) \.  assert(
9990: 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
99a0: 4e 53 5f 4e 4f 4e 45 20 7c 7c 20 70 2d 3e 70 42  NS_NONE || p->pB
99b0: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3c  t->nTransaction<
99c0: 70 2d 3e 70 42 74 2d 3e 6e 52 65 66 20 29 3b 20  p->pBt->nRef ); 
99d0: 5c 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  \.  assert( p->p
99e0: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
99f0: 3c 3d 70 2d 3e 70 42 74 2d 3e 6e 52 65 66 20 29  <=p->pBt->nRef )
9a00: 3b 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 2d  ; \.  assert( p-
9a10: 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
9a20: 69 6f 6e 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion!=TRANS_NONE 
9a30: 7c 7c 20 70 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e  || p->pBt->nTran
9a40: 73 61 63 74 69 6f 6e 3d 3d 30 20 29 3b 20 5c 0a  saction==0 ); \.
9a50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
9a60: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  ->inTransaction>
9a70: 3d 70 2d 3e 69 6e 54 72 61 6e 73 20 29 3b 20 0a  =p->inTrans ); .
9a80: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
9a90: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
9aa0: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
9ab0: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
9ac0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
9ad0: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
9ae0: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
9af0: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
9b00: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
9b10: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
9b20: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
9b30: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
9b40: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
9b50: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
9b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
9b70: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
9b80: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
9b90: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
9ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
9bb0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
9bc0: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
9bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
9be0: 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20  dress of a i-th 
9bf0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64  cell */.  int ad
9c00: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
9c10: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
9c20: 66 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  f first byte aft
9c30: 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  er cell pointer 
9c40: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68  array */.  int h
9c50: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
9c60: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
9c70: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
9c80: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65  er */.  int size
9c90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9ca0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
9cb0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cell */.  int us
9cc0: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  ableSize;       
9cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9ce0: 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f  f usable bytes o
9cf0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
9d00: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
9d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
9d20: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70  et to the cell p
9d30: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
9d40: 20 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20    int brk;      
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d60: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
9d70: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
9d80: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9da0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
9db0: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ls on the page *
9dc0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
9dd0: 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  r *data;       /
9de0: 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20  * The page data 
9df0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
9e00: 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20  ar *temp;       
9e10: 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72  /* Temp area for
9e20: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
9e30: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
9e40: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
9e50: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
9e60: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
9e70: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
9e80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9e90: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9ea0: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
9eb0: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
9ec0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9ed0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
9ee0: 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 4d 61   temp = sqliteMa
9ef0: 6c 6c 6f 63 28 20 70 50 61 67 65 2d 3e 70 42 74  lloc( pPage->pBt
9f00: 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
9f10: 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 20 72 65  if( temp==0 ) re
9f20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
9f30: 4d 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  M;.  data = pPag
9f40: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
9f50: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
9f60: 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  et;.  cellOffset
9f70: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
9f80: 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  fset;.  nCell = 
9f90: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
9fa0: 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67  assert( nCell==g
9fb0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
9fc0: 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c  r+3]) );.  usabl
9fd0: 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70  eSize = pPage->p
9fe0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
9ff0: 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65    brk = get2byte
a000: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
a010: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 62    memcpy(&temp[b
a020: 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c  rk], &data[brk],
a030: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 62 72   usableSize - br
a040: 6b 29 3b 0a 20 20 62 72 6b 20 3d 20 75 73 61 62  k);.  brk = usab
a050: 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d  leSize;.  for(i=
a060: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
a070: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
a080: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
a090: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
a0a0: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
a0b0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
a0c0: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
a0d0: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
a0e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3c 70      assert( pc<p
a0f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a100: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 69 7a  eSize );.    siz
a110: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  e = cellSizePtr(
a120: 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d  pPage, &temp[pc]
a130: 29 3b 0a 20 20 20 20 62 72 6b 20 2d 3d 20 73 69  );.    brk -= si
a140: 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ze;.    memcpy(&
a150: 64 61 74 61 5b 62 72 6b 5d 2c 20 26 74 65 6d 70  data[brk], &temp
a160: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  [pc], size);.   
a170: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
a180: 20 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73   brk);.  }.  ass
a190: 65 72 74 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66  ert( brk>=cellOf
a1a0: 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a  fset+2*nCell );.
a1b0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
a1c0: 5b 68 64 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20  [hdr+5], brk);. 
a1d0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
a1e0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
a1f0: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
a200: 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d  7] = 0;.  addr =
a210: 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43   cellOffset+2*nC
a220: 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ell;.  memset(&d
a230: 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 62 72  ata[addr], 0, br
a240: 6b 2d 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74  k-addr);.  sqlit
a250: 65 46 72 65 65 28 74 65 6d 70 29 3b 0a 20 20 72  eFree(temp);.  r
a260: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
a280: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
a290: 66 20 73 70 61 63 65 20 6f 6e 20 61 20 70 61 67  f space on a pag
a2a0: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
a2b0: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
a2c0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66  Page->aData[] of
a2d0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
a2e0: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c  of.** the new al
a2f0: 6c 6f 63 61 74 69 6f 6e 2e 20 4f 72 20 72 65 74  location. Or ret
a300: 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 69  urn 0 if there i
a310: 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 66 72 65  s not enough fre
a320: 65 0a 2a 2a 20 73 70 61 63 65 20 6f 6e 20 74 68  e.** space on th
a330: 65 20 70 61 67 65 20 74 6f 20 73 61 74 69 73 66  e page to satisf
a340: 79 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  y the allocation
a350: 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20   request..**.** 
a360: 49 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  If the page cont
a370: 61 69 6e 73 20 6e 42 79 74 65 73 20 6f 66 20 66  ains nBytes of f
a380: 72 65 65 20 73 70 61 63 65 20 62 75 74 20 64 6f  ree space but do
a390: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a  es not contain.*
a3a0: 2a 20 6e 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  * nBytes of cont
a3b0: 69 67 75 6f 75 73 20 66 72 65 65 20 73 70 61 63  iguous free spac
a3c0: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
a3d0: 74 69 6e 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  tine automatical
a3e0: 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64 65 66 72  ly.** calls defr
a3f0: 61 67 65 6d 65 6e 74 50 61 67 65 28 29 20 74 6f  agementPage() to
a400: 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20 61 6c 6c   consolidate all
a410: 20 66 72 65 65 20 73 70 61 63 65 20 62 65 66 6f   free space befo
a420: 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  re .** allocatin
a430: 67 20 74 68 65 20 6e 65 77 20 63 68 75 6e 6b 2e  g the new chunk.
a440: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
a450: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
a460: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
a470: 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 61   nByte){.  int a
a480: 64 64 72 2c 20 70 63 2c 20 68 64 72 3b 0a 20 20  ddr, pc, hdr;.  
a490: 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20  int size;.  int 
a4a0: 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20 74 6f 70  nFrag;.  int top
a4b0: 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
a4c0: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
a4d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a4e0: 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20 64 61 74   *data;.  .  dat
a4f0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
a500: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a510: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
a520: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
a530: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
a540: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
a550: 20 69 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e   if( nByte<4 ) n
a560: 42 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20  Byte = 4;.  if( 
a570: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79  pPage->nFree<nBy
a580: 74 65 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76  te || pPage->nOv
a590: 65 72 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72  erflow>0 ) retur
a5a0: 6e 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  n 0;.  pPage->nF
a5b0: 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  ree -= nByte;.  
a5c0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
a5d0: 4f 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67  Offset;..  nFrag
a5e0: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a   = data[hdr+7];.
a5f0: 20 20 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29    if( nFrag<60 )
a600: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
a610: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
a620: 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20  king for a slot 
a630: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61  big enough to sa
a640: 74 69 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a  tisfy the.    **
a650: 20 73 70 61 63 65 20 72 65 71 75 65 73 74 2e 20   space request. 
a660: 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64  */.    addr = hd
a670: 72 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  r+1;.    while( 
a680: 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26  (pc = get2byte(&
a690: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
a6a0: 7b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  {.      size = g
a6b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
a6c0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
a6d0: 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20  size>=nByte ){. 
a6e0: 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c         if( size<
a6f0: 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20  nByte+4 ){.     
a700: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74       memcpy(&dat
a710: 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70  a[addr], &data[p
a720: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
a730: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
a740: 6e 46 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e  nFrag + size - n
a750: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Byte;.          
a760: 72 65 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20  return pc;.     
a770: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a780: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
a790: 74 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e  ta[pc+2], size-n
a7a0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Byte);.         
a7b0: 20 72 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a   return pc + siz
a7c0: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
a7d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a7e0: 20 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20     addr = pc;.  
a7f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
a800: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
a810: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
a820: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
a830: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
a840: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
a850: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a  ontent area..  *
a860: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
a870: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
a880: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ;.  nCell = get2
a890: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
a8a0: 5d 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  ]);.  cellOffset
a8b0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
a8c0: 66 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61  fset;.  if( nFra
a8d0: 67 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66  g>=60 || cellOff
a8e0: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20  set + 2*nCell > 
a8f0: 74 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20  top - nByte ){. 
a900: 20 20 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e     if( defragmen
a910: 74 50 61 67 65 28 70 50 61 67 65 29 20 29 20 72  tPage(pPage) ) r
a920: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70  eturn 0;.    top
a930: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a940: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20  a[hdr+5]);.  }. 
a950: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
a960: 20 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66   assert( cellOff
a970: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d  set + 2*nCell <=
a980: 20 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79   top );.  put2by
a990: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
a9a0: 20 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20   top);.  return 
a9b0: 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  top;.}../*.** Re
a9c0: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
a9d0: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
a9e0: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
a9f0: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
aa00: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
aa10: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
aa20: 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72  Page->aDisk[star
aa30: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
aa40: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
aa50: 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e  is "size" bytes.
aa60: 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74  .**.** Most of t
aa70: 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69  he effort here i
aa80: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f  s involved in co
aa90: 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74  alesing adjacent
aaa0: 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  .** free blocks 
aab0: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69  into a single bi
aac0: 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f  g free block..*/
aad0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
aae0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
aaf0: 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74  pPage, int start
ab00: 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69  , int size){.  i
ab10: 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c  nt addr, pbegin,
ab20: 20 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64   hdr;.  unsigned
ab30: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
ab40: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61  age->aData;..  a
ab50: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
ab60: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
ab70: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
ab80: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
ab90: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
aba0: 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50  ssert( start>=pP
abb0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
abc0: 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a  +(pPage->leaf?0:
abd0: 34 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  4) );.  assert( 
abe0: 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d  (start + size)<=
abf0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
ac00: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
ac10: 73 69 7a 65 3c 34 20 29 20 73 69 7a 65 20 3d 20  size<4 ) size = 
ac20: 34 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  4;..#ifdef SQLIT
ac30: 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
ac40: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
ac50: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
ac60: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
ac70: 65 6e 20 74 68 65 20 53 45 43 55 52 45 5f 44 45  en the SECURE_DE
ac80: 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f  LETE .  ** optio
ac90: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20  n is enabled at 
aca0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a  compile-time */.
acb0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73    memset(&data[s
acc0: 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b  tart], 0, size);
acd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64  .#endif..  /* Ad
ace0: 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b  d the space back
acf0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
ad00: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
ad10: 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  cks */.  hdr = p
ad20: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
ad30: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
ad40: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
ad50: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
ad60: 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61  data[addr]))<sta
ad70: 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29  rt && pbegin>0 )
ad80: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  {.    assert( pb
ad90: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
ada0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
adb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
adc0: 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20  egin>addr );.   
add0: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
ade0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62    }.  assert( pb
adf0: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
ae00: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
ae10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67  ;.  assert( pbeg
ae20: 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69  in>addr || pbegi
ae30: 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79  n==0 );.  put2by
ae40: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  te(&data[addr], 
ae50: 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79  start);.  put2by
ae60: 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  te(&data[start],
ae70: 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32   pbegin);.  put2
ae80: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
ae90: 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50  +2], size);.  pP
aea0: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73 69  age->nFree += si
aeb0: 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73  ze;..  /* Coales
aec0: 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65  ce adjacent free
aed0: 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64   blocks */.  add
aee0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
aef0: 66 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c  fset + 1;.  whil
af00: 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74  e( (pbegin = get
af10: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
af20: 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  ]))>0 ){.    int
af30: 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a 20   pnext, psize;. 
af40: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
af50: 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73  n>addr );.    as
af60: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
af70: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
af80: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e  Size-4 );.    pn
af90: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
afa0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20  data[pbegin]);. 
afb0: 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62     psize = get2b
afc0: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
afd0: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62  +2]);.    if( pb
afe0: 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33  egin + psize + 3
aff0: 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65   >= pnext && pne
b000: 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  xt>0 ){.      in
b010: 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d  t frag = pnext -
b020: 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b   (pbegin+psize);
b030: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
b040: 72 61 67 3c 3d 64 61 74 61 5b 70 50 61 67 65 2d  rag<=data[pPage-
b050: 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 29 3b  >hdrOffset+7] );
b060: 0a 20 20 20 20 20 20 64 61 74 61 5b 70 50 61 67  .      data[pPag
b070: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20  e->hdrOffset+7] 
b080: 2d 3d 20 66 72 61 67 3b 0a 20 20 20 20 20 20 70  -= frag;.      p
b090: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
b0a0: 65 67 69 6e 5d 2c 20 67 65 74 32 62 79 74 65 28  egin], get2byte(
b0b0: 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b 0a  &data[pnext]));.
b0c0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
b0d0: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20  data[pbegin+2], 
b0e0: 70 6e 65 78 74 2b 67 65 74 32 62 79 74 65 28 26  pnext+get2byte(&
b0f0: 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d 70  data[pnext+2])-p
b100: 62 65 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  begin);.    }els
b110: 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  e{.      addr = 
b120: 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  pbegin;.    }.  
b130: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
b140: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
b150: 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 66   begins with a f
b160: 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65  reeblock, remove
b170: 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61   it. */.  if( da
b180: 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b  ta[hdr+1]==data[
b190: 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68  hdr+5] && data[h
b1a0: 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+2]==data[hdr+
b1b0: 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f  6] ){.    int to
b1c0: 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20  p;.    pbegin = 
b1d0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
b1e0: 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  dr+1]);.    memc
b1f0: 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  py(&data[hdr+1],
b200: 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20   &data[pbegin], 
b210: 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  2);.    top = ge
b220: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
b230: 2b 35 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79  +5]);.    put2by
b240: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
b250: 20 74 6f 70 20 2b 20 67 65 74 32 62 79 74 65 28   top + get2byte(
b260: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
b270: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
b280: 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
b290: 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
b2a0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
b2b0: 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
b2c0: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
b2d0: 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
b2e0: 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
b2f0: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
b300: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
b310: 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67  codeFlags(MemPag
b320: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
b330: 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61  agByte){.  BtSha
b340: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  red *pBt;     /*
b350: 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
b360: 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
b370: 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
b380: 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
b390: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
b3a0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74   );.  pPage->int
b3b0: 4b 65 79 20 3d 20 28 66 6c 61 67 42 79 74 65 20  Key = (flagByte 
b3c0: 26 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  & (PTF_INTKEY|PT
b3d0: 46 5f 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b  F_LEAFDATA))!=0;
b3e0: 0a 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61  .  pPage->zeroDa
b3f0: 74 61 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26  ta = (flagByte &
b400: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d   PTF_ZERODATA)!=
b410: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  0;.  pPage->leaf
b420: 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50   = (flagByte & P
b430: 54 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70  TF_LEAF)!=0;.  p
b440: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
b450: 7a 65 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c  ze = 4*(pPage->l
b460: 65 61 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d  eaf==0);.  pBt =
b470: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
b480: 66 28 20 66 6c 61 67 42 79 74 65 20 26 20 50 54  f( flagByte & PT
b490: 46 5f 4c 45 41 46 44 41 54 41 20 29 7b 0a 20 20  F_LEAFDATA ){.  
b4a0: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74    pPage->leafDat
b4b0: 61 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  a = 1;.    pPage
b4c0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
b4d0: 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
b4e0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
b4f0: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
b500: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
b510: 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 30 3b  e->leafData = 0;
b520: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
b530: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
b540: 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  ocal;.    pPage-
b550: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
b560: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  >minLocal;.  }. 
b570: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
b580: 3d 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44  = !(pPage->zeroD
b590: 61 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e  ata || (!pPage->
b5a0: 6c 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c  leaf && pPage->l
b5b0: 65 61 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a  eafData));.}../*
b5c0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
b5d0: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
b5e0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
b5f0: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
b600: 20 54 68 65 20 70 50 61 72 65 6e 74 20 70 61 72   The pParent par
b610: 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 61  ameter must be a
b620: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
b630: 4d 65 6d 50 61 67 65 20 77 68 69 63 68 0a 2a 2a  MemPage which.**
b640: 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f   is the parent o
b650: 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  f the page being
b660: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
b670: 68 65 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20  he root of a.** 
b680: 42 54 72 65 65 20 68 61 73 20 6e 6f 20 70 61 72  BTree has no par
b690: 65 6e 74 20 61 6e 64 20 73 6f 20 66 6f 72 20 74  ent and so for t
b6a0: 68 61 74 20 70 61 67 65 2c 20 70 50 61 72 65 6e  hat page, pParen
b6b0: 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52  t==NULL..**.** R
b6c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
b6d0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
b6e0: 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
b6f0: 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
b700: 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
b710: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
b720: 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
b730: 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
b740: 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
b750: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
b760: 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
b770: 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
b780: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
b790: 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
b7a0: 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
b7b0: 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
b7c0: 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
b7d0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
b7e0: 69 6e 74 20 69 6e 69 74 50 61 67 65 28 0a 20 20  int initPage(.  
b7f0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
b800: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
b810: 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c  ge to be initial
b820: 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ized */.  MemPag
b830: 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20  e *pParent      
b840: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e 20   /* The parent. 
b850: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
b860: 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20  /.){.  int pc;  
b870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b880: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
b890: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
b8a0: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  ->aData[] */.  i
b8b0: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
b8c0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
b8d0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
b8e0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20   header */.  u8 
b8f0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
b900: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
b910: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74  e->aData */.  Bt
b920: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
b930: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
b940: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
b950: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
b960: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
b970: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
b980: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
b990: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
b9a0: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
b9b0: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
b9c0: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
b9d0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
b9e0: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
b9f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
ba00: 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74  nused bytes on t
ba10: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  he page */.  int
ba20: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
ba30: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
ba40: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ba50: 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70 42 74  t area */..  pBt
ba60: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
ba70: 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20   assert( pBt!=0 
ba80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ba90: 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65  rent==0 || pPare
baa0: 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  nt->pBt==pBt );.
bab0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
bac0: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
bad0: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
bae0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
baf0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bb00: 2d 3e 61 44 61 74 61 20 3d 3d 20 26 28 28 75 6e  ->aData == &((un
bb10: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61  signed char*)pPa
bb20: 67 65 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69  ge)[-pBt->pageSi
bb30: 7a 65 5d 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ze] );.  if( pPa
bb40: 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50 61  ge->pParent!=pPa
bb50: 72 65 6e 74 20 26 26 20 28 70 50 61 67 65 2d 3e  rent && (pPage->
bb60: 70 50 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50  pParent!=0 || pP
bb70: 61 67 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a  age->isInit) ){.
bb80: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
bb90: 74 20 70 61 67 65 20 73 68 6f 75 6c 64 20 6e 65  t page should ne
bba0: 76 65 72 20 63 68 61 6e 67 65 20 75 6e 6c 65 73  ver change unles
bbb0: 73 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f  s the file is co
bbc0: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74  rrupt */.    ret
bbd0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
bbe0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
bbf0: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
bc00: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
bc10: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
bc20: 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 26 26 20  ->pParent==0 && 
bc30: 70 50 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20  pParent!=0 ){.  
bc40: 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74    pPage->pParent
bc50: 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20   = pParent;.    
bc60: 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
bc70: 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
bc80: 29 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70  );.  }.  hdr = p
bc90: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
bca0: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
bcb0: 3e 61 44 61 74 61 3b 0a 20 20 64 65 63 6f 64 65  >aData;.  decode
bcc0: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
bcd0: 61 5b 68 64 72 5d 29 3b 0a 20 20 70 50 61 67 65  a[hdr]);.  pPage
bce0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
bcf0: 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69  .  pPage->idxShi
bd00: 66 74 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65  ft = 0;.  usable
bd10: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
bd20: 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d  leSize;.  pPage-
bd30: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65  >cellOffset = ce
bd40: 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b  llOffset = hdr +
bd50: 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
bd60: 65 61 66 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74  eaf;.  top = get
bd70: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
bd80: 35 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43  5]);.  pPage->nC
bd90: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
bda0: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
bdb0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
bdc0: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
bdd0: 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20  .    /* To many 
bde0: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
bdf0: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
be00: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
be10: 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  pt */.    return
be20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
be30: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
be40: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
be50: 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20 26 26  && pParent!=0 &&
be60: 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d   pParent->pgno!=
be70: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20  1 ){.    /* All 
be80: 70 61 67 65 73 20 6d 75 73 74 20 68 61 76 65 20  pages must have 
be90: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c  at least one cel
bea0: 6c 2c 20 65 78 63 65 70 74 20 66 6f 72 20 72 6f  l, except for ro
beb0: 6f 74 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  ot pages */.    
bec0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bed0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
bee0: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
bef0: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
bf00: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ce on the page *
bf10: 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  /.  pc = get2byt
bf20: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
bf30: 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b  .  nFree = data[
bf40: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28  hdr+7] + top - (
bf50: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
bf60: 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
bf70: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
bf80: 20 20 20 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a     int next, siz
bf90: 65 3b 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  e;.    if( pc>us
bfa0: 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20  ableSize-4 ){.  
bfb0: 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63      /* Free bloc
bfc0: 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67  k is off the pag
bfd0: 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
bfe0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bff0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
c000: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
c010: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
c020: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
c030: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
c040: 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26      if( next>0 &
c050: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
c060: 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72  3 ){.      /* Fr
c070: 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  ee blocks must b
c080: 65 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  e in accending o
c090: 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rder */.      re
c0a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c0b0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
c0c0: 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69  .    nFree += si
c0d0: 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65 78  ze;.    pc = nex
c0e0: 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  t;.  }.  pPage->
c0f0: 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20  nFree = nFree;. 
c100: 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62   if( nFree>=usab
c110: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  leSize ){.    /*
c120: 20 46 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e   Free space cann
c130: 6f 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20  ot exceed total 
c140: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  page size */.   
c150: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c160: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c170: 7d 0a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  }..  pPage->isIn
c180: 69 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  it = 1;.  return
c190: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c1a0: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61  *.** Set up a ra
c1b0: 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69  w page so that i
c1c0: 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64  t looks like a d
c1d0: 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c  atabase page hol
c1e0: 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69  ding.** no entri
c1f0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
c200: 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50  id zeroPage(MemP
c210: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
c220: 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e  flags){.  unsign
c230: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
c240: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
c250: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
c260: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
c270: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
c280: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20  drOffset;.  int 
c290: 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
c2a0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
c2b0: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
c2c0: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
c2d0: 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
c2e0: 74 28 20 26 64 61 74 61 5b 70 42 74 2d 3e 70 61  t( &data[pBt->pa
c2f0: 67 65 53 69 7a 65 5d 20 3d 3d 20 28 75 6e 73 69  geSize] == (unsi
c300: 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65  gned char*)pPage
c310: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
c320: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
c330: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
c340: 50 61 67 65 29 20 29 3b 0a 20 20 6d 65 6d 73 65  Page) );.  memse
c350: 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c  t(&data[hdr], 0,
c360: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
c370: 20 2d 20 68 64 72 29 3b 0a 20 20 64 61 74 61 5b   - hdr);.  data[
c380: 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a 20 20  hdr] = flags;.  
c390: 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20  first = hdr + 8 
c3a0: 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f  + 4*((flags&PTF_
c3b0: 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d  LEAF)==0);.  mem
c3c0: 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
c3d0: 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
c3e0: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
c3f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c400: 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
c410: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
c420: 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61  nFree = pBt->usa
c430: 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b  bleSize - first;
c440: 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  .  decodeFlags(p
c450: 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
c460: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c470: 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d   = hdr;.  pPage-
c480: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69  >cellOffset = fi
c490: 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  rst;.  pPage->nO
c4a0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70  verflow = 0;.  p
c4b0: 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
c4c0: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65   0;.  pPage->nCe
c4d0: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ll = 0;.  pPage-
c4e0: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a  >isInit = 1;.}..
c4f0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
c500: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
c510: 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
c520: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
c530: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
c540: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
c550: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
c560: 69 6e 74 20 67 65 74 50 61 67 65 28 42 74 53 68  int getPage(BtSh
c570: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
c580: 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  pgno, MemPage **
c590: 70 70 50 61 67 65 2c 20 69 6e 74 20 63 6c 72 46  ppPage, int clrF
c5a0: 6c 61 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  lag){.  int rc;.
c5b0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
c5c0: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
c5d0: 61 67 65 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  age;..  rc = sql
c5e0: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
c5f0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
c600: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
c610: 44 62 50 61 67 65 2c 20 63 6c 72 46 6c 61 67 29  DbPage, clrFlag)
c620: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
c630: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20  urn rc;.  pPage 
c640: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
c650: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c660: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
c670: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
c680: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
c690: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
c6a0: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
c6b0: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
c6c0: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
c6d0: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
c6e0: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
c6f0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
c700: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
c710: 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
c720: 65 3b 0a 20 20 69 66 28 20 63 6c 72 46 6c 61 67  e;.  if( clrFlag
c730: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
c740: 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
c750: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c760: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
c770: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c780: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
c790: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
c7a0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20   initialize it. 
c7b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
c7c0: 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65   is just a conve
c7d0: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
c7e0: 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63  round separate c
c7f0: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 67 65 74 50 61  alls to.** getPa
c800: 67 65 28 29 20 61 6e 64 20 69 6e 69 74 50 61 67  ge() and initPag
c810: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
c820: 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
c830: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
c840: 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Bt,          /* 
c850: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
c860: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
c870: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
c880: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
c890: 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
c8a0: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
c8b0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
c8c0: 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72  page pointer her
c8d0: 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
c8e0: 70 50 61 72 65 6e 74 20 20 20 20 20 2f 2a 20 50  pParent     /* P
c8f0: 61 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  arent of the pag
c900: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
c910: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ;.  if( pgno==0 
c920: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c930: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c940: 54 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  T; .  }.  rc = g
c950: 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
c960: 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , ppPage, 0);.  
c970: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c980: 4b 20 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e  K && (*ppPage)->
c990: 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  isInit==0 ){.   
c9a0: 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28 2a   rc = initPage(*
c9b0: 70 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29  ppPage, pParent)
c9c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
c9d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
c9e0: 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20  ase a MemPage.  
c9f0: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63  This should be c
ca00: 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
ca10: 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c  ach prior.** cal
ca20: 6c 20 74 6f 20 67 65 74 50 61 67 65 2e 0a 2a 2f  l to getPage..*/
ca30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
ca40: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
ca50: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
ca60: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
ca70: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
ca80: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
ca90: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
caa0: 20 20 20 61 73 73 65 72 74 28 20 26 70 50 61 67     assert( &pPag
cab0: 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
cac0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3d 3d  pBt->pageSize]==
cad0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
cae0: 70 50 61 67 65 20 29 3b 0a 20 20 20 20 73 71 6c  pPage );.    sql
caf0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
cb00: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
cb10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
cb20: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
cb30: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 65 66  led when the ref
cb40: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
cb50: 20 61 20 70 61 67 65 0a 2a 2a 20 72 65 61 63 68   a page.** reach
cb60: 65 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65 65  es zero.  We nee
cb70: 64 20 74 6f 20 75 6e 72 65 66 20 74 68 65 20 70  d to unref the p
cb80: 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 77  Parent pointer w
cb90: 68 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70 70  hen that.** happ
cba0: 65 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ens..*/.static v
cbb0: 6f 69 64 20 70 61 67 65 44 65 73 74 72 75 63 74  oid pageDestruct
cbc0: 6f 72 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  or(DbPage *pData
cbd0: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b  , int pageSize){
cbe0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
cbf0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61  e;.  assert( (pa
cc00: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
cc10: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
cc20: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
cc30: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
cc40: 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  a);.  if( pPage-
cc50: 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  >pParent ){.    
cc60: 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
cc70: 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
cc80: 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50  t;.    pPage->pP
cc90: 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72  arent = 0;.    r
cca0: 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65  eleasePage(pPare
ccb0: 6e 74 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nt);.  }.  pPage
ccc0: 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a  ->isInit = 0;.}.
ccd0: 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
cce0: 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
ccf0: 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
cd00: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
cd10: 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
cd20: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
cd30: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
cd40: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
cd50: 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
cd60: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
cd70: 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
cd80: 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
cd90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
cda0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
cdb0: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
cdc0: 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
cdd0: 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
cde0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
cdf0: 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
ce00: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
ce10: 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
ce20: 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
ce30: 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
ce40: 61 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29  a, int pageSize)
ce50: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
ce60: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  ge;.  assert( (p
ce70: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
ce80: 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  );.  pPage = (Me
ce90: 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
cea0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
ceb0: 74 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ta);.  if( pPage
cec0: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
ced0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
cee0: 30 3b 0a 20 20 20 20 69 6e 69 74 50 61 67 65 28  0;.    initPage(
cef0: 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50  pPage, pPage->pP
cf00: 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  arent);.  }.}../
cf10: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
cf20: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
cf30: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
cf40: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
cf50: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
cf60: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
cf70: 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74  ULL.** a new dat
cf80: 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e  abase with a ran
cf90: 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61  dom name is crea
cfa0: 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f  ted.  This rando
cfb0: 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74  mly named.** dat
cfc0: 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
cfd0: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  be deleted when 
cfe0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
cff0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
d000: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
d010: 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  eeOpen(.  const 
d020: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
d030: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
d040: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
d050: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
d060: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
d070: 20 2a 70 53 71 6c 69 74 65 2c 20 20 20 20 20 20   *pSqlite,      
d080: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
d090: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
d0a0: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
d0b0: 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
d0c0: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
d0d0: 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
d0e0: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
d0f0: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
d100: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
d110: 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
d120: 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
d130: 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
d140: 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
d150: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d170: 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
d180: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  rn */.  int rc;.
d190: 20 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a    int nReserve;.
d1a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
d1b0: 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a  zDbHeader[100];.
d1c0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
d1d0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
d1e0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
d1f0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
d200: 49 53 4b 49 4f 29 0a 20 20 63 6f 6e 73 74 20 54  ISKIO).  const T
d210: 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 72  hreadData *pTsdr
d220: 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  o;.#endif..  /* 
d230: 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65  Set the variable
d240: 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65   isMemdb to true
d250: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
d260: 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a  y database, or .
d270: 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61    ** false for a
d280: 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61   file-based data
d290: 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f  base. This symbo
d2a0: 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  l is only requir
d2b0: 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65  ed if.  ** eithe
d2c0: 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d  r of the shared-
d2d0: 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75  data or autovacu
d2e0: 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20  um features are 
d2f0: 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69  compiled .  ** i
d300: 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e  nto the library.
d310: 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
d320: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
d330: 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20  HARED_CACHE) || 
d340: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d350: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29  OMIT_AUTOVACUUM)
d360: 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
d370: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
d380: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d     const int isM
d390: 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73  emdb = 0;.  #els
d3a0: 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  e.    const int 
d3b0: 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e  isMemdb = zFilen
d3c0: 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a  ame && !strcmp(z
d3d0: 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
d3e0: 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a  ry:");.  #endif.
d3f0: 23 65 6e 64 69 66 0a 0a 20 20 70 20 3d 20 73 71  #endif..  p = sq
d400: 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f  liteMalloc(sizeo
d410: 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
d420: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
d430: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
d440: 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
d450: 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
d460: 20 70 2d 3e 70 53 71 6c 69 74 65 20 3d 20 70 53   p->pSqlite = pS
d470: 71 6c 69 74 65 3b 0a 0a 20 20 2f 2a 20 54 72 79  qlite;..  /* Try
d480: 20 74 6f 20 66 69 6e 64 20 61 6e 20 65 78 69 73   to find an exis
d490: 74 69 6e 67 20 42 74 72 65 65 20 73 74 72 75 63  ting Btree struc
d4a0: 74 75 72 65 20 6f 70 65 6e 65 64 20 6f 6e 20 7a  ture opened on z
d4b0: 46 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 23 69 66  Filename. */.#if
d4c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d4d0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
d4e0: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
d4f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
d500: 49 4f 29 0a 20 20 70 54 73 64 72 6f 20 3d 20 73  IO).  pTsdro = s
d510: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
d520: 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66  ReadOnly();.  if
d530: 28 20 70 54 73 64 72 6f 2d 3e 75 73 65 53 68 61  ( pTsdro->useSha
d540: 72 65 64 44 61 74 61 20 26 26 20 7a 46 69 6c 65  redData && zFile
d550: 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
d560: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   ){.    char *zF
d570: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
d580: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
d590: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
d5a0: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
d5b0: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
d5c0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20  sqliteFree(p);. 
d5d0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d5e0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
d5f0: 20 20 20 20 66 6f 72 28 70 42 74 3d 70 54 73 64      for(pBt=pTsd
d600: 72 6f 2d 3e 70 42 74 72 65 65 3b 20 70 42 74 3b  ro->pBtree; pBt;
d610: 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
d620: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d630: 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
d640: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
d650: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
d660: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
d670: 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
d680: 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  er)) ){.        
d690: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
d6a0: 20 20 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d        *ppBtree =
d6b0: 20 70 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   p;.        pBt-
d6c0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
d6d0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
d6e0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
d6f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d700: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
d710: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
d720: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
d730: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
d740: 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c   /*.  ** The fol
d750: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
d760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
d770: 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
d780: 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
d790: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
d7a0: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
d7b0: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
d7c0: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
d7d0: 72 65 73 75 6c 74 0a 20 20 2a 2a 20 77 68 65 6e  result.  ** when
d7e0: 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
d7f0: 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
d800: 65 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 61  ecture..  */.  a
d810: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
d820: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
d830: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73  i64)==4 );.  ass
d840: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
d850: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36  ==8 || sizeof(u6
d860: 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72  4)==4 );.  asser
d870: 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
d880: 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  4 );.  assert( s
d890: 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
d8a0: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
d8b0: 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 0a 20  f(Pgno)==4 );.. 
d8c0: 20 70 42 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pBt = sqliteMal
d8d0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  loc( sizeof(*pBt
d8e0: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 3d 3d  ) );.  if( pBt==
d8f0: 30 20 29 7b 0a 20 20 20 20 2a 70 70 42 74 72 65  0 ){.    *ppBtre
d900: 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
d910: 65 46 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65  eFree(p);.    re
d920: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d930: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
d940: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 26  lite3PagerOpen(&
d950: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
d960: 6c 65 6e 61 6d 65 2c 20 45 58 54 52 41 5f 53 49  lename, EXTRA_SI
d970: 5a 45 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ZE, flags);.  if
d980: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d990: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
d9a0: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
d9b0: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
d9c0: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
d9d0: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
d9e0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
d9f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
da00: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 72 20  if( pBt->pPager 
da10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
da20: 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
da30: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
da40: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42     sqliteFree(pB
da50: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  t);.    sqliteFr
da60: 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
da70: 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ree = 0;.    ret
da80: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 2d  urn rc;.  }.  p-
da90: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 0a 20 20 73  >pBt = pBt;..  s
daa0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65  qlite3PagerSetDe
dab0: 73 74 72 75 63 74 6f 72 28 70 42 74 2d 3e 70 50  structor(pBt->pP
dac0: 61 67 65 72 2c 20 70 61 67 65 44 65 73 74 72 75  ager, pageDestru
dad0: 63 74 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctor);.  sqlite3
dae0: 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
daf0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61  (pBt->pPager, pa
db00: 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 70 42 74  geReinit);.  pBt
db10: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
db20: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
db30: 3b 0a 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  ;.  pBt->readOnl
db40: 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  y = sqlite3Pager
db50: 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
db60: 70 50 61 67 65 72 29 3b 0a 20 20 70 42 74 2d 3e  pPager);.  pBt->
db70: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
db80: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31  yte(&zDbHeader[1
db90: 36 5d 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  6]);.  if( pBt->
dba0: 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
dbb0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
dbc0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
dbd0: 5a 45 0a 20 20 20 20 20 20 20 7c 7c 20 28 28 70  ZE.       || ((p
dbe0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
dbf0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
dc00: 30 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 61  0 ){.    pBt->pa
dc10: 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  geSize = SQLITE_
dc20: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
dc30: 45 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45  E;.    pBt->maxE
dc40: 6d 62 65 64 46 72 61 63 20 3d 20 36 34 3b 20 20  mbedFrac = 64;  
dc50: 20 2f 2a 20 32 35 25 20 2a 2f 0a 20 20 20 20 70   /* 25% */.    p
dc60: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
dc70: 20 3d 20 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35   = 32;   /* 12.5
dc80: 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6d 69  % */.    pBt->mi
dc90: 6e 4c 65 61 66 46 72 61 63 20 3d 20 33 32 3b 20  nLeafFrac = 32; 
dca0: 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23     /* 12.5% */.#
dcb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
dcc0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
dcd0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
dce0: 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
dcf0: 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
dd00: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
dd10: 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ase, then.    **
dd20: 20 64 6f 20 6e 6f 74 20 73 65 74 20 74 68 65 20   do not set the 
dd30: 61 75 74 6f 2d 76 61 63 75 75 6d 20 66 6c 61 67  auto-vacuum flag
dd40: 2c 20 65 76 65 6e 20 69 66 20 53 51 4c 49 54 45  , even if SQLITE
dd50: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
dd60: 55 55 4d 0a 20 20 20 20 2a 2a 20 69 73 20 74 72  UUM.    ** is tr
dd70: 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
dd80: 20 68 61 6e 64 2c 20 69 66 20 53 51 4c 49 54 45   hand, if SQLITE
dd90: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
dda0: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
ddb0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 22 3a 6d  .    ** then ":m
ddc0: 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
ddd0: 61 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  a regular file-n
dde0: 61 6d 65 2e 20 52 65 73 70 65 63 74 20 74 68 65  ame. Respect the
ddf0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 20 20 20   auto-vacuum.   
de00: 20 2a 2a 20 64 65 66 61 75 6c 74 20 69 6e 20 74   ** default in t
de10: 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  his case..    */
de20: 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  .    if( zFilena
de30: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
de40: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  {.      pBt->aut
de50: 6f 56 61 63 75 75 6d 20 3d 20 53 51 4c 49 54 45  oVacuum = SQLITE
de60: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
de70: 55 55 4d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  UUM;.    }.#endi
de80: 66 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  f.    nReserve =
de90: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
dea0: 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
deb0: 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 70  eader[20];.    p
dec0: 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63  Bt->maxEmbedFrac
ded0: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 31 5d   = zDbHeader[21]
dee0: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d  ;.    pBt->minEm
def0: 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65 61  bedFrac = zDbHea
df00: 64 65 72 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74  der[22];.    pBt
df10: 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20  ->minLeafFrac = 
df20: 7a 44 62 48 65 61 64 65 72 5b 32 33 5d 3b 0a 20  zDbHeader[23];. 
df30: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
df40: 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
df50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
df60: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
df70: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
df80: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
df90: 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
dfa0: 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
dfb0: 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
dfc0: 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
dfd0: 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
dfe0: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
dff0: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
e000: 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
e010: 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
e020: 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ize */.  sqlite3
e030: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
e040: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
e050: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 23  t->pageSize);..#
e060: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
e070: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
e080: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
e090: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
e0a0: 53 4b 49 4f 29 0a 20 20 2f 2a 20 41 64 64 20 74  SKIO).  /* Add t
e0b0: 68 65 20 6e 65 77 20 62 74 72 65 65 20 74 6f 20  he new btree to 
e0c0: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
e0d0: 73 74 61 72 74 69 6e 67 20 61 74 20 54 68 72 65  starting at Thre
e0e0: 61 64 44 61 74 61 2e 70 42 74 72 65 65 2e 0a 20  adData.pBtree.. 
e0f0: 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   ** There is no 
e100: 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 6d 61  chance that a ma
e110: 6c 6c 6f 63 28 29 20 6d 61 79 20 66 61 69 6c 20  lloc() may fail 
e120: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 0a 20  inside of the . 
e130: 20 2a 2a 20 73 71 6c 69 74 65 33 54 68 72 65 61   ** sqlite3Threa
e140: 64 44 61 74 61 28 29 20 63 61 6c 6c 2c 20 61 73  dData() call, as
e150: 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20   the ThreadData 
e160: 73 74 72 75 63 74 75 72 65 20 6d 75 73 74 20 68  structure must h
e170: 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ave already.  **
e180: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
e190: 66 6f 72 20 70 54 73 64 72 6f 2d 3e 75 73 65 53  for pTsdro->useS
e1a0: 68 61 72 65 64 44 61 74 61 20 74 6f 20 62 65 20  haredData to be 
e1b0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20  non-zero..  */. 
e1c0: 20 69 66 28 20 70 54 73 64 72 6f 2d 3e 75 73 65   if( pTsdro->use
e1d0: 53 68 61 72 65 64 44 61 74 61 20 26 26 20 7a 46  SharedData && zF
e1e0: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
e1f0: 6d 64 62 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  mdb ){.    pBt->
e200: 70 4e 65 78 74 20 3d 20 70 54 73 64 72 6f 2d 3e  pNext = pTsdro->
e210: 70 42 74 72 65 65 3b 0a 20 20 20 20 73 71 6c 69  pBtree;.    sqli
e220: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 2d  te3ThreadData()-
e230: 3e 70 42 74 72 65 65 20 3d 20 70 42 74 3b 0a 20  >pBtree = pBt;. 
e240: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d   }.#endif.  pBt-
e250: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 2a 70 70  >nRef = 1;.  *pp
e260: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 72 65 74  Btree = p;.  ret
e270: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e280: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
e290: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
e2a0: 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
e2b0: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
e2c0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
e2d0: 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
e2e0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
e2f0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
e300: 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 23 69 66 6e  sor *pCur;..#ifn
e310: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e320: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 54  SHARED_CACHE.  T
e330: 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 3b  hreadData *pTsd;
e340: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c  .#endif..  /* Cl
e350: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
e360: 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
e370: 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 70 43  handle.  */.  pC
e380: 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
e390: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
e3a0: 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
e3b0: 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
e3c0: 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
e3d0: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
e3e0: 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
e3f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
e400: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
e410: 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
e420: 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
e430: 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
e440: 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
e450: 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
e460: 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
e470: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
e480: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
e490: 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
e4a0: 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
e4b0: 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
e4c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
e4d0: 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  eRollback(p);.  
e4e0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 0a  sqliteFree(p);..
e4f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e500: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
e510: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
e520: 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f  re still other o
e530: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
e540: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61  ences to the sha
e550: 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73  red-btree.  ** s
e560: 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e  tructure, return
e570: 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e   now. The remain
e580: 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63  der of this proc
e590: 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20  edure cleans .  
e5a0: 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64  ** up the shared
e5b0: 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61  -btree..  */.  a
e5c0: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
e5d0: 3e 30 20 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  >0 );.  pBt->nRe
e5e0: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
e5f0: 6e 52 65 66 20 29 7b 0a 20 20 20 20 72 65 74 75  nRef ){.    retu
e600: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e610: 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  }..  /* Remove t
e620: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
e630: 66 72 6f 6d 20 74 68 65 20 74 68 72 65 61 64 20  from the thread 
e640: 77 69 64 65 20 6c 69 73 74 2e 20 43 61 6c 6c 20  wide list. Call 
e650: 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61  .  ** ThreadData
e660: 52 65 61 64 4f 6e 6c 79 28 29 20 61 6e 64 20 74  ReadOnly() and t
e670: 68 65 6e 20 63 61 73 74 20 61 77 61 79 20 74 68  hen cast away th
e680: 65 20 63 6f 6e 73 74 20 70 72 6f 70 65 72 74 79  e const property
e690: 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 70 6f   of the .  ** po
e6a0: 69 6e 74 65 72 20 74 6f 20 61 76 6f 69 64 20 61  inter to avoid a
e6b0: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 72 65 61 64  llocating thread
e6c0: 20 64 61 74 61 20 69 66 20 69 74 20 69 73 20 6e   data if it is n
e6d0: 6f 74 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  ot really requir
e6e0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 73 64 20  ed..  */.  pTsd 
e6f0: 3d 20 28 54 68 72 65 61 64 44 61 74 61 20 2a 29  = (ThreadData *)
e700: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
e710: 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69  aReadOnly();.  i
e720: 66 28 20 70 54 73 64 2d 3e 70 42 74 72 65 65 3d  f( pTsd->pBtree=
e730: 3d 70 42 74 20 29 7b 0a 20 20 20 20 61 73 73 65  =pBt ){.    asse
e740: 72 74 28 20 70 54 73 64 3d 3d 73 71 6c 69 74 65  rt( pTsd==sqlite
e750: 33 54 68 72 65 61 64 44 61 74 61 28 29 20 29 3b  3ThreadData() );
e760: 0a 20 20 20 20 70 54 73 64 2d 3e 70 42 74 72 65  .    pTsd->pBtre
e770: 65 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  e = pBt->pNext;.
e780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 42 74 53    }else{.    BtS
e790: 68 61 72 65 64 20 2a 70 50 72 65 76 3b 0a 20 20  hared *pPrev;.  
e7a0: 20 20 66 6f 72 28 70 50 72 65 76 3d 70 54 73 64    for(pPrev=pTsd
e7b0: 2d 3e 70 42 74 72 65 65 3b 20 70 50 72 65 76 20  ->pBtree; pPrev 
e7c0: 26 26 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 21  && pPrev->pNext!
e7d0: 3d 70 42 74 3b 20 70 50 72 65 76 3d 70 50 72 65  =pBt; pPrev=pPre
e7e0: 76 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20  v->pNext){}.    
e7f0: 69 66 28 20 70 50 72 65 76 20 29 7b 0a 20 20 20  if( pPrev ){.   
e800: 20 20 20 61 73 73 65 72 74 28 20 70 54 73 64 3d     assert( pTsd=
e810: 3d 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61  =sqlite3ThreadDa
e820: 74 61 28 29 20 29 3b 0a 20 20 20 20 20 20 70 50  ta() );.      pP
e830: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  rev->pNext = pBt
e840: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
e850: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
e860: 43 6c 6f 73 65 20 74 68 65 20 70 61 67 65 72 20  Close the pager 
e870: 61 6e 64 20 66 72 65 65 20 74 68 65 20 73 68 61  and free the sha
e880: 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
e890: 75 72 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ure */.  assert(
e8a0: 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
e8b0: 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
e8c0: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
e8d0: 72 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 78  r);.  if( pBt->x
e8e0: 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
e8f0: 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
e900: 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
e910: 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
e920: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
e930: 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ee(pBt->pSchema)
e940: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
e950: 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Bt);.  return SQ
e960: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e970: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 62 75 73  * Change the bus
e980: 79 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y handler callba
e990: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ck function..*/.
e9a0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
e9b0: 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 42  SetBusyHandler(B
e9c0: 74 72 65 65 20 2a 70 2c 20 42 75 73 79 48 61 6e  tree *p, BusyHan
e9d0: 64 6c 65 72 20 2a 70 48 61 6e 64 6c 65 72 29 7b  dler *pHandler){
e9e0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
e9f0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 70 42 74   = p->pBt;.  pBt
ea00: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
ea10: 20 70 48 61 6e 64 6c 65 72 3b 0a 20 20 73 71 6c   pHandler;.  sql
ea20: 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
ea30: 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
ea40: 67 65 72 2c 20 70 48 61 6e 64 6c 65 72 29 3b 0a  ger, pHandler);.
ea50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ea60: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
ea70: 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
ea80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
ea90: 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
eaa0: 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
eab0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
eac0: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
ead0: 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
eae0: 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
eaf0: 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
eb00: 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
eb10: 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
eb20: 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
eb30: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
eb40: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
eb50: 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
eb60: 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
eb70: 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
eb80: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
eb90: 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
eba0: 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
ebb0: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
ebc0: 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
ebd0: 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
ebe0: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
ebf0: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
ec00: 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
ec10: 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
ec20: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
ec30: 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
ec40: 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
ec50: 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
ec60: 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
ec70: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
ec80: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
ec90: 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
eca0: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
ecb0: 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
ecc0: 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
ecd0: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
ece0: 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
ecf0: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
ed00: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
ed10: 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
ed20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
ed30: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
ed40: 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
ed50: 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
ed60: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
ed70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
ed80: 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
ed90: 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
eda0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
edb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
edc0: 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
edd0: 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
ede0: 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
edf0: 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
ee00: 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
ee10: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
ee20: 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
ee30: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
ee40: 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
ee50: 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
ee60: 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
ee70: 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
ee80: 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
ee90: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
eea0: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
eeb0: 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
eec0: 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
eed0: 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
eee0: 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
eef0: 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
ef00: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
ef10: 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
ef20: 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
ef30: 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
ef40: 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
ef50: 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
ef60: 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
ef70: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
ef80: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
ef90: 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
efa0: 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79  e3BtreeSetSafety
efb0: 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20  Level(Btree *p, 
efc0: 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
efd0: 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68  ullSync){.  BtSh
efe0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
eff0: 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  Bt;.  sqlite3Pag
f000: 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
f010: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
f020: 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a  vel, fullSync);.
f030: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f040: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
f050: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
f060: 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72  if the given btr
f070: 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66  ee is set to saf
f080: 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e  ety level 1.  In
f090: 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
f0a0: 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
f0b0: 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73  no sync() occurs
f0c0: 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
f0d0: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
f0e0: 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
f0f0: 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  led(Btree *p){. 
f100: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
f110: 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
f120: 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
f130: 50 61 67 65 72 20 29 3b 0a 20 20 72 65 74 75 72  Pager );.  retur
f140: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  n sqlite3PagerNo
f150: 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72  sync(pBt->pPager
f160: 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  );.}..#if !defin
f170: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
f180: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
f190: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f1a0: 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a  _OMIT_VACUUM)./*
f1b0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
f1c0: 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
f1d0: 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
f1e0: 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
f1f0: 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a  es per page..**.
f200: 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
f210: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
f220: 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31   of 2 between 51
f230: 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66  2 and 65536.  If
f240: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a   the page.** siz
f250: 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20  e supplied does 
f260: 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f  not meet this co
f270: 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68  nstraint then th
f280: 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
f290: 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a  ot.** changed..*
f2a0: 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20  *.** Page sizes 
f2b0: 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  are constrained 
f2c0: 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  to be a power of
f2d0: 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65   two so that the
f2e0: 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68   region.** of th
f2f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
f300: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
f310: 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50   (beginning at P
f320: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20  ENDING_BYTE,.** 
f330: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
f340: 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e  ast the 1GB boun
f350: 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30  dary, 0x40000000
f360: 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72  ) needs to occur
f370: 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e  .** at the begin
f380: 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a  ning of a page..
f390: 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
f3a0: 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c  er nReserve is l
f3b0: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
f3c0: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
f3d0: 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79  f reserved.** by
f3e0: 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20  tes per page is 
f3f0: 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
f400: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
f410: 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
f420: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
f430: 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
f440: 72 76 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  rve){.  BtShared
f450: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
f460: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
f470: 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20  izeFixed ){.    
f480: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
f490: 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
f4a0: 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
f4b0: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
f4c0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
f4d0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
f4e0: 20 20 7d 0a 20 20 69 66 28 20 70 61 67 65 53 69    }.  if( pageSi
f4f0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
f500: 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
f510: 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20  PAGE_SIZE &&.   
f520: 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d       ((pageSize-
f530: 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20  1)&pageSize)==0 
f540: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
f550: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
f560: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f570: 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20  !pBt->pPage1 && 
f580: 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
f590: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
f5a0: 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ze = sqlite3Page
f5b0: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
f5c0: 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 53 69  ->pPager, pageSi
f5d0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  ze);.  }.  pBt->
f5e0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
f5f0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
f600: 73 65 72 76 65 3b 0a 20 20 72 65 74 75 72 6e 20  serve;.  return 
f610: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f620: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
f630: 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
f640: 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
f650: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
f660: 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
f670: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
f680: 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
f690: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
f6a0: 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74 72  eeGetReserve(Btr
f6b0: 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
f6c0: 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
f6d0: 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
f6e0: 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66  leSize;.}.#endif
f6f0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
f700: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
f710: 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
f720: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f730: 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a  VACUUM) */../*.*
f740: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
f750: 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
f760: 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
f770: 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
f780: 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
f790: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
f7a0: 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
f7b0: 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
f7c0: 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
f7d0: 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
f7e0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
f7f0: 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
f800: 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
f810: 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
f820: 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
f830: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
f840: 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
f850: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
f860: 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
f870: 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
f880: 75 75 6d 29 7b 0a 20 20 42 74 53 68 61 72 65 64  uum){.  BtShared
f890: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 3b   *pBt = p->pBt;;
f8a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
f8b0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
f8c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
f8d0: 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
f8e0: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
f8f0: 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 72  zeFixed ){.    r
f900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
f910: 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 70 42 74  DONLY;.  }.  pBt
f920: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
f930: 61 75 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b  autoVacuum?1:0);
f940: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f950: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  _OK;.#endif.}../
f960: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
f970: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
f980: 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
f990: 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
f9a0: 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
f9b0: 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
f9c0: 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
f9d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
f9e0: 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
f9f0: 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
fa00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
fa10: 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
fa20: 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  n 0;.#else.  ret
fa30: 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 61 75 74 6f  urn p->pBt->auto
fa40: 56 61 63 75 75 6d 3b 0a 23 65 6e 64 69 66 0a 7d  Vacuum;.#endif.}
fa50: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72  .../*.** Get a r
fa60: 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67  eference to pPag
fa70: 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  e1 of the databa
fa80: 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77  se file.  This w
fa90: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75  ill.** also acqu
faa0: 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f  ire a readlock o
fab0: 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a  n that file..**.
fac0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
fad0: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
fae0: 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c  ess.  If the fil
faf0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65  e is not a.** we
fb00: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
fb10: 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51  se file, then SQ
fb20: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20  LITE_CORRUPT is 
fb30: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c  returned..** SQL
fb40: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
fb50: 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61  rned if the data
fb60: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20  base is locked. 
fb70: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
fb80: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
fb90: 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
fba0: 6d 6f 72 79 2e 20 20 53 51 4c 49 54 45 5f 50 52  mory.  SQLITE_PR
fbb0: 4f 54 4f 43 4f 4c 20 69 73 20 72 65 74 75 72 6e  OTOCOL is return
fbc0: 65 64 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  ed.** if there i
fbd0: 73 20 61 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  s a locking prot
fbe0: 6f 63 6f 6c 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a  ocol violation..
fbf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
fc00: 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64  ckBtree(BtShared
fc10: 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
fc20: 2c 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 4d 65  , pageSize;.  Me
fc30: 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
fc40: 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
fc50: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
fc60: 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 67 65 74 50  _OK;.  rc = getP
fc70: 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
fc80: 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
fc90: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
fca0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 0a 20 20  eturn rc;.  ..  
fcb0: 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
fcc0: 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
fcd0: 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
fce0: 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
fcf0: 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
fd00: 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
fd10: 2f 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  /.  rc = SQLITE_
fd20: 4e 4f 54 41 44 42 3b 0a 20 20 69 66 28 20 73 71  NOTADB;.  if( sq
fd30: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
fd40: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
fd50: 3e 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 61  >0 ){.    u8 *pa
fd60: 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
fd70: 61 74 61 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ata;.    if( mem
fd80: 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
fd90: 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
fda0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
fdb0: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
fdc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
fdd0: 61 67 65 31 5b 31 38 5d 3e 31 20 7c 7c 20 70 61  age1[18]>1 || pa
fde0: 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
fdf0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
fe00: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
fe10: 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
fe20: 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b  get2byte(&page1[
fe30: 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28  16]);.    if( ((
fe40: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
fe50: 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
fe60: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
fe70: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
fe80: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
fe90: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
fea0: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
feb0: 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
fec0: 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
fed0: 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20  ze = pageSize - 
fee0: 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69  page1[20];.    i
fef0: 66 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  f( pBt->usableSi
ff00: 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20  ze<500 ){.      
ff10: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
ff20: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
ff30: 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46    pBt->maxEmbedF
ff40: 72 61 63 20 3d 20 70 61 67 65 31 5b 32 31 5d 3b  rac = page1[21];
ff50: 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62  .    pBt->minEmb
ff60: 65 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32  edFrac = page1[2
ff70: 32 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e  2];.    pBt->min
ff80: 4c 65 61 66 46 72 61 63 20 3d 20 70 61 67 65 31  LeafFrac = page1
ff90: 5b 32 33 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51  [23];.#ifndef SQ
ffa0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
ffb0: 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
ffc0: 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
ffd0: 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
ffe0: 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   4*4])?1:0);.#en
fff0: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
10000 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
10010 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
10020 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
10030 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
10040 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
10050 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
10060 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
10070 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
10080 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
10090 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
100a0 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
100b0 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
100c0 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
100d0 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
100e0 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
100f0 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
10100 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
10110 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
10120 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
10130 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
10140 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
10150 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
10160 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
10170 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
10180 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
10190 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
101a0 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
101b0 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
101c0 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
101d0 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
101e0 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
101f0 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
10200 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
10210 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
10220 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
10230 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
10240 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
10250 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73  Local = (pBt->us
10260 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74  ableSize-12)*pBt
10270 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 2f 32  ->maxEmbedFrac/2
10280 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e  55 - 23;.  pBt->
10290 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  minLocal = (pBt-
102a0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
102b0 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61  pBt->minEmbedFra
102c0 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42  c/255 - 23;.  pB
102d0 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74  t->maxLeaf = pBt
102e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
102f0 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  5;.  pBt->minLea
10300 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  f = (pBt->usable
10310 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69  Size-12)*pBt->mi
10320 6e 4c 65 61 66 46 72 61 63 2f 32 35 35 20 2d 20  nLeafFrac/255 - 
10330 32 33 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d  23;.  if( pBt->m
10340 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d 61 78  inLocal>pBt->max
10350 4c 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61  Local || pBt->ma
10360 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20 20 20  xLocal<0 ){.    
10370 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
10380 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20 61 73  failed;.  }.  as
10390 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
103a0 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
103b0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
103c0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
103d0 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e  pPage1;.  return
103e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
103f0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a  e1_init_failed:.
10400 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
10410 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
10420 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
10430 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10440 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
10450 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65  ks like lockBtre
10460 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  e() except that 
10470 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20  it also invokes 
10480 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c  the.** busy call
10490 62 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73  back if there is
104a0 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
104b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
104c0 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74  lockBtreeWithRet
104d0 72 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b  ry(Btree *pRef){
104e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
104f0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 52 65  TE_OK;.  if( pRe
10500 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  f->inTrans==TRAN
10510 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38  S_NONE ){.    u8
10520 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d   inTransaction =
10530 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72   pRef->pBt->inTr
10540 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62  ansaction;.    b
10550 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52  treeIntegrity(pR
10560 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ef);.    rc = sq
10570 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
10580 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20  rans(pRef, 0);. 
10590 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e     pRef->pBt->in
105a0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e  Transaction = in
105b0 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20  Transaction;.   
105c0 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d   pRef->inTrans =
105d0 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
105e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
105f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66  OK ){.      pRef
10600 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ->pBt->nTransact
10610 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ion--;.    }.   
10620 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
10630 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pRef);.  }.  ret
10640 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20  urn rc;.}.      
10650 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72   ../*.** If ther
10660 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
10670 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
10680 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
10690 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
106a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
106b0 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
106c0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
106d0 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
106e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
106f0 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
10700 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
10710 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
10720 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
10730 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
10740 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
10750 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
10760 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  any outstanding 
10770 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f  cursors, this ro
10780 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
10790 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
107a0 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
107b0 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74  n in progress, t
107c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
107d0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
107e0 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72  c void unlockBtr
107f0 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61  eeIfUnused(BtSha
10800 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
10810 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
10820 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
10830 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  && pBt->pCursor=
10840 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  =0 && pBt->pPage
10850 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  1!=0 ){.    if( 
10860 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
10870 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
10880 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66  )>=1 ){.      if
10890 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
108a0 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Data==0 ){.     
108b0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
108c0 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  e = pBt->pPage1;
108d0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
108e0 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70  aData = &((u8*)p
108f0 50 61 67 65 29 5b 2d 70 42 74 2d 3e 70 61 67 65  Page)[-pBt->page
10900 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 70  Size];.        p
10910 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
10920 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
10930 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  pgno = 1;.      
10940 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
10950 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29  age(pBt->pPage1)
10960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
10970 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
10980 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
10990 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
109a0 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74 61  reate a new data
109b0 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
109c0 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
109d0 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  age of the.** fi
109e0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
109f0 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
10a00 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
10a10 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
10a20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
10a30 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ata;.  int rc;. 
10a40 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
10a50 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
10a60 70 50 61 67 65 72 29 3e 30 20 29 20 72 65 74 75  pPager)>0 ) retu
10a70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10a80 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
10a90 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31  1;.  assert( pP1
10aa0 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  !=0 );.  data = 
10ab0 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  pP1->aData;.  rc
10ac0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
10ad0 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67  rite(pP1->pDbPag
10ae0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
10af0 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63  eturn rc;.  memc
10b00 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48  py(data, zMagicH
10b10 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d  eader, sizeof(zM
10b20 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20  agicHeader));.  
10b30 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a  assert( sizeof(z
10b40 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36  MagicHeader)==16
10b50 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
10b60 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70  data[16], pBt->p
10b70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
10b80 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
10b90 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [19] = 1;.  data
10ba0 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67 65  [20] = pBt->page
10bb0 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
10bc0 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b 32  leSize;.  data[2
10bd0 31 5d 20 3d 20 70 42 74 2d 3e 6d 61 78 45 6d 62  1] = pBt->maxEmb
10be0 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b 32  edFrac;.  data[2
10bf0 32 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 45 6d 62  2] = pBt->minEmb
10c00 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b 32  edFrac;.  data[2
10c10 33 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  3] = pBt->minLea
10c20 66 46 72 61 63 3b 0a 20 20 6d 65 6d 73 65 74 28  fFrac;.  memset(
10c30 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
10c40 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
10c50 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
10c60 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
10c70 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
10c80 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
10c90 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
10ca0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
10cb0 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  UUM.  if( pBt->a
10cc0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
10cd0 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
10ce0 33 36 20 2b 20 34 2a 34 5d 2c 20 31 29 3b 0a 20  36 + 4*4], 1);. 
10cf0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
10d00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10d10 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
10d20 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
10d30 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
10d40 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
10d50 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
10d60 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
10d70 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
10d80 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
10d90 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
10da0 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
10db0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
10dc0 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
10dd0 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
10de0 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
10df0 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
10e00 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
10e10 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
10e20 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
10e30 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
10e40 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
10e50 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
10e60 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
10e70 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
10e80 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
10e90 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
10ea0 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
10eb0 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
10ec0 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
10ed0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
10ee0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
10ef0 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
10f00 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
10f10 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
10f20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
10f30 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
10f40 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
10f50 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
10f60 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
10f70 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
10f80 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
10f90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
10fa0 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
10fb0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10fc0 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
10fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
10fe0 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
10ff0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
11000 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
11010 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
11020 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
11030 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11040 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
11050 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
11060 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
11070 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
11080 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
11090 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
110a0 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
110b0 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
110c0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
110d0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
110e0 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
110f0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
11100 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
11110 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
11120 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
11130 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
11140 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
11150 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
11160 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
11170 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
11180 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
11190 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
111a0 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
111b0 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
111c0 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
111d0 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
111e0 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
111f0 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
11200 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
11210 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
11220 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
11230 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
11240 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
11250 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
11260 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
11270 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
11280 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
11290 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
112a0 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
112b0 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
112c0 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
112d0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
112e0 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
112f0 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
11300 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
11310 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
11320 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
11330 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
11340 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
11350 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
11360 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
11370 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
11380 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
11390 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
113a0 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
113b0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
113c0 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
113d0 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53  t wrflag){.  BtS
113e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
113f0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
11400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 62 74  SQLITE_OK;..  bt
11410 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
11420 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
11430 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
11440 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
11450 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
11460 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
11470 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
11480 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
11490 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
114a0 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
114b0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
114c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
114d0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
114e0 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
114f0 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
11500 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 72  wrflag) ){.    r
11510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11520 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
11530 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
11540 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
11550 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
11560 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
11570 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
11580 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
11590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
115a0 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DONLY;.  }..  /*
115b0 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
115c0 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
115d0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
115e0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
115f0 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
11600 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
11610 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
11620 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
11630 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
11640 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
11650 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
11660 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  */.  if( pBt->in
11670 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
11680 4e 53 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c  NS_WRITE && wrfl
11690 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
116a0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
116b0 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66  }..  do {.    if
116c0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
116d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   ){.      rc = l
116e0 6f 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20  ockBtree(pBt);. 
116f0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
11700 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11710 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
11720 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11730 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
11740 67 65 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72  ge1->pDbPage, wr
11750 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 69  flag>1);.      i
11760 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11770 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11780 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
11790 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
117a0 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  .  .    if( rc==
117b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
117c0 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 20     if( wrflag ) 
117d0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
117e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
117f0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
11800 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
11810 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  }.  }while( rc==
11820 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
11830 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
11840 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
11850 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11860 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
11870 6c 65 72 28 70 42 74 2d 3e 70 42 75 73 79 48 61  ler(pBt->pBusyHa
11880 6e 64 6c 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  ndler) );..  if(
11890 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
118a0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
118b0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
118c0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
118d0 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20  Transaction++;. 
118e0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
118f0 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
11900 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
11910 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
11920 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
11930 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
11940 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
11950 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
11960 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  Trans;.    }.  }
11970 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
11980 74 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ty(p);.  return 
11990 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
119a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
119b0 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
119c0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
119d0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
119e0 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
119f0 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
11a00 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
11a10 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
11a20 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
11a30 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
11a40 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
11a50 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
11a60 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
11a70 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
11a80 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
11a90 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
11aa0 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
11ad0 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
11ae0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11b10 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
11b20 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
11b30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b50 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
11b60 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
11b70 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
11b80 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67    int isInitOrig
11b90 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
11ba0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
11bb0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
11bc0 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  initPage(pPage, 
11bd0 30 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  0);.  nCell = pP
11be0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
11bf0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
11c00 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
11c10 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
11c20 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
11c30 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
11c40 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
11c50 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ll);.    if( rc!
11c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11c70 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
11c80 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
11c90 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
11ca0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
11cb0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
11cc0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
11cd0 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20  Cell);.      rc 
11ce0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
11cf0 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
11d00 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b  AP_BTREE, pgno);
11d10 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
11d20 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
11d30 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
11d40 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  s_out;.    }.  }
11d50 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
11d60 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
11d70 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
11d80 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
11d90 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
11da0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63  fset+8]);.    rc
11db0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
11dc0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
11dd0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
11de0 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64  ;.  }..set_child
11df0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20  _ptrmaps_out:.  
11e00 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
11e10 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65  isInitOrig;.  re
11e20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11e30 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70  * Somewhere on p
11e40 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20 67  Page, which is g
11e50 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
11e60 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f  a btree page, no
11e70 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
11e80 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e   page, is a poin
11e90 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
11ea0 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  m. Modify this p
11eb0 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69  ointer so that i
11ec0 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69  t points to.** i
11ed0 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
11ee0 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
11ef0 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
11f00 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64  r to be modified
11f10 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  , as .** follows
11f20 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
11f30 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
11f40 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
11f50 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
11f60 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
11f70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11f80 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
11f90 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
11fa0 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
11fb0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
11fc0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
11fd0 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
11fe0 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
11ff0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
12000 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
12010 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
12020 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
12030 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
12040 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
12050 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
12060 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
12070 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
12090 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
120a0 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
120b0 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
120c0 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
120d0 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
120e0 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
120f0 75 38 20 65 54 79 70 65 29 7b 0a 20 20 69 66 28  u8 eType){.  if(
12100 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
12110 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
12120 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
12130 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
12140 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
12150 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
12160 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
12170 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
12180 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
12190 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
121a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
121b0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  PT;.    }.    pu
121c0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
121d0 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
121e0 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 73 49 6e  se{.    int isIn
121f0 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
12200 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
12210 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
12220 3b 0a 0a 20 20 20 20 69 6e 69 74 50 61 67 65 28  ;..    initPage(
12230 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e  pPage, 0);.    n
12240 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
12250 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ell;..    for(i=
12260 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
12270 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
12280 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
12290 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
122a0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
122b0 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20  OVERFLOW1 ){.   
122c0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
122d0 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 61 72 73  fo;.        pars
122e0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
122f0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
12300 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
12310 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
12320 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
12330 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
12340 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
12350 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
12360 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
12370 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
12380 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
12390 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
123a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
123b0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
123c0 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
123d0 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
123e0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
123f0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
12400 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
12410 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
12420 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12430 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
12440 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
12450 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
12460 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
12470 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
12480 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
12490 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
124a0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
124b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
124c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
124d0 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
124e0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
124f0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
12500 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
12510 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
12520 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
12530 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
12540 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
12550 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
12560 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
12570 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
12580 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
12590 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
125a0 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
125b0 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
125c0 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69   valid..*/.stati
125d0 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
125e0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
125f0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
12600 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
12610 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
12620 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
12630 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
12640 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
12650 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12660 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
12670 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
12680 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
12690 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
126a0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
126b0 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
126c0 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
126d0 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 20 20  gno iFreePage   
126e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
126f0 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
12700 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 29 7b  pDbPage to */.){
12710 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
12720 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
12730 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
12740 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
12750 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
12760 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
12770 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
12780 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
12790 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
127a0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
127b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
127c0 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
127d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
127e0 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
127f0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
12800 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
12810 52 4f 4f 54 50 41 47 45 20 29 3b 0a 0a 20 20 2f  ROOTPAGE );..  /
12820 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
12830 61 67 65 20 66 72 6f 6d 20 69 74 27 73 20 63 75  age from it's cu
12840 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
12850 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
12860 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
12870 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
12880 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
12890 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
128a0 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
128b0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
128c0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
128d0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
128e0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
128f0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
12900 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
12910 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
12920 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
12930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12940 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
12950 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
12960 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
12970 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
12980 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
12990 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
129a0 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
129b0 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
129c0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
129d0 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
129e0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
129f0 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
12a00 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
12a10 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
12a20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
12a30 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
12a40 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
12a50 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
12a60 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
12a70 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
12a80 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
12a90 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
12aa0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
12ab0 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
12ac0 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
12ad0 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
12ae0 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
12af0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
12b00 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
12b10 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
12b20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
12b30 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
12b40 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
12b50 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
12b60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12b70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
12b80 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
12b90 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
12ba0 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
12bb0 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
12bc0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
12bd0 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
12be0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
12bf0 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
12c00 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
12c10 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
12c20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12c30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12c40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12c50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12c60 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
12c70 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
12c80 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
12c90 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
12ca0 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
12cb0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
12cc0 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
12cd0 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
12ce0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
12cf0 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
12d00 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
12d10 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
12d20 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  {.    rc = getPa
12d30 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
12d40 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
12d50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12d70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
12d80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12d90 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
12da0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
12db0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12dc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
12dd0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
12de0 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
12df0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
12e00 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
12e10 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
12e20 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
12e30 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
12e40 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
12e50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
12e60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12e70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
12e80 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
12e90 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
12ea0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  trPage);.    }. 
12eb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12ec0 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
12ed0 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
12ee0 65 64 20 62 79 20 61 75 74 6f 56 61 63 75 75 6d  ed by autoVacuum
12ef0 43 6f 6d 6d 69 74 28 29 2e 20 2a 2f 0a 73 74 61  Commit(). */.sta
12f00 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
12f10 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
12f20 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
12f30 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
12f40 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  u8);../*.** This
12f50 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
12f60 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69  ed prior to sqli
12f70 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77  te3PagerCommit w
12f80 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
12f90 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64  n.** is commited
12fa0 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
12fb0 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  uum database..*/
12fc0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
12fd0 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
12fe0 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
12ff0 20 2a 6e 54 72 75 6e 63 29 7b 0a 20 20 50 61 67   *nTrunc){.  Pag
13000 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
13010 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f  ->pPager;.  Pgno
13020 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
13030 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
13040 20 6f 66 20 70 61 67 65 73 20 72 65 6d 61 69 6e   of pages remain
13050 69 6e 67 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ing on the free-
13060 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  list. */.  int n
13070 50 74 72 4d 61 70 3b 20 20 20 20 20 20 20 20 20  PtrMap;         
13080 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13090 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  of pointer-map p
130a0 61 67 65 73 20 64 65 61 6c 6c 6f 63 61 74 65 64  ages deallocated
130b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 53   */.  Pgno origS
130c0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
130d0 20 2f 2a 20 50 61 67 65 73 20 69 6e 20 74 68 65   /* Pages in the
130e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
130f0 2f 0a 20 20 50 67 6e 6f 20 66 69 6e 53 69 7a 65  /.  Pgno finSize
13100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
13110 2a 20 50 61 67 65 73 20 69 6e 20 74 68 65 20 64  * Pages in the d
13120 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 66 74  atabase file aft
13130 65 72 20 74 72 75 6e 63 61 74 69 6f 6e 20 2a 2f  er truncation */
13140 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13160 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
13170 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 69 6e    u8 eType;.  in
13180 74 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61  t pgsz = pBt->pa
13190 67 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65  geSize;  /* Page
131a0 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 64   size for this d
131b0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
131c0 6f 20 69 44 62 50 61 67 65 3b 20 20 20 20 20 20  o iDbPage;      
131d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
131e0 61 74 61 62 61 73 65 20 70 61 67 65 20 74 6f 20  atabase page to 
131f0 6d 6f 76 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  move */.  MemPag
13200 65 20 2a 70 44 62 4d 65 6d 50 61 67 65 20 3d 20  e *pDbMemPage = 
13210 30 3b 20 20 20 2f 2a 20 22 22 20 2a 2f 0a 20 20  0;   /* "" */.  
13220 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 20 20  Pgno iPtrPage;  
13230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13240 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
13250 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
13260 6f 20 69 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o iDbPage */.  P
13270 67 6e 6f 20 69 46 72 65 65 50 61 67 65 3b 20 20  gno iFreePage;  
13280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13290 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 20   free-list page 
132a0 74 6f 20 6d 6f 76 65 20 69 44 62 50 61 67 65 20  to move iDbPage 
132b0 74 6f 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  to */.  MemPage 
132c0 2a 70 46 72 65 65 4d 65 6d 50 61 67 65 20 3d 20  *pFreeMemPage = 
132d0 30 3b 20 2f 2a 20 22 22 20 2a 2f 0a 0a 23 69 66  0; /* "" */..#if
132e0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e  ndef NDEBUG.  in
132f0 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
13300 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
13310 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ager);.#endif.. 
13320 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
13330 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66  toVacuum );.  if
13340 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
13350 70 42 74 2c 20 73 71 6c 69 74 65 33 50 61 67 65  pBt, sqlite3Page
13360 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
13370 72 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  r)) ){.    retur
13380 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
13390 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
133a0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
133b0 6d 61 6e 79 20 66 72 65 65 2d 70 61 67 65 73 20  many free-pages 
133c0 61 72 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  are in the datab
133d0 61 73 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  ase. If there ar
133e0 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 20 70  e no.  ** free p
133f0 61 67 65 73 2c 20 74 68 65 6e 20 61 75 74 6f 2d  ages, then auto-
13400 76 61 63 75 75 6d 20 69 73 20 61 20 6e 6f 2d 6f  vacuum is a no-o
13410 70 2e 0a 20 20 2a 2f 0a 20 20 6e 46 72 65 65 4c  p..  */.  nFreeL
13420 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
13430 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
13440 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e  ta[36]);.  if( n
13450 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
13460 20 20 20 2a 6e 54 72 75 6e 63 20 3d 20 30 3b 0a     *nTrunc = 0;.
13470 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13480 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
13490 54 68 69 73 20 62 6c 6f 63 6b 20 66 69 67 75 72  This block figur
134a0 65 73 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  es out how many 
134b0 70 61 67 65 73 20 74 68 65 72 65 20 61 72 65 20  pages there are 
134c0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  in the database.
134d0 20 20 2a 2a 20 6e 6f 77 20 28 76 61 72 69 61 62    ** now (variab
134e0 6c 65 20 6f 72 69 67 53 69 7a 65 29 2c 20 61 6e  le origSize), an
134f0 64 20 68 6f 77 20 6d 61 6e 79 20 74 68 65 72 65  d how many there
13500 20 77 69 6c 6c 20 62 65 20 61 66 74 65 72 20 74   will be after t
13510 68 65 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 69  he.  ** truncati
13520 6f 6e 20 28 76 61 72 69 61 62 6c 65 20 66 69 6e  on (variable fin
13530 53 69 7a 65 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Size)..  **.  **
13540 20 54 68 65 20 66 69 6e 61 6c 20 73 69 7a 65 20   The final size 
13550 69 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  is the original 
13560 73 69 7a 65 2c 20 6c 65 73 73 20 74 68 65 20 6e  size, less the n
13570 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61  umber of free pa
13580 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ges.  ** in the 
13590 64 61 74 61 62 61 73 65 2c 20 6c 65 73 73 20 61  database, less a
135a0 6e 79 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ny pointer-map p
135b0 61 67 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ages that will n
135c0 6f 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 62 65  o longer.  ** be
135d0 20 72 65 71 75 69 72 65 64 2c 20 6c 65 73 73 20   required, less 
135e0 31 20 69 66 20 74 68 65 20 70 65 6e 64 69 6e 67  1 if the pending
135f0 2d 62 79 74 65 20 70 61 67 65 20 77 61 73 20 70  -byte page was p
13600 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
13610 61 73 65 0a 20 20 2a 2a 20 62 75 74 20 69 73 20  ase.  ** but is 
13620 6e 6f 74 20 61 66 74 65 72 20 74 68 65 20 74 72  not after the tr
13630 75 6e 63 61 74 69 6f 6e 2e 0a 20 20 2a 2a 2f 0a  uncation..  **/.
13640 20 20 6f 72 69 67 53 69 7a 65 20 3d 20 73 71 6c    origSize = sql
13650 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
13660 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  nt(pPager);.  if
13670 28 20 6f 72 69 67 53 69 7a 65 3d 3d 50 45 4e 44  ( origSize==PEND
13680 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
13690 74 29 20 29 7b 0a 20 20 20 20 6f 72 69 67 53 69  t) ){.    origSi
136a0 7a 65 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 50 74 72  ze--;.  }.  nPtr
136b0 4d 61 70 20 3d 20 28 6e 46 72 65 65 4c 69 73 74  Map = (nFreeList
136c0 2d 6f 72 69 67 53 69 7a 65 2b 50 54 52 4d 41 50  -origSize+PTRMAP
136d0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6f 72 69  _PAGENO(pBt, ori
136e0 67 53 69 7a 65 29 2b 70 67 73 7a 2f 35 29 2f 28  gSize)+pgsz/5)/(
136f0 70 67 73 7a 2f 35 29 3b 0a 20 20 66 69 6e 53 69  pgsz/5);.  finSi
13700 7a 65 20 3d 20 6f 72 69 67 53 69 7a 65 20 2d 20  ze = origSize - 
13710 6e 46 72 65 65 4c 69 73 74 20 2d 20 6e 50 74 72  nFreeList - nPtr
13720 4d 61 70 3b 0a 20 20 69 66 28 20 6f 72 69 67 53  Map;.  if( origS
13730 69 7a 65 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  ize>PENDING_BYTE
13740 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 66 69  _PAGE(pBt) && fi
13750 6e 53 69 7a 65 3c 3d 50 45 4e 44 49 4e 47 5f 42  nSize<=PENDING_B
13760 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
13770 0a 20 20 20 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a  .    finSize--;.
13780 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52    }.  while( PTR
13790 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
137a0 66 69 6e 53 69 7a 65 29 20 7c 7c 20 66 69 6e 53  finSize) || finS
137b0 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ize==PENDING_BYT
137c0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
137d0 20 20 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a 20 20     finSize--;.  
137e0 7d 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  }.  TRACE(("AUTO
137f0 56 41 43 55 55 4d 3a 20 42 65 67 69 6e 20 28 64  VACUUM: Begin (d
13800 62 20 73 69 7a 65 20 25 64 2d 3e 25 64 29 5c 6e  b size %d->%d)\n
13810 22 2c 20 6f 72 69 67 53 69 7a 65 2c 20 66 69 6e  ", origSize, fin
13820 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 56 61  Size));..  /* Va
13830 72 69 61 62 6c 65 20 27 66 69 6e 53 69 7a 65 27  riable 'finSize'
13840 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a   will be the siz
13850 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  e of the file in
13860 20 70 61 67 65 73 20 61 66 74 65 72 0a 20 20 2a   pages after.  *
13870 2a 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  * the auto-vacuu
13880 6d 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 20  m has completed 
13890 28 74 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c  (the current fil
138a0 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65  e size minus the
138b0 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
138c0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
138d0 65 20 6c 69 73 74 29 2e 20 4c 6f 6f 70 20 74 68  e list). Loop th
138e0 72 6f 75 67 68 20 74 68 65 20 70 61 67 65 73 20  rough the pages 
138f0 74 68 61 74 20 6c 69 65 20 62 65 79 6f 6e 64 0a  that lie beyond.
13900 20 20 2a 2a 20 74 68 69 73 20 6d 61 72 6b 2c 20    ** this mark, 
13910 61 6e 64 20 69 66 20 74 68 65 79 20 61 72 65 20  and if they are 
13920 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 6e 20 74  not already on t
13930 68 65 20 66 72 65 65 20 6c 69 73 74 2c 20 6d 6f  he free list, mo
13940 76 65 20 74 68 65 6d 0a 20 20 2a 2a 20 74 6f 20  ve them.  ** to 
13950 61 20 66 72 65 65 20 70 61 67 65 20 65 61 72 6c  a free page earl
13960 69 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ier in the file 
13970 28 73 6f 6d 65 77 68 65 72 65 20 62 65 66 6f 72  (somewhere befor
13980 65 20 66 69 6e 53 69 7a 65 29 2e 0a 20 20 2a 2f  e finSize)..  */
13990 0a 20 20 66 6f 72 28 20 69 44 62 50 61 67 65 3d  .  for( iDbPage=
139a0 66 69 6e 53 69 7a 65 2b 31 3b 20 69 44 62 50 61  finSize+1; iDbPa
139b0 67 65 3c 3d 6f 72 69 67 53 69 7a 65 3b 20 69 44  ge<=origSize; iD
139c0 62 50 61 67 65 2b 2b 20 29 7b 0a 20 20 20 20 2f  bPage++ ){.    /
139d0 2a 20 49 66 20 69 44 62 50 61 67 65 20 69 73 20  * If iDbPage is 
139e0 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  a pointer map pa
139f0 67 65 2c 20 6f 72 20 74 68 65 20 70 65 6e 64 69  ge, or the pendi
13a00 6e 67 2d 62 79 74 65 20 70 61 67 65 2c 20 73 6b  ng-byte page, sk
13a10 69 70 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ip it. */.    if
13a20 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
13a30 70 42 74 2c 20 69 44 62 50 61 67 65 29 20 7c 7c  pBt, iDbPage) ||
13a40 20 69 44 62 50 61 67 65 3d 3d 50 45 4e 44 49 4e   iDbPage==PENDIN
13a50 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
13a60 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
13a70 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  ue;.    }..    r
13a80 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
13a90 74 2c 20 69 44 62 50 61 67 65 2c 20 26 65 54 79  t, iDbPage, &eTy
13aa0 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
13ab0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13ac0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74  TE_OK ) goto aut
13ad0 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 20  ovacuum_out;.   
13ae0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
13af0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
13b00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13b10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
13b20 20 20 20 20 20 67 6f 74 6f 20 61 75 74 6f 76 61       goto autova
13b30 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  cuum_out;.    }.
13b40 0a 20 20 20 20 2f 2a 20 49 66 20 69 44 62 50 61  .    /* If iDbPa
13b50 67 65 20 69 73 20 66 72 65 65 2c 20 64 6f 20 6e  ge is free, do n
13b60 6f 74 20 73 77 61 70 20 69 74 2e 20 20 2a 2f 0a  ot swap it.  */.
13b70 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
13b80 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
13b90 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
13ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
13bb0 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 69 44   getPage(pBt, iD
13bc0 62 50 61 67 65 2c 20 26 70 44 62 4d 65 6d 50 61  bPage, &pDbMemPa
13bd0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
13be0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
13bf0 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f  goto autovacuum_
13c00 6f 75 74 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  out;..    /* Fin
13c10 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
13c20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
13c30 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6c 72   that is not alr
13c40 65 61 64 79 20 61 74 20 74 68 65 20 65 6e 64 20  eady at the end 
13c50 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  .    ** of the f
13c60 69 6c 65 2e 20 41 20 70 61 67 65 20 63 61 6e 20  ile. A page can 
13c70 62 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  be pulled off th
13c80 65 20 66 72 65 65 20 6c 69 73 74 20 75 73 69 6e  e free list usin
13c90 67 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 61 6c  g the .    ** al
13ca0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
13cb0 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a  ) routine..    *
13cc0 2f 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  /.    do{.      
13cd0 69 66 28 20 70 46 72 65 65 4d 65 6d 50 61 67 65  if( pFreeMemPage
13ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
13cf0 61 73 65 50 61 67 65 28 70 46 72 65 65 4d 65 6d  asePage(pFreeMem
13d00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
13d10 46 72 65 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b  FreeMemPage = 0;
13d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
13d30 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
13d40 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
13d50 65 4d 65 6d 50 61 67 65 2c 20 26 69 46 72 65 65  eMemPage, &iFree
13d60 50 61 67 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Page, 0, 0);.   
13d70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13d80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13d90 72 65 6c 65 61 73 65 50 61 67 65 28 70 44 62 4d  releasePage(pDbM
13da0 65 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  emPage);.       
13db0 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d   goto autovacuum
13dc0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
13dd0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
13de0 65 50 61 67 65 3c 3d 6f 72 69 67 53 69 7a 65 20  ePage<=origSize 
13df0 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  );.    }while( i
13e00 46 72 65 65 50 61 67 65 3e 66 69 6e 53 69 7a 65  FreePage>finSize
13e10 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   );.    releaseP
13e20 61 67 65 28 70 46 72 65 65 4d 65 6d 50 61 67 65  age(pFreeMemPage
13e30 29 3b 0a 20 20 20 20 70 46 72 65 65 4d 65 6d 50  );.    pFreeMemP
13e40 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  age = 0;..    /*
13e50 20 52 65 6c 6f 63 61 74 65 20 74 68 65 20 70 61   Relocate the pa
13e60 67 65 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  ge into the body
13e70 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 4e 6f   of the file. No
13e80 74 65 20 74 68 61 74 20 61 6c 74 68 6f 75 67 68  te that although
13e90 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67   the .    ** pag
13ea0 65 20 68 61 73 20 6d 6f 76 65 64 20 77 69 74 68  e has moved with
13eb0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
13ec0 66 69 6c 65 2c 20 74 68 65 20 70 44 62 4d 65 6d  file, the pDbMem
13ed0 50 61 67 65 20 70 6f 69 6e 74 65 72 20 0a 20 20  Page pointer .  
13ee0 20 20 2a 2a 20 72 65 6d 61 69 6e 73 20 76 61 6c    ** remains val
13ef0 69 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  id. This means t
13f00 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
13f10 6e 20 63 61 6e 20 72 75 6e 20 77 69 74 68 6f 75  n can run withou
13f20 74 0a 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64  t.    ** invalid
13f30 61 74 69 6e 67 20 63 75 72 73 6f 72 73 20 6f 70  ating cursors op
13f40 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 2e  en on the btree.
13f50 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
13f60 6e 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 73 68  nt in .    ** sh
13f70 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e  ared-cache mode.
13f80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
13f90 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
13fa0 74 2c 20 70 44 62 4d 65 6d 50 61 67 65 2c 20 65  t, pDbMemPage, e
13fb0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
13fc0 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20  iFreePage);.    
13fd0 72 65 6c 65 61 73 65 50 61 67 65 28 70 44 62 4d  releasePage(pDbM
13fe0 65 6d 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  emPage);.    if(
13ff0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14000 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d   goto autovacuum
14010 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
14020 54 68 65 20 65 6e 74 69 72 65 20 66 72 65 65 2d  The entire free-
14030 6c 69 73 74 20 68 61 73 20 62 65 65 6e 20 73 77  list has been sw
14040 61 70 70 65 64 20 74 6f 20 74 68 65 20 65 6e 64  apped to the end
14050 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 53 6f   of the file. So
14060 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 74  .  ** truncate t
14070 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14080 20 74 6f 20 66 69 6e 53 69 7a 65 20 70 61 67 65   to finSize page
14090 73 20 61 6e 64 20 63 6f 6e 73 69 64 65 72 20 74  s and consider t
140a0 68 65 0a 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  he.  ** free-lis
140b0 74 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  t empty..  */.  
140c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
140d0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
140e0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
140f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14100 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76 61 63  K ) goto autovac
14110 75 75 6d 5f 6f 75 74 3b 0a 20 20 70 75 74 34 62  uum_out;.  put4b
14120 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
14130 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
14140 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74  .  put4byte(&pBt
14150 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
14160 33 36 5d 2c 20 30 29 3b 0a 20 20 2a 6e 54 72 75  36], 0);.  *nTru
14170 6e 63 20 3d 20 66 69 6e 53 69 7a 65 3b 0a 20 20  nc = finSize;.  
14180 61 73 73 65 72 74 28 20 66 69 6e 53 69 7a 65 21  assert( finSize!
14190 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
141a0 47 45 28 70 42 74 29 20 29 3b 0a 0a 61 75 74 6f  GE(pBt) );..auto
141b0 76 61 63 75 75 6d 5f 6f 75 74 3a 0a 20 20 61 73  vacuum_out:.  as
141c0 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
141d0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
141e0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66  (pPager) );.  if
141f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14200 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
14210 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
14220 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
14230 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
14240 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
14250 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
14260 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
14270 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ss..**.** This w
14280 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
14290 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
142a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
142b0 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
142c0 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
142d0 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
142e0 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
142f0 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
14300 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
14310 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
14320 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
14330 42 74 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  Bt;..  btreeInte
14340 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
14350 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
14360 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
14370 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
14380 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
14390 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
143a0 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
143b0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
143c0 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
143d0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
143e0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
143f0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
14400 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
14410 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
14420 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
14430 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
14440 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
14450 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
14460 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 70  te3PagerCommit(p
14470 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
14480 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14490 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
144a0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
144b0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
144c0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
144d0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
144e0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c  t = 0;.  }.  unl
144f0 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b  ockAllTables(p);
14500 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
14510 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e  ndle has any kin
14520 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
14530 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
14540 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14550 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74  .  ** count of t
14560 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
14570 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
14580 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65  ion count reache
14590 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68  s 0, set.  ** th
145a0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
145b0 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
145c0 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
145d0 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c  nused() call bel
145e0 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c  ow.  ** will unl
145f0 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20  ock the pager.. 
14600 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
14610 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
14620 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72   ){.    pBt->nTr
14630 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
14640 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
14650 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
14660 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
14670 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
14680 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
14690 20 2f 2a 20 53 65 74 20 74 68 65 20 68 61 6e 64   /* Set the hand
146a0 6c 65 73 20 63 75 72 72 65 6e 74 20 74 72 61 6e  les current tran
146b0 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
146c0 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
146d0 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20  unlock.  ** the 
146e0 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
146f0 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
14700 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
14710 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
14720 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  */.  p->inTrans 
14730 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
14740 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
14750 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
14760 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
14770 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14780 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  OK;.}..#ifndef N
14790 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
147a0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
147b0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f   write-cursors o
147c0 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64  pen on this hand
147d0 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20  le. This is for 
147e0 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  use.** in assert
147f0 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  () expressions, 
14800 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f  so it is only co
14810 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47  mpiled if NDEBUG
14820 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e   is not.** defin
14830 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
14840 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
14850 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
14860 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
14870 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
14880 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
14890 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
148a0 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
148b0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
148c0 72 2d 3e 77 72 46 6c 61 67 20 29 20 72 2b 2b 3b  r->wrFlag ) r++;
148d0 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
148e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
148f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
14900 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
14910 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
14920 0a 2a 2a 20 50 72 69 6e 74 20 64 65 62 75 67 67  .** Print debugg
14930 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
14940 61 62 6f 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  about all cursor
14950 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75  s to standard ou
14960 74 70 75 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tput..*/.void sq
14970 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
14980 4c 69 73 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  List(Btree *p){.
14990 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
149a0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
149b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 66 6f  t = p->pBt;.  fo
149c0 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
149d0 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
149e0 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
149f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
14a00 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
14a10 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20      char *zMode 
14a20 3d 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3f  = pCur->wrFlag ?
14a30 20 22 72 77 22 20 3a 20 22 72 6f 22 3b 0a 20 20   "rw" : "ro";.  
14a40 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
14a50 69 6e 74 66 28 22 43 55 52 53 4f 52 20 25 70 20  intf("CURSOR %p 
14a60 72 6f 6f 74 65 64 20 61 74 20 25 34 64 28 25 73  rooted at %4d(%s
14a70 29 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20 25  ) currently at %
14a80 64 2e 25 64 25 73 5c 6e 22 2c 0a 20 20 20 20 20  d.%d%s\n",.     
14a90 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 67    pCur, pCur->pg
14aa0 6e 6f 52 6f 6f 74 2c 20 7a 4d 6f 64 65 2c 0a 20  noRoot, zMode,. 
14ab0 20 20 20 20 20 20 70 50 61 67 65 20 3f 20 70 50        pPage ? pP
14ac0 61 67 65 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 70  age->pgno : 0, p
14ad0 43 75 72 2d 3e 69 64 78 2c 0a 20 20 20 20 20 20  Cur->idx,.      
14ae0 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d   (pCur->eState==
14af0 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 3f 20  CURSOR_VALID) ? 
14b00 22 22 20 3a 20 22 20 65 6f 66 22 0a 20 20 20 20  "" : " eof".    
14b10 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
14b20 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
14b30 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14b40 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
14b50 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
14b60 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
14b70 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
14b80 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
14b90 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
14ba0 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
14bb0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
14bc0 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
14bd0 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
14be0 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
14bf0 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
14c00 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
14c10 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
14c20 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
14c30 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
14c40 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
14c50 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
14c60 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
14c70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
14c80 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
14c90 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
14ca0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14cb0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
14cc0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
14cd0 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
14ce0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
14cf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14d00 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14d10 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  E.  if( rc!=SQLI
14d20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
14d30 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62  This is a horrib
14d40 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e  le situation. An
14d50 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   IO or malloc() 
14d60 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68  error occured wh
14d70 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
14d80 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
14d90 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
14da0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
14db0 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
14dc0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
14dd0 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
14de0 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
14df0 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
14e00 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
14e10 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
14e20 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
14e30 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
14e40 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
14e50 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
14e60 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
14e70 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
14e80 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
14e90 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
14ea0 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
14eb0 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
14ec0 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
14ed0 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
14ee0 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
14ef0 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
14f00 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
14f10 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
14f20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 2d 3e 70   pBt->pCursor->p
14f30 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a  Btree->pSqlite;.
14f40 20 20 20 20 20 20 69 66 28 20 64 62 20 29 7b 0a        if( db ){.
14f50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
14f60 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56  bortOtherActiveV
14f70 64 62 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  dbes(db, 0);.   
14f80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
14f90 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74  endif.  btreeInt
14fa0 65 67 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c  egrity(p);.  unl
14fb0 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b  ockAllTables(p);
14fc0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
14fd0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
14fe0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
14ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
15000 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
15010 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
15020 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
15030 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
15040 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
15050 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
15060 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
15070 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
15080 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
15090 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
150a0 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
150b0 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
150c0 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 67 65  o.    ** call ge
150d0 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
150e0 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 20  1 again to make 
150f0 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
15100 74 61 20 69 73 0a 20 20 20 20 2a 2a 20 73 65 74  ta is.    ** set
15110 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
15120 20 20 20 69 66 28 20 67 65 74 50 61 67 65 28 70     if( getPage(p
15130 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
15140 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
15150 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
15160 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
15170 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
15180 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
15190 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pBt)==0 );.    p
151a0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
151b0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
151c0 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e    }..  if( p->in
151d0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
151e0 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
151f0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
15200 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  on>0 );.    pBt-
15210 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
15220 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
15230 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
15240 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
15250 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
15260 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
15270 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  }..  p->inTrans 
15280 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
15290 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
152a0 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
152b0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20  Unused(pBt);..  
152c0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
152d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
152e0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
152f0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
15300 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68 65 20  ansaction.  The 
15310 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
15320 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  an.** can be rol
15330 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  led back indepen
15340 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
15350 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  in transaction..
15360 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  ** You must star
15370 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
15380 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
15390 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
153a0 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72 61 6e  ..** The subtran
153b0 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
153c0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69   automatically i
153d0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
153e0 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74  action.** commit
153f0 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
15400 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20  .**.** Only one 
15410 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  subtransaction m
15420 61 79 20 62 65 20 61 63 74 69 76 65 20 61 74 20  ay be active at 
15430 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73 20 61  a time.  It is a
15440 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a  n error to try.*
15450 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77  * to start a new
15460 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
15470 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62 74 72  if another subtr
15480 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
15490 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a  eady active..**.
154a0 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
154b0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
154c0 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
154d0 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
154e0 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
154f0 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
15500 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
15510 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
15520 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
15530 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
15540 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
15550 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
15560 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
15570 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
15580 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
15590 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
155a0 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
155b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
155c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
155d0 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
155e0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
155f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15600 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 28   p->pBt;.  if( (
15610 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
15620 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d  S_WRITE) || pBt-
15630 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 72  >inStmt ){.    r
15640 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f  eturn pBt->readO
15650 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
15660 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
15670 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65  RROR;.  }.  asse
15680 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
15690 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
156a0 49 54 45 20 29 3b 0a 20 20 72 63 20 3d 20 70 42  ITE );.  rc = pB
156b0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
156c0 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
156d0 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
156e0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
156f0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  pBt->inStmt = 1;
15700 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15710 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
15720 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74  he statment subt
15730 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
15740 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
15750 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74  .  If no.** subt
15760 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
15770 74 69 76 65 2c 20 74 68 69 73 20 69 73 20 61 20  tive, this is a 
15780 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
15790 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
157a0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  Stmt(Btree *p){.
157b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
157c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
157d0 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  Bt;.  if( pBt->i
157e0 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72  nStmt && !pBt->r
157f0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
15800 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15810 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e  StmtCommit(pBt->
15820 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
15830 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
15840 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  E_OK;.  }.  pBt-
15850 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 72  >inStmt = 0;.  r
15860 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15870 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
15880 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
15890 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
158a0 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73    If no subtrans
158b0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74  action.** is act
158c0 69 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ive this routine
158d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
158e0 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  ** All cursors w
158f0 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
15900 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
15910 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
15920 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63  pt.** to use a c
15930 75 72 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f  ursor that was o
15940 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
15950 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
15960 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72  ration.** will r
15970 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f  esult in an erro
15980 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
15990 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
159a0 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
159b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
159c0 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
159d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
159e0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 44 69 73  sqlite3MallocDis
159f0 61 6c 6c 6f 77 28 29 3b 0a 20 20 69 66 28 20 70  allow();.  if( p
15a00 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70  Bt->inStmt && !p
15a10 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
15a20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15a30 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63  PagerStmtRollbac
15a40 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
15a50 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
15a60 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42  tWriteCursors(pB
15a70 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  t)==0 );.    pBt
15a80 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
15a90 7d 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  }.  sqlite3Mallo
15aa0 63 41 6c 6c 6f 77 28 29 3b 0a 20 20 72 65 74 75  cAllow();.  retu
15ab0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15ac0 44 65 66 61 75 6c 74 20 6b 65 79 20 63 6f 6d 70  Default key comp
15ad0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
15ae0 74 6f 20 62 65 20 75 73 65 64 20 69 66 20 6e 6f  to be used if no
15af0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
15b00 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 70 65 63 69  tion.** is speci
15b10 66 69 65 64 20 6f 6e 20 74 68 65 20 73 71 6c 69  fied on the sqli
15b20 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 29  te3BtreeCursor()
15b30 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
15b40 20 69 6e 74 20 64 66 6c 74 43 6f 6d 70 61 72 65   int dfltCompare
15b50 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
15b60 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d,             /
15b70 2a 20 55 73 65 72 20 64 61 74 61 20 69 73 20 6e  * User data is n
15b80 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ot used */.  int
15b90 20 6e 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   n1, const void 
15ba0 2a 70 31 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  *p1,    /* First
15bb0 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
15bc0 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 63 6f 6e  */.  int n2, con
15bd0 73 74 20 76 6f 69 64 20 2a 70 32 20 20 20 20 20  st void *p2     
15be0 2f 2a 20 53 65 63 6f 6e 64 20 6b 65 79 20 74 6f  /* Second key to
15bf0 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 29 7b 0a 20   compare */.){. 
15c00 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 6d 65   int c;.  c = me
15c10 6d 63 6d 70 28 70 31 2c 20 70 32 2c 20 6e 31 3c  mcmp(p1, p2, n1<
15c20 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a 20  n2 ? n1 : n2);. 
15c30 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
15c40 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20   c = n1 - n2;.  
15c50 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  }.  return c;.}.
15c60 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
15c70 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
15c80 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
15c90 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
15ca0 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54  ge.** iTable.  T
15cb0 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72  he act of acquir
15cc0 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74  ing a cursor get
15cd0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
15ce0 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73   .** the databas
15cf0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
15d00 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
15d10 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
15d20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
15d30 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
15d40 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
15d50 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
15d60 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
15d70 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
15d80 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
15d90 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
15da0 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
15db0 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
15dc0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
15dd0 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
15de0 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
15df0 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
15e00 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
15e10 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
15e20 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
15e30 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
15e40 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
15e50 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
15e60 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
15e70 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
15e80 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
15e90 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
15ea0 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
15eb0 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
15ec0 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
15ed0 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
15ee0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
15ef0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
15f00 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
15f10 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
15f20 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
15f30 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
15f40 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
15f50 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
15f60 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
15f70 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
15f80 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
15f90 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
15fa0 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
15fb0 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
15fc0 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
15fd0 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
15fe0 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
15ff0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
16000 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
16010 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
16020 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
16030 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
16040 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
16050 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
16060 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
16070 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
16080 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
16090 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
160a0 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
160b0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
160c0 20 6c 6f 67 69 63 61 6c 6c 79 20 74 68 65 20 73   logically the s
160d0 61 6d 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ame for every cu
160e0 72 73 6f 72 0a 2a 2a 20 6f 6e 20 61 20 70 61 72  rsor.** on a par
160f0 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20  ticular table.  
16100 43 68 61 6e 67 69 6e 67 20 74 68 65 20 63 6f 6d  Changing the com
16110 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
16120 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
16130 69 6e 20 69 6e 63 6f 72 72 65 63 74 20 6f 70 65  in incorrect ope
16140 72 61 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65  rations.  If the
16150 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
16160 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 61 0a  tion is NULL, a.
16170 2a 2a 20 64 65 66 61 75 6c 74 20 63 6f 6d 70 61  ** default compa
16180 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  rison function i
16190 73 20 75 73 65 64 2e 20 20 54 68 65 20 63 6f 6d  s used.  The com
161a0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
161b0 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 69 67   is.** always ig
161c0 6e 6f 72 65 64 20 66 6f 72 20 49 4e 54 4b 45 59  nored for INTKEY
161d0 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20   tables..*/.int 
161e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
161f0 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
16230 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
16270 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
16280 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
162b0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
162c0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69  read-only */.  i
162d0 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a  nt (*xCmp)(void*
162e0 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
162f0 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
16300 29 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72  ), /* Key Compar
16310 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76  ison func */.  v
16320 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20  oid *pArg,      
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
16350 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
16360 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
16370 73 6f 72 20 2a 2a 70 70 43 75 72 20 20 20 20 20  sor **ppCur     
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
163a0 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
163b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
163c0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
163d0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
163e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 2a  t = p->pBt;..  *
163f0 70 70 43 75 72 20 3d 20 30 3b 0a 20 20 69 66 28  ppCur = 0;.  if(
16400 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69   wrFlag ){.    i
16410 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
16420 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16430 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
16440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16450 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
16460 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a  , iTable, 0) ){.
16470 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16480 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
16490 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74  }.  }..  if( pBt
164a0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20  ->pPage1==0 ){. 
164b0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65     rc = lockBtre
164c0 65 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20  eWithRetry(p);. 
164d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
164e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
164f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
16500 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69   }.  pCur = sqli
16510 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
16520 28 2a 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  (*pCur) );.  if(
16530 20 70 43 75 72 3d 3d 30 20 29 7b 0a 20 20 20 20   pCur==0 ){.    
16540 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
16550 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  M;.    goto crea
16560 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
16570 69 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ion;.  }.  pCur-
16580 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
16590 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  o)iTable;.  if( 
165a0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 73 71 6c  iTable==1 && sql
165b0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
165c0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
165d0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
165e0 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20  QLITE_EMPTY;.   
165f0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72   goto create_cur
16600 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20  sor_exception;. 
16610 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
16620 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
16630 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
16640 43 75 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a  Cur->pPage, 0);.
16650 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16660 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
16670 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
16680 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ception;.  }..  
16690 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
166a0 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
166b0 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
166c0 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
166d0 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
166e0 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63  bles, link the c
166f0 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
16700 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64  tShared list and
16710 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65   set *ppCur (the
16720 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67  .  ** output arg
16730 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
16740 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20  nction)..  */.  
16750 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d  pCur->xCompare =
16760 20 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64   xCmp ? xCmp : d
16770 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  fltCompare;.  pC
16780 75 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b  ur->pArg = pArg;
16790 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
167a0 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46  = p;.  pCur->wrF
167b0 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20  lag = wrFlag;.  
167c0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
167d0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
167e0 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
167f0 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
16800 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
16810 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
16820 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
16830 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
16840 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 2a 70  OR_INVALID;.  *p
16850 70 43 75 72 20 3d 20 70 43 75 72 3b 0a 0a 20 20  pCur = pCur;..  
16860 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16870 3b 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  ;.create_cursor_
16880 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 69 66 28  exception:.  if(
16890 20 70 43 75 72 20 29 7b 0a 20 20 20 20 72 65 6c   pCur ){.    rel
168a0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70  easePage(pCur->p
168b0 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Page);.    sqlit
168c0 65 46 72 65 65 28 70 43 75 72 29 3b 0a 20 20 7d  eFree(pCur);.  }
168d0 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
168e0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72  Unused(pBt);.  r
168f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
16900 20 30 20 20 2f 2a 20 4e 6f 74 20 55 73 65 64 20   0  /* Not Used 
16910 2a 2f 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  */./*.** Change 
16920 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
16930 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
16940 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 20 63  tion used by a c
16950 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ursor..*/.void s
16960 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 6f  qlite3BtreeSetCo
16970 6d 70 61 72 65 28 0a 20 20 42 74 43 75 72 73 6f  mpare(.  BtCurso
16980 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20  r *pCur,     /* 
16990 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 77 68  The cursor to wh
169a0 6f 73 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  ose comparison f
169b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 68 61 6e 67  unction is chang
169c0 65 64 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 6d  ed */.  int(*xCm
169d0 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  p)(void*,int,con
169e0 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
169f0 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4e 65  st void*), /* Ne
16a00 77 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  w comparison fun
16a10 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  c */.  void *pAr
16a20 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  g          /* Fi
16a30 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
16a40 78 43 6d 70 28 29 20 2a 2f 0a 29 7b 0a 20 20 70  xCmp() */.){.  p
16a50 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20  Cur->xCompare = 
16a60 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66  xCmp ? xCmp : df
16a70 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75  ltCompare;.  pCu
16a80 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a  r->pArg = pArg;.
16a90 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16aa0 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20  Close a cursor. 
16ab0 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f   The read lock o
16ac0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
16ad0 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a  ile is released.
16ae0 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
16af0 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
16b00 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
16b10 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
16b20 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
16b30 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
16b40 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  Bt = pCur->pBtre
16b50 65 2d 3e 70 42 74 3b 0a 20 20 72 65 73 74 6f 72  e->pBt;.  restor
16b60 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
16b70 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b  sition(pCur, 0);
16b80 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72  .  if( pCur->pPr
16b90 65 76 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ev ){.    pCur->
16ba0 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
16bb0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  Cur->pNext;.  }e
16bc0 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43  lse{.    pBt->pC
16bd0 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
16be0 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
16bf0 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
16c00 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
16c10 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72  Prev = pCur->pPr
16c20 65 76 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ev;.  }.  releas
16c30 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
16c40 65 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65  e);.  unlockBtre
16c50 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
16c60 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75    sqliteFree(pCu
16c70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
16c80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16c90 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72   Make a temporar
16ca0 79 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c  y cursor by fill
16cb0 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64  ing in the field
16cc0 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a  s of pTempCur..*
16cd0 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * The temporary 
16ce0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e  cursor is not on
16cf0 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74   the cursor list
16d00 20 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a   for the Btree..
16d10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
16d20 65 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43  etTempCursor(BtC
16d30 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43  ursor *pCur, BtC
16d40 75 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29  ursor *pTempCur)
16d50 7b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70  {.  memcpy(pTemp
16d60 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f  Cur, pCur, sizeo
16d70 66 28 2a 70 43 75 72 29 29 3b 0a 20 20 70 54 65  f(*pCur));.  pTe
16d80 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30  mpCur->pNext = 0
16d90 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50  ;.  pTempCur->pP
16da0 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rev = 0;.  if( p
16db0 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 20 29  TempCur->pPage )
16dc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
16dd0 65 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e  erRef(pTempCur->
16de0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
16df0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
16e00 6c 65 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  lete a temporary
16e10 20 63 75 72 73 6f 72 20 73 75 63 68 20 61 73 20   cursor such as 
16e20 77 61 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  was made by the 
16e30 43 72 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43  CreateTemporaryC
16e40 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74  ursor().** funct
16e50 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  ion above..*/.st
16e60 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
16e70 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  eTempCursor(BtCu
16e80 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
16e90 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  f( pCur->pPage )
16ea0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
16eb0 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50  erUnref(pCur->pP
16ec0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
16ed0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
16ee0 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
16ef0 6f 72 2e 69 6e 66 6f 20 66 69 65 6c 64 20 6f 66  or.info field of
16f00 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
16f10 72 20 69 73 20 76 61 6c 69 64 2e 0a 2a 2a 20 49  r is valid..** I
16f20 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
16f30 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 20  ady valid, call 
16f40 70 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  parseCell() to f
16f50 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
16f60 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
16f70 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
16f80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
16f90 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
16fa0 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
16fb0 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
16fc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
16fd0 73 20 74 6f 20 70 61 72 73 65 43 65 6c 6c 28 29  s to parseCell()
16fe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16ff0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
17000 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
17010 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
17020 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Size==0 ){.    p
17030 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70  arseCell(pCur->p
17040 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
17050 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
17060 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20   }else{.#ifndef 
17070 4e 44 45 42 55 47 0a 20 20 20 20 43 65 6c 6c 49  NDEBUG.    CellI
17080 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65  nfo info;.    me
17090 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
170a0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
170b0 20 20 70 61 72 73 65 43 65 6c 6c 28 70 43 75 72    parseCell(pCur
170c0 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  ->pPage, pCur->i
170d0 64 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  dx, &info);.    
170e0 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26  assert( memcmp(&
170f0 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
17100 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
17110 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==0 );.#endif.  
17120 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  }.}../*.** Set *
17130 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
17140 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
17150 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
17160 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
17170 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
17180 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
17190 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
171a0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
171b0 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
171c0 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
171d0 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
171e0 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
171f0 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
17200 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
17210 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
17220 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
17230 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
17240 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
17250 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17260 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
17270 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
17280 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Size){.  int rc 
17290 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
172a0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
172b0 43 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72  Cur, 1);.  if( r
172c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
172d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
172e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
172f0 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
17300 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
17310 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
17320 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
17330 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
17340 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
17350 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
17360 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
17370 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
17380 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
17390 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  o.nKey;.    }.  
173a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
173b0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
173c0 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
173d0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
173e0 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
173f0 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
17400 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
17410 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
17420 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
17430 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
17440 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20  ssible.  If the 
17450 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75  cursor is not cu
17460 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
17470 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  ing to an entry 
17480 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65  (which can happe
17490 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
174a0 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  if.** the databa
174b0 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65  se is empty) the
174c0 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  n *pSize is set 
174d0 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  to 0..*/.int sql
174e0 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
174f0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
17500 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
17510 20 69 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72   int rc = restor
17520 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
17530 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b  sition(pCur, 1);
17540 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17550 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
17560 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
17570 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
17580 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
17590 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
175a0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
175b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
175c0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
175d0 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  /* Not pointing 
175e0 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  at a valid entry
175f0 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f   - set *pSize to
17600 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53   0. */.      *pS
17610 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
17620 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
17630 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
17640 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
17650 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  ->info.nData;.  
17660 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17670 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
17680 61 64 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  ad payload infor
17690 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
176a0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
176b0 43 75 72 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a  Cur cursor is.**
176c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 42   pointing to.  B
176d0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 65  egin reading the
176e0 20 70 61 79 6c 6f 61 64 20 61 74 20 22 6f 66 66   payload at "off
176f0 73 65 74 22 20 61 6e 64 20 72 65 61 64 0a 2a 2a  set" and read.**
17700 20 61 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   a total of "amt
17710 22 20 62 79 74 65 73 2e 20 20 50 75 74 20 74 68  " bytes.  Put th
17720 65 20 72 65 73 75 6c 74 20 69 6e 20 7a 42 75 66  e result in zBuf
17730 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
17740 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  tine does not ma
17750 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e  ke a distinction
17760 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64   between key and
17770 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73   data..** It jus
17780 74 20 72 65 61 64 73 20 62 79 74 65 73 20 66 72  t reads bytes fr
17790 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61  om the payload a
177a0 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74  rea.  Data might
177b0 20 61 70 70 65 61 72 0a 2a 2a 20 6f 6e 20 74 68   appear.** on th
177c0 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62  e main page or b
177d0 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
177e0 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
177f0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2f 0a 73  flow pages..*/.s
17800 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 79  tatic int getPay
17810 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
17820 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
17830 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
17840 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
17850 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f   from */.  int o
17860 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
17870 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
17880 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
17890 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20  ayload */.  int 
178a0 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
178b0 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
178c0 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
178d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
178e0 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
178f0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
17900 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
17910 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20   skipKey        
17920 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67 69    /* offset begi
17930 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ns at data if th
17940 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
17950 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
17960 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 50 67   *aPayload;.  Pg
17970 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 69  no nextPage;.  i
17980 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
17990 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 53 68 61   *pPage;.  BtSha
179a0 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20  red *pBt;.  int 
179b0 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20  ovflSize;.  u32 
179c0 6e 4b 65 79 3b 0a 0a 20 20 61 73 73 65 72 74 28  nKey;..  assert(
179d0 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
179e0 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
179f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
17a00 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
17a10 49 44 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 43  ID );.  pBt = pC
17a20 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b  ur->pBtree->pBt;
17a30 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
17a40 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
17a50 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
17a60 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
17a70 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65  e->nCell );.  ge
17a80 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
17a90 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
17aa0 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b  ur->info.pCell +
17ab0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
17ac0 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  der;.  if( pPage
17ad0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
17ae0 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nKey = 0;.  }els
17af0 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70 43  e{.    nKey = pC
17b00 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
17b10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
17b20 73 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  set>=0 );.  if( 
17b30 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f  skipKey ){.    o
17b40 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20  ffset += nKey;. 
17b50 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b   }.  if( offset+
17b60 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d  amt > nKey+pCur-
17b70 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20  >info.nData ){. 
17b80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17b90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
17ba0 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
17bb0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
17bc0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
17bd0 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
17be0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
17bf0 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
17c00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
17c10 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
17c20 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
17c30 2c 20 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  , &aPayload[offs
17c40 65 74 5d 2c 20 61 29 3b 0a 20 20 20 20 69 66 28  et], a);.    if(
17c50 20 61 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 20   a==amt ){.     
17c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17c70 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 66 66  K;.    }.    off
17c80 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
17c90 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
17ca0 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
17cb0 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
17cc0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
17cd0 20 20 7d 0a 20 20 6f 76 66 6c 53 69 7a 65 20 3d    }.  ovflSize =
17ce0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
17cf0 20 2d 20 34 3b 0a 20 20 69 66 28 20 61 6d 74 3e   - 4;.  if( amt>
17d00 30 20 29 7b 0a 20 20 20 20 6e 65 78 74 50 61 67  0 ){.    nextPag
17d10 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
17d20 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
17d30 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 20 20 20 20  o.nLocal]);.    
17d40 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20  while( amt>0 && 
17d50 6e 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20  nextPage ){.    
17d60 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
17d70 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e;.      rc = sq
17d80 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
17d90 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
17da0 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  age, &pDbPage);.
17db0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
17dc0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
17dd0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
17de0 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
17df0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
17e00 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
17e10 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
17e20 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29  t4byte(aPayload)
17e30 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ;.      if( offs
17e40 65 74 3c 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  et<ovflSize ){. 
17e50 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
17e60 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mt;.        if( 
17e70 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
17e80 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
17e90 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
17ea0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
17eb0 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63    }.        memc
17ec0 70 79 28 70 42 75 66 2c 20 26 61 50 61 79 6c 6f  py(pBuf, &aPaylo
17ed0 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 61 29  ad[offset+4], a)
17ee0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
17ef0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 6d   = 0;.        am
17f00 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
17f10 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
17f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17f30 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
17f40 7a 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ze;.      }.    
17f50 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
17f60 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
17f70 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61    }.  }..  if( a
17f80 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
17f90 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
17fa0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
17fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17fc0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
17fd0 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73  rt of the key as
17fe0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
17ff0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
18000 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
18010 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
18020 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
18030 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
18040 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
18050 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
18060 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
18070 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
18080 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
18090 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
180a0 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
180b0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
180c0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
180d0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
180e0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
180f0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
18100 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
18110 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
18120 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
18130 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
18140 69 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65  int rc = restore
18150 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
18160 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a  ition(pCur, 1);.
18170 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18180 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
18190 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
181a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
181b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
181c0 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20  r->pPage!=0 );. 
181d0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61     if( pCur->pPa
181e0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
181f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18200 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18210 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
18220 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  ( pCur->pPage->i
18230 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20  ntKey==0 );.    
18240 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
18250 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
18260 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
18270 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
18280 20 67 65 74 50 61 79 6c 6f 61 64 28 70 43 75 72   getPayload(pCur
18290 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
182a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
182b0 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
182c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
182d0 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
182e0 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61  the data associa
182f0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
18300 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
18310 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
18320 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
18330 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
18340 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
18350 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
18360 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
18370 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
18380 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
18390 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
183a0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
183b0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
183c0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
183d0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
183e0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
183f0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
18400 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18410 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72  reeData(BtCursor
18420 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
18430 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
18440 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
18450 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
18460 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
18470 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69 66  n(pCur, 1);.  if
18480 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18490 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
184a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
184b0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
184c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
184d0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Page!=0 );.    a
184e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
184f0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
18500 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
18510 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
18520 67 65 74 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  getPayload(pCur,
18530 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
18540 75 66 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 1);.  }.  re
18550 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18560 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
18570 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
18580 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
18590 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
185a0 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
185b0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
185c0 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
185d0 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
185e0 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
185f0 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
18600 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
18610 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18620 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
18630 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
18640 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
18650 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
18660 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
18670 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
18680 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
18690 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
186a0 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
186b0 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
186c0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
186d0 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
186e0 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
186f0 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
18700 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
18710 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
18720 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
18730 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
18740 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
18750 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
18760 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
18770 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
18780 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
18790 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
187a0 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
187b0 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
187c0 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
187d0 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
187e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
187f0 20 74 68 65 6e 20 67 65 74 50 61 79 6c 6f 61 64   then getPayload
18800 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
18810 74 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a  to reassembly.**
18820 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
18830 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
18840 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
18850 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
18860 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
18870 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
18880 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
18890 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
188a0 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
188b0 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
188c0 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
188d0 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
188e0 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
188f0 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
18900 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
18910 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
18920 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  har *fetchPayloa
18930 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
18940 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
18950 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
18960 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
18970 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d  om */.  int *pAm
18980 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
18990 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
189a0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
189b0 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tes here */.  in
189c0 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20  t skipKey       
189d0 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e     /* read begin
189e0 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20  ning at data if 
189f0 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
18a00 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
18a10 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
18a20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
18a30 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e    u32 nKey;.  in
18a40 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73  t nLocal;..  ass
18a50 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
18a60 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
18a70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
18a80 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
18a90 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61 67  _VALID );.  pPag
18aa0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
18ab0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
18ac0 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
18ad0 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
18ae0 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
18af0 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
18b00 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
18b10 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
18b20 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
18b30 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
18b40 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
18b50 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
18b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
18b70 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
18b80 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
18b90 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
18ba0 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
18bb0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
18bc0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
18bd0 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
18be0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
18bf0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
18c00 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e      if( nLocal>n
18c10 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f  Key ){.      nLo
18c20 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  cal = nKey;.    
18c30 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  }.  }.  *pAmt = 
18c40 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
18c50 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f   aPayload;.}.../
18c60 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
18c70 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
18c80 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
18c90 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
18ca0 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
18cb0 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
18cc0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
18cd0 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
18ce0 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
18cf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
18d00 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
18d10 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
18d20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
18d30 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
18d40 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
18d50 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
18d60 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
18d70 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
18d80 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
18d90 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
18da0 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
18db0 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
18dc0 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
18dd0 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
18de0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
18df0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
18e00 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
18e10 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
18e20 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
18e30 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
18e40 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
18e50 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
18e60 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
18e70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f  {.    return (co
18e80 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
18e90 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
18ea0 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
18eb0 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76  urn 0;.}.const v
18ec0 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
18ed0 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
18ee0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
18ef0 70 41 6d 74 29 7b 0a 20 20 69 66 28 20 70 43 75  pAmt){.  if( pCu
18f00 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
18f10 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
18f20 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
18f30 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
18f40 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
18f50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18f60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
18f70 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
18f80 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
18f90 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
18fa0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
18fb0 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
18fc0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
18fd0 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f  e to move to..*/
18fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
18ff0 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
19000 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
19010 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
19020 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
19030 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
19040 70 4f 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68  pOldPage;.  BtSh
19050 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
19060 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a  ->pBtree->pBt;..
19070 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
19080 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
19090 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 67  ALID );.  rc = g
190a0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
190b0 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
190c0 77 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 50 61  wPage, pCur->pPa
190d0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
190e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 4e 65  return rc;.  pNe
190f0 77 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  wPage->idxParent
19100 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20   = pCur->idx;.  
19110 70 4f 6c 64 50 61 67 65 20 3d 20 70 43 75 72 2d  pOldPage = pCur-
19120 3e 70 50 61 67 65 3b 0a 20 20 70 4f 6c 64 50 61  >pPage;.  pOldPa
19130 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30  ge->idxShift = 0
19140 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
19150 70 4f 6c 64 50 61 67 65 29 3b 0a 20 20 70 43 75  pOldPage);.  pCu
19160 72 2d 3e 70 50 61 67 65 20 3d 20 70 4e 65 77 50  r->pPage = pNewP
19170 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78  age;.  pCur->idx
19180 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
19190 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
191a0 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43  if( pNewPage->nC
191b0 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74  ell<1 ){.    ret
191c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
191d0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
191e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
191f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
19200 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
19210 65 20 69 73 20 74 68 65 20 76 69 72 74 75 61 6c  e is the virtual
19220 20 72 6f 6f 74 20 6f 66 20 69 74 73 20 74 61 62   root of its tab
19230 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69  le..**.** The vi
19240 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
19250 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
19260 20 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65 73   for most tables
19270 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74 68  .  But.** for th
19280 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 6f  e table rooted o
19290 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d 65 74 69  n page 1, someti
192a0 6d 65 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  me the real root
192b0 20 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74   page.** is empt
192c0 79 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  y except for the
192d0 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e 20   right-pointer. 
192e0 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 20 74   In such cases t
192f0 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f  he.** virtual ro
19300 6f 74 20 70 61 67 65 20 69 73 20 74 68 65 20 70  ot page is the p
19310 61 67 65 20 74 68 61 74 20 74 68 65 20 72 69 67  age that the rig
19320 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70 61  ht-pointer of pa
19330 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e 74  ge.** 1 is point
19340 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ing to..*/.stati
19350 63 20 69 6e 74 20 69 73 52 6f 6f 74 50 61 67 65  c int isRootPage
19360 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
19370 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
19380 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
19390 61 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61  arent;.  if( pPa
193a0 72 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  rent==0 ) return
193b0 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e   1;.  if( pParen
193c0 74 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75  t->pgno>1 ) retu
193d0 72 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32  rn 0;.  if( get2
193e0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
193f0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
19400 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29  rOffset+3])==0 )
19410 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
19420 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
19430 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
19440 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
19450 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
19460 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
19470 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
19480 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
19490 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
194a0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
194b0 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
194c0 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
194d0 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
194e0 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
194f0 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
19500 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
19510 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
19520 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
19530 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
19540 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
19550 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
19560 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
19570 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  nt;.  MemPage *p
19580 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50  Page;.  int idxP
19590 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  arent;..  assert
195a0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
195b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
195c0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
195d0 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
195e0 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61   pPage!=0 );.  a
195f0 73 73 65 72 74 28 20 21 69 73 52 6f 6f 74 50 61  ssert( !isRootPa
19600 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70  ge(pPage) );.  p
19610 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
19620 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72  pParent;.  asser
19630 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29 3b  t( pParent!=0 );
19640 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20 70  .  idxParent = p
19650 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b  Page->idxParent;
19660 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  .  sqlite3PagerR
19670 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
19680 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
19690 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43  age(pPage);.  pC
196a0 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61 72  ur->pPage = pPar
196b0 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ent;.  pCur->inf
196c0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61  o.nSize = 0;.  a
196d0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
196e0 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20  idxShift==0 );. 
196f0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78   pCur->idx = idx
19700 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Parent;.}../*.**
19710 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
19720 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
19730 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
19740 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
19750 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
19760 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
19770 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19780 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
19790 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  pBt = pCur->pBtr
197a0 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 72 65 73 74  ee->pBt;..  rest
197b0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
197c0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 30  Position(pCur, 0
197d0 29 3b 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  );.  pRoot = pCu
197e0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
197f0 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e  pRoot && pRoot->
19800 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
19810 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Root ){.    asse
19820 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
19830 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
19840 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c    if( .      SQL
19850 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65  ITE_OK!=(rc = ge
19860 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
19870 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
19880 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20  , &pRoot, 0)).  
19890 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d    ){.      pCur-
198a0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
198b0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
198c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
198d0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
198e0 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
198f0 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
19900 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43   pRoot;.  }.  pC
19910 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70  ur->idx = 0;.  p
19920 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
19930 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  = 0;.  if( pRoot
19940 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70  ->nCell==0 && !p
19950 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
19960 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
19970 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
19980 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  t->pgno==1 );.  
19990 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
199a0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
199b0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
199c0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
199d0 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29  ert( subpage>0 )
199e0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
199f0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
19a00 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
19a10 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
19a20 62 70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43  bpage);.  }.  pC
19a30 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
19a40 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
19a50 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
19a60 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
19a70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19a80 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
19a90 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
19aa0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
19ab0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
19ac0 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
19ad0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
19ae0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
19af0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
19b00 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
19b10 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
19b20 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
19b30 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
19b40 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
19b50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
19b60 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
19b70 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
19b80 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
19b90 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
19ba0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
19bb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19bc0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
19bd0 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
19be0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e  = pCur->pPage)->
19bf0 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
19c00 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
19c10 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
19c20 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
19c30 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
19c40 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
19c50 2c 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20  , pCur->idx));. 
19c60 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
19c70 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
19c80 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
19c90 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
19ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
19cc0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
19cd0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
19ce0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
19cf0 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
19d00 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
19d10 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
19d20 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
19d30 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
19d40 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
19d50 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
19d60 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
19d70 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
19d80 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
19d90 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
19da0 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
19db0 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
19dc0 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
19dd0 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
19de0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
19df0 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
19e00 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
19e10 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
19e20 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
19e30 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
19e40 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
19e50 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
19e60 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
19e70 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
19e80 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
19e90 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
19ea0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
19eb0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
19ec0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19ed0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
19ee0 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d  while( !(pPage =
19ef0 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
19f00 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
19f10 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
19f20 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
19f30 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
19f40 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70     pCur->idx = p
19f50 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
19f60 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
19f70 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
19f80 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
19f90 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
19fa0 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
19fb0 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 70 43 75  nCell - 1;.  pCu
19fc0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
19fd0 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
19fe0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
19ff0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
1a000 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
1a010 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
1a020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
1a030 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
1a040 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
1a050 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
1a060 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
1a070 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
1a080 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
1a090 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1a0a0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
1a0b0 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
1a0c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1a0d0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1a0e0 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65   rc;.  rc = move
1a0f0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1a100 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a110 72 63 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  rc;.  if( pCur->
1a120 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1a130 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73  NVALID ){.    as
1a140 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1a150 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
1a160 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1a170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a180 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
1a190 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
1a1a0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 2a 70 52 65  Cell>0 );.  *pRe
1a1b0 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f  s = 0;.  rc = mo
1a1c0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1a1d0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1a1e0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
1a1f0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
1a200 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1a210 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
1a220 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
1a230 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
1a240 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
1a250 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
1a260 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
1a270 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
1a280 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
1a290 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
1a2a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a2b0 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
1a2c0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1a2d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  ){.  int rc;.  r
1a2e0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1a2f0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
1a300 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
1a310 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1a320 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1a330 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1a340 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1a350 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ==0 );.    *pRes
1a360 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1a370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1a380 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a390 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1a3a0 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20  ALID );.  *pRes 
1a3b0 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  = 0;.  rc = move
1a3c0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
1a3d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a3e0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1a3f0 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
1a400 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
1a410 74 72 79 20 6e 65 61 72 20 70 4b 65 79 2f 6e 4b  try near pKey/nK
1a420 65 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ey..** Return a 
1a430 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
1a440 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
1a450 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20  ables, only the 
1a460 6e 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  nKey parameter i
1a470 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73  s used.  pKey is
1a480 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f  .** ignored.  Fo
1a490 72 20 6f 74 68 65 72 20 74 61 62 6c 65 73 2c 20  r other tables, 
1a4a0 6e 4b 65 79 20 69 73 20 74 68 65 20 6e 75 6d 62  nKey is the numb
1a4b0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
1a4c0 61 74 61 0a 2a 2a 20 69 6e 20 70 4b 65 79 2e 20  ata.** in pKey. 
1a4d0 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
1a4e0 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69  function specifi
1a4f0 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 73  ed when the curs
1a500 6f 72 20 77 61 73 0a 2a 2a 20 63 72 65 61 74 65  or was.** create
1a510 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  d is used to com
1a520 70 61 72 65 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  pare keys..**.**
1a530 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
1a540 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
1a550 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1a560 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
1a570 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1a580 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
1a590 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
1a5a0 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
1a5b0 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
1a5c0 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
1a5d0 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
1a5e0 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
1a5f0 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
1a600 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
1a610 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
1a620 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
1a630 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
1a640 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 63 75 72  which the.** cur
1a650 73 6f 72 20 69 73 20 77 72 69 74 74 65 6e 20 74  sor is written t
1a660 6f 20 2a 70 52 65 73 20 69 66 20 70 52 65 73 21  o *pRes if pRes!
1a670 3d 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e  =NULL.  The mean
1a680 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76  ing of.** this v
1a690 61 6c 75 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f  alue is as follo
1a6a0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
1a6b0 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
1a6c0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
1a6d0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1a6e0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
1a700 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65 79  maller than pKey
1a710 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
1a720 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
1a740 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
1a750 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
1a760 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
1a770 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1a780 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
1a790 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1a7a0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1a7b0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1a7c0 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
1a7d0 20 6d 61 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a   matches pKey..*
1a7e0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
1a7f0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
1a800 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1a810 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
1a820 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1a830 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
1a840 20 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2f 0a 69   than pKey..*/.i
1a850 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
1a860 6f 76 65 74 6f 28 42 74 43 75 72 73 6f 72 20 2a  oveto(BtCursor *
1a870 70 43 75 72 2c 20 63 6f 6e 73 74 20 76 6f 69 64  pCur, const void
1a880 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
1a890 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1a8a0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 74 72  int rc;.  int tr
1a8b0 79 52 69 67 68 74 6d 6f 73 74 3b 0a 20 20 72 63  yRightmost;.  rc
1a8c0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1a8d0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
1a8e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73  return rc;.  ass
1a8f0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1a900 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1a910 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69  ur->pPage->isIni
1a920 74 20 29 3b 0a 20 20 74 72 79 52 69 67 68 74 6d  t );.  tryRightm
1a930 6f 73 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  ost = pCur->pPag
1a940 65 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 69 66 28  e->intKey;.  if(
1a950 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1a960 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
1a970 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b  .    *pRes = -1;
1a980 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1a990 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
1a9a0 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1a9b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1a9c0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
1a9d0 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20  nt lwr, upr;.   
1a9e0 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
1a9f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1aa00 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1aa10 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20      int c = -1; 
1aa20 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20   /* pRes return 
1aa30 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  if table is empt
1aa40 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a  y must be -1 */.
1aa50 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
1aa60 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
1aa70 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 21  ell-1;.    if( !
1aa80 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
1aa90 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20   pKey==0 ){.    
1aaa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1aab0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1aac0 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 6c    }.    while( l
1aad0 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 20  wr<=upr ){.     
1aae0 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
1aaf0 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c  .      i64 nCell
1ab00 4b 65 79 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  Key;.      pCur-
1ab10 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29  >idx = (lwr+upr)
1ab20 2f 32 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  /2;.      pCur->
1ab30 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1ab40 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1ab50 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
1ab60 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
1ab70 20 20 20 20 20 20 69 66 28 20 74 72 79 52 69 67        if( tryRig
1ab80 68 74 6d 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  htmost ){.      
1ab90 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1aba0 75 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  upr;.        }. 
1abb0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
1abc0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1abd0 43 75 72 2d 3e 69 64 78 29 20 2b 20 70 50 61 67  Cur->idx) + pPag
1abe0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
1abf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1ac00 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
1ac10 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d           u32 dum
1ac20 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  my;.          pC
1ac30 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ell += getVarint
1ac40 33 32 28 70 43 65 6c 6c 2c 20 26 64 75 6d 6d 79  32(pCell, &dummy
1ac50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ac60 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
1ac70 43 65 6c 6c 2c 20 28 75 36 34 20 2a 29 26 6e 43  Cell, (u64 *)&nC
1ac80 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1ac90 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b   if( nCellKey<nK
1aca0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1acb0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1acc0 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
1acd0 65 79 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  ey>nKey ){.     
1ace0 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
1acf0 20 20 20 20 20 20 20 74 72 79 52 69 67 68 74 6d         tryRightm
1ad00 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ost = 0;.       
1ad10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ad20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
1ad30 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1ad40 20 20 20 20 20 20 20 20 69 6e 74 20 61 76 61 69          int avai
1ad50 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70  lable;.        p
1ad60 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20  CellKey = (void 
1ad70 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
1ad80 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c  Cur, &available,
1ad90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65   0);.        nCe
1ada0 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e  llKey = pCur->in
1adb0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
1adc0 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d   if( available>=
1add0 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20  nCellKey ){.    
1ade0 20 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d 3e        c = pCur->
1adf0 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e 70  xCompare(pCur->p
1ae00 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70  Arg, nCellKey, p
1ae10 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  CellKey, nKey, p
1ae20 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
1ae30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
1ae40 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
1ae50 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 43 65 6c 6c  MallocRaw( nCell
1ae60 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
1ae70 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
1ae80 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1ae90 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1aea0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1aeb0 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
1aec0 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20  nCellKey, (void 
1aed0 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  *)pCellKey);.   
1aee0 20 20 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d         c = pCur-
1aef0 3e 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e  >xCompare(pCur->
1af00 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  pArg, nCellKey, 
1af10 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20  pCellKey, nKey, 
1af20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  pKey);.         
1af30 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 65 6c   sqliteFree(pCel
1af40 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
1af50 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1af60 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1af70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1af80 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
1af90 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1afa0 44 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e  Data && !pPage->
1afb0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
1afc0 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64    lwr = pCur->id
1afd0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  x;.          upr
1afe0 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20   = lwr - 1;.    
1aff0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b000 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b010 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
1b020 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1b030 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b040 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1b050 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1b060 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
1b070 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69     lwr = pCur->i
1b080 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
1b090 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
1b0a0 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b 0a 20 20   pCur->idx-1;.  
1b0b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b0c0 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
1b0d0 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
1b0e0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
1b0f0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1b100 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1b110 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20  chldPg = 0;.    
1b120 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70  }else if( lwr>=p
1b130 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
1b140 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
1b150 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1b160 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1b170 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
1b180 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
1b190 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
1b1a0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
1b1b0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  r));.    }.    i
1b1c0 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a  f( chldPg==0 ){.
1b1d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1b1e0 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
1b1f0 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50  ur->idx<pCur->pP
1b200 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1b210 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
1b220 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
1b230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
1b250 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20  ->idx = lwr;.   
1b260 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1b270 65 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  e = 0;.    rc = 
1b280 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1b290 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
1b2a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
1b2b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b2c0 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41    }.  /* NOT REA
1b2d0 43 48 45 44 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  CHED */.}../*.**
1b2e0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1b2f0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1b300 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1b310 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
1b320 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
1b330 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1b340 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
1b350 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1b360 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
1b370 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
1b380 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
1b390 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1b3a0 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
1b3b0 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
1b3c0 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
1b3d0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
1b3e0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1b3f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b400 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
1b410 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
1b420 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
1b430 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
1b440 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1b450 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
1b460 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
1b470 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
1b480 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
1b490 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
1b4a0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
1b4b0 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
1b4c0 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
1b4d0 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
1b4e0 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
1b4f0 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
1b500 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
1b510 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
1b520 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
1b530 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1b540 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
1b550 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
1b560 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
1b570 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
1b580 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
1b590 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
1b5a0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
1b5b0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
1b5c0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1b5d0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
1b5e0 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
1b5f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1b600 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1b610 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1b620 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
1b630 65 20 2a 70 50 61 67 65 3b 0a 0a 23 69 66 6e 64  e *pPage;..#ifnd
1b640 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1b650 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 72 63  HARED_CACHE.  rc
1b660 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
1b670 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
1b680 70 43 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20  pCur, 1);.  if( 
1b690 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b6a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1b6b0 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
1b6c0 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20 70 43  skip>0 ){.    pC
1b6d0 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20  ur->skip = 0;.  
1b6e0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1b6f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b700 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
1b710 6b 69 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20  kip = 0;.#endif 
1b720 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ..  assert( pRes
1b730 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  !=0 );.  pPage =
1b740 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1b750 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
1b760 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
1b770 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1b780 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1b790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1b7a0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1b7b0 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
1b7c0 28 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  ( pCur->idx<pPag
1b7d0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70  e->nCell );..  p
1b7e0 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 70 43  Cur->idx++;.  pC
1b7f0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1b800 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
1b810 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
1b820 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
1b830 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1b840 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1b850 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
1b860 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1b870 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1b880 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
1b890 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1b8a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1b8b0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1b8c0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1b8d0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1b8e0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
1b8f0 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 52  o{.      if( isR
1b900 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29  ootPage(pPage) )
1b910 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
1b920 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
1b930 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1b940 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
1b950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b960 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1b970 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
1b980 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
1b990 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1b9a0 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  e;.    }while( p
1b9b0 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d  Cur->idx>=pPage-
1b9c0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
1b9d0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
1b9e0 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
1b9f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1ba00 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
1ba10 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
1ba20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1ba30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ba40 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
1ba50 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
1ba60 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
1ba70 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
1ba80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ba90 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
1baa0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1bab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1bac0 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
1bad0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
1bae0 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
1baf0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
1bb00 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
1bb10 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
1bb20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
1bb30 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
1bb40 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
1bb50 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
1bb60 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1bb70 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
1bb80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1bb90 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
1bba0 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
1bbb0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
1bbc0 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
1bbd0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1bbe0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1bbf0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d  Pgno pgno;.  Mem
1bc00 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 23 69  Page *pPage;..#i
1bc10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bc20 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1bc30 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
1bc40 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
1bc50 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69  on(pCur, 1);.  i
1bc60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bc70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1bc80 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
1bc90 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20  r->skip<0 ){.   
1bca0 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1bcb0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
1bcc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bcd0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
1bce0 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 23 65 6e 64  ->skip = 0;.#end
1bcf0 69 66 0a 0a 20 20 69 66 28 20 43 55 52 53 4f 52  if..  if( CURSOR
1bd00 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1bd10 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
1bd20 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
1bd30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bd40 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
1bd50 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
1bd60 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
1bd70 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
1bd80 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a  pCur->idx>=0 );.
1bd90 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1bda0 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1bdb0 20 67 65 74 34 62 79 74 65 28 20 66 69 6e 64 43   get4byte( findC
1bdc0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
1bdd0 3e 69 64 78 29 20 29 3b 0a 20 20 20 20 72 63 20  >idx) );.    rc 
1bde0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1bdf0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
1be00 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1be10 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  c;.    rc = move
1be20 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
1be30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1be40 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78  while( pCur->idx
1be50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
1be60 20 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67   isRootPage(pPag
1be70 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  e) ){.        pC
1be80 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1be90 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1bea0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1beb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1bec0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1bed0 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
1bee0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
1bef0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1bf00 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a 20 20 20  pPage;.    }.   
1bf10 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20   pCur->idx--;.  
1bf20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1bf30 7a 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ze = 0;.    if( 
1bf40 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
1bf50 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
1bf60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1bf70 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
1bf80 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
1bf90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bfa0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bfb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52  .    }.  }.  *pR
1bfc0 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  es = 0;.  return
1bfd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
1bfe0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
1bff0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
1c000 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1c010 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
1c020 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
1c030 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
1c040 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
1c050 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
1c060 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
1c070 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
1c080 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
1c090 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
1c0a0 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
1c0b0 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
1c0c0 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
1c0d0 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
1c0e0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
1c0f0 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
1c100 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
1c110 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
1c120 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1c130 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
1c140 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
1c150 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
1c160 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
1c170 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50   *ppPage and *pP
1c180 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65  gno are undefine
1c190 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
1c1a0 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44  f an error..** D
1c1b0 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c  o not invoke sql
1c1c0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
1c1d0 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61   on *ppPage if a
1c1e0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
1c1f0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
1c200 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d  e "nearby" param
1c210 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
1c220 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65  hen a (feeble) e
1c230 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
1c240 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61   .** locate a pa
1c250 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  ge close to the 
1c260 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61  page number "nea
1c270 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20  rby".  This can 
1c280 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a  be used in an.**
1c290 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70   attempt to keep
1c2a0 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63   related pages c
1c2b0 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68  lose to each oth
1c2c0 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
1c2d0 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63  se file,.** whic
1c2e0 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61  h in turn can ma
1c2f0 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ke database acce
1c300 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ss faster..**.**
1c310 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20   If the "exact" 
1c320 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
1c330 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65   0, and the page
1c340 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65  -number nearby e
1c350 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65  xists .** anywhe
1c360 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
1c370 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
1c380 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65  guarenteed to be
1c390 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
1c3a0 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ** is only used 
1c3b0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  by auto-vacuum d
1c3c0 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c  atabases when al
1c3d0 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74  locating a new t
1c3e0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1c3f0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
1c400 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
1c410 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61  d *pBt, .  MemPa
1c420 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20  ge **ppPage, .  
1c430 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20  Pgno *pPgno, .  
1c440 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75  Pgno nearby,.  u
1c450 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d  8 exact.){.  Mem
1c460 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
1c470 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b  int rc;.  int n;
1c480 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c490 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
1c4a0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  reelist */.  int
1c4b0 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
1c4c0 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
1c4d0 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
1c4e0 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
1c4f0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
1c500 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1c510 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20  revTrunk = 0;.. 
1c520 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
1c530 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74  Page1;.  n = get
1c540 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1c550 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28  Data[36]);.  if(
1c560 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
1c570 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
1c580 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
1c590 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
1c5a0 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
1c5b0 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
1c5c0 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
1c5d0 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
1c5e0 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
1c5f0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
1c600 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
1c610 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65      /* If the 'e
1c620 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20  xact' parameter 
1c630 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71  was true and a q
1c640 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
1c650 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
1c660 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
1c670 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
1c680 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
1c690 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
1c6a0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
1c6b0 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
1c6c0 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
1c6d0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
1c6e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c6f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1c700 20 69 66 28 20 65 78 61 63 74 20 29 7b 0a 20 20   if( exact ){.  
1c710 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
1c720 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
1c730 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  by>0 );.      as
1c740 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
1c750 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72  acuum );.      r
1c760 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1c770 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
1c780 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
1c790 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1c7a0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1c7b0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
1c7c0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61  E ){.        sea
1c7d0 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
1c7e0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e     }.      *pPgn
1c7f0 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  o = nearby;.    
1c800 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
1c810 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
1c820 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
1c830 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
1c840 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
1c850 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
1c860 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
1c870 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
1c880 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
1c890 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1c8a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1c8b0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
1c8c0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1c8d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1c8e0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1c8f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
1c900 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
1c910 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
1c920 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
1c930 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
1c940 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
1c950 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
1c960 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
1c970 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
1c980 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
1c990 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
1c9a0 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
1c9b0 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
1c9c0 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e  rby' is located.
1c9d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
1c9e0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
1c9f0 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
1ca00 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
1ca10 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75   ){.        iTru
1ca20 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
1ca30 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
1ca40 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
1ca50 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  e{.        iTrun
1ca60 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
1ca70 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
1ca80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ca90 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
1caa0 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
1cab0 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  k, 0);.      if(
1cac0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
1cad0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
1cae0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1caf0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1cb00 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   }..      k = ge
1cb10 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
1cb20 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
1cb30 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
1cb40 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
1cb50 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
1cb60 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
1cb70 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
1cb80 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
1cb90 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
1cba0 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
1cbb0 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
1cbc0 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
1cbd0 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
1cbe0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
1cbf0 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
1cc00 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
1cc10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
1cc20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1cc30 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1cc40 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1cc50 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1cc60 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1cc70 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1cc80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
1cc90 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
1cca0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1ccb0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1ccc0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1ccd0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1cce0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
1ccf0 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
1cd00 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
1cd10 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1cd20 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
1cd30 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
1cd40 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
1cd50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1cd60 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ( k>pBt->usableS
1cd70 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
1cd80 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
1cd90 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
1cda0 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
1cdb0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1cdc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1cdd0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1cde0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1cdf0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
1ce00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ce10 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1ce20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
1ce30 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62  rchList && nearb
1ce40 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20  y==iTrunk ){.   
1ce50 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
1ce60 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
1ce70 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
1ce80 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
1ce90 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
1cea0 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
1ceb0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
1cec0 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
1ced0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1cee0 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
1cef0 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20  o==iTrunk );.   
1cf00 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
1cf10 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
1cf20 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
1cf30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1cf40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
1cf50 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1cf60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1cf70 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1cf80 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1cf90 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1cfa0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
1cfb0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1cfc0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
1cfd0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1cfe0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
1cff0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
1d000 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1d010 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d020 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1d030 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
1d040 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
1d050 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1d060 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d080 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
1d090 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
1d0a0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
1d0b0 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
1d0c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
1d0d0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
1d0e0 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
1d0f0 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
1d100 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
1d110 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
1d120 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
1d130 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d140 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
1d150 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
1d160 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
1d170 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
1d180 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
1d190 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
1d1a0 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
1d1b0 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
1d1c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
1d1d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d1e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d1f0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1d200 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1d210 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
1d220 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1d230 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
1d240 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1d250 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d270 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1d280 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
1d290 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1d2a0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1d2b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d2c0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1d2d0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1d2e0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
1d2f0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1d300 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1d310 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1d320 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
1d330 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
1d340 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
1d350 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1d360 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
1d370 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1d380 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
1d390 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1d3a0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
1d3b0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1d3c0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1d3d0 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
1d3e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1d3f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1d400 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d410 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
1d420 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1d430 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
1d440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1d450 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1d460 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1d470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d480 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
1d490 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
1d4a0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
1d4b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d4c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
1d4d0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1d4e0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1d4f0 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
1d500 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
1d510 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
1d520 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
1d530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d540 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
1d550 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
1d560 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1d570 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
1d580 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
1d590 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
1d5a0 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
1d5b0 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
1d5c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1d5d0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1d5e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1d5f0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1d600 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1d610 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1d620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d630 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
1d640 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1d650 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  i, dist;.       
1d660 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
1d670 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
1d680 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1d690 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  [8]) - nearby;. 
1d6a0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73           if( dis
1d6b0 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69  t<0 ) dist = -di
1d6c0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
1d6d0 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
1d6e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
1d6f0 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28  t d2 = get4byte(
1d700 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
1d710 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
1d720 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20       if( d2<0 ) 
1d730 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20  d2 = -d2;.      
1d740 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
1d750 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
1d760 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
1d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
1d780 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
1d790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d7a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1d7b0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
1d7c0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
1d7d0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
1d7e0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
1d7f0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
1d800 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
1d810 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50  searchList || iP
1d820 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age==nearby ){. 
1d830 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
1d840 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
1d850 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 73 71     if( *pPgno>sq
1d860 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1d870 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
1d880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d890 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66 66  /* Free page off
1d8a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1d8b0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
1d8c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d8d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1d8e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d8f0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1d900 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
1d910 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
1d920 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
1d930 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
1d940 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
1d950 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d960 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
1d970 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
1d980 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
1d990 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
1d9a0 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
1d9b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1d9c0 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
1d9d0 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
1d9e0 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
1d9f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1da00 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
1da10 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
1da20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
1da30 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
1da40 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  age, 1);.       
1da50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1da60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1da70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1da80 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
1da90 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1dab0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1dac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1dad0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
1dae0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1daf0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1db00 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
1db10 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
1db20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1db30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
1db40 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
1db50 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
1db60 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
1db70 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
1db80 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
1db90 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
1dba0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
1dbb0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
1dbc0 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a  ge at the.    **
1dbd0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1dbe0 20 2a 2f 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d   */.    *pPgno =
1dbf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1dc00 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1dc10 65 72 29 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65  er) + 1;..#ifnde
1dc20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1dc30 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1dc40 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1dc50 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
1dc60 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29  E(pBt, *pPgno) )
1dc70 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
1dc80 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
1dc90 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1dca0 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
1dcb0 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
1dcc0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
1dcd0 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
1dce0 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
1dcf0 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
1dd00 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
1dd10 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
1dd20 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
1dd30 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
1dd40 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
1dd50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52 41      */.      TRA
1dd60 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1dd70 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
1dd80 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
1dd90 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f  page)\n", *pPgno
1dda0 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
1ddb0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
1ddc0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1ddd0 20 29 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e   );.      (*pPgn
1dde0 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  o)++;.    }.#end
1ddf0 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
1de00 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
1de10 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1de20 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  ;.    rc = getPa
1de30 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
1de40 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  ppPage, 0);.    
1de50 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1de60 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
1de70 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
1de80 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
1de90 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1dea0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1deb0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
1dec0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
1ded0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1dee0 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
1def0 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
1df00 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
1df10 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
1df20 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1df30 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
1df40 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
1df50 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
1df60 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
1df70 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
1df80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1df90 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f  .** Add a page o
1dfa0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1dfb0 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ile to the freel
1dfc0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ist..**.** sqlit
1dfd0 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69  e3PagerUnref() i
1dfe0 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72  s NOT called for
1dff0 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
1e000 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d  c int freePage(M
1e010 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
1e020 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1e030 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1e040 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
1e050 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1e060 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a   int rc, n, k;..
1e070 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65    /* Prepare the
1e080 20 70 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e   page for freein
1e090 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  g */.  assert( p
1e0a0 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a  Page->pgno>1 );.
1e0b0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
1e0c0 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  = 0;.  releasePa
1e0d0 67 65 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  ge(pPage->pParen
1e0e0 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50 61  t);.  pPage->pPa
1e0f0 72 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  rent = 0;..  /* 
1e100 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
1e110 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
1e120 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
1e130 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1e140 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
1e150 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
1e160 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20   return rc;.  n 
1e170 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1e180 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1e190 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1e1a0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
1e1b0 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  +1);..#ifdef SQL
1e1c0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
1e1d0 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51  E.  /* If the SQ
1e1e0 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
1e1f0 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TE compile-time 
1e200 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
1e210 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77  d, then.  ** alw
1e220 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
1e230 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
1e240 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
1e250 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  os..  */.  rc = 
1e260 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e270 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1e280 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1e290 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65  turn rc;.  memse
1e2a0 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
1e2b0 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
1e2c0 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66  ageSize);.#endif
1e2d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e2e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1e2f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
1e300 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
1e310 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
1e320 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
1e330 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
1e340 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
1e350 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
1e360 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
1e370 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1e380 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   ){.    rc = ptr
1e390 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61 67  mapPut(pBt, pPag
1e3a0 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  e->pgno, PTRMAP_
1e3b0 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20  FREEPAGE, 0);.  
1e3c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1e3d0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
1e3e0 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a  ..  if( n==0 ){.
1e3f0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
1e400 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
1e410 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ge */.    rc = s
1e420 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e430 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
1e440 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1e450 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65  eturn rc;.    me
1e460 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
1e470 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75  a, 0, 8);.    pu
1e480 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1e490 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65  aData[32], pPage
1e4a0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41  ->pgno);.    TRA
1e4b0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
1e4c0 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61  %d first\n", pPa
1e4d0 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65  ge->pgno));.  }e
1e4e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65  lse{.    /* Othe
1e4f0 72 20 66 72 65 65 20 70 61 67 65 73 20 61 6c 72  r free pages alr
1e500 65 61 64 79 20 65 78 69 73 74 2e 20 20 52 65 74  eady exist.  Ret
1e510 72 69 76 65 20 74 68 65 20 66 69 72 73 74 20 74  rive the first t
1e520 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a  runk page.    **
1e530 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
1e540 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f   and find out ho
1e550 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74  w many leaves it
1e560 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d   has. */.    Mem
1e570 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20  Page *pTrunk;.  
1e580 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
1e590 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  Bt, get4byte(&pP
1e5a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
1e5b0 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
1e5c0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1e5d0 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67  rn rc;.    k = g
1e5e0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
1e5f0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
1e600 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62  if( k>=pBt->usab
1e610 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
1e620 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
1e630 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54 75 72  nk is full.  Tur
1e640 6e 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  n the page being
1e650 20 66 72 65 65 64 20 69 6e 74 6f 20 61 20 6e 65   freed into a ne
1e660 77 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b  w.      ** trunk
1e670 20 70 61 67 65 20 77 69 74 68 20 6e 6f 20 6c 65   page with no le
1e680 61 76 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  aves. */.      r
1e690 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e6a0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
1e6b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
1e6c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1e6d0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1e6e0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54  pPage->aData, pT
1e6f0 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  runk->pgno);.   
1e700 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1e710 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
1e720 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1e730 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1e740 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  32], pPage->pgno
1e750 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  );.      TRACE((
1e760 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
1e770 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
1e780 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20  placing %d\n",. 
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
1e7a0 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b  ge->pgno, pTrunk
1e7b0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  ->pgno));.    }e
1e7c0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  lse{.      /* Ad
1e7d0 64 20 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65  d the newly free
1e7e0 64 20 70 61 67 65 20 61 73 20 61 20 6c 65 61 66  d page as a leaf
1e7f0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
1e800 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72  trunk */.      r
1e810 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e820 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1e830 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
1e840 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1e850 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1e860 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1e870 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20  4], k+1);.      
1e880 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
1e890 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20  ->aData[8+k*4], 
1e8a0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69  pPage->pgno);.#i
1e8b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  fndef SQLITE_SEC
1e8c0 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  URE_DELETE.     
1e8d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1e8e0 74 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  tWrite(pBt->pPag
1e8f0 65 72 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  er, pPage->pgno)
1e900 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 54  ;.#endif.      T
1e910 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
1e920 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
1e930 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
1e940 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
1e950 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  ->pgno));.    }.
1e960 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1e970 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72  pTrunk);.  }.  r
1e980 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e990 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72  ** Free any over
1e9a0 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
1e9b0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
1e9c0 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74  iven Cell..*/.st
1e9d0 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
1e9e0 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
1e9f0 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
1ea00 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68   *pCell){.  BtSh
1ea10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
1ea20 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e  e->pBt;.  CellIn
1ea30 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20  fo info;.  Pgno 
1ea40 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
1ea50 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
1ea60 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61 67 65 53  .  int ovflPageS
1ea70 69 7a 65 3b 0a 0a 20 20 70 61 72 73 65 43 65 6c  ize;..  parseCel
1ea80 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
1ea90 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
1eaa0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
1eab0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1eac0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
1ead0 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
1eae0 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
1eaf0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
1eb00 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
1eb10 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1eb20 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
1eb30 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61 67  low]);.  ovflPag
1eb40 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
1eb50 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
1eb60 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
1eb70 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
1eb80 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
1eb90 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
1eba0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
1ebb0 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
1ebc0 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
1ebd0 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
1ebe0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
1ebf0 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
1ec00 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e  no==0 || ovflPgn
1ec10 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o>sqlite3PagerPa
1ec20 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1ec30 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ger) ){.      re
1ec40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1ec50 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1ec60 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65      rc = getPage
1ec70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
1ec80 26 70 4f 76 66 6c 2c 20 30 29 3b 0a 20 20 20 20  &pOvfl, 0);.    
1ec90 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1eca0 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 4f 76 66  rc;.    if( nOvf
1ecb0 6c 20 29 7b 0a 20 20 20 20 20 20 6f 76 66 6c 50  l ){.      ovflP
1ecc0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
1ecd0 4f 76 66 6c 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Ovfl->aData);.  
1ece0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 72 65    }.    rc = fre
1ecf0 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
1ed00 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1ed10 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
1ed20 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1ed30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
1ed40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ed50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
1ed60 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
1ed70 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
1ed80 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
1ed90 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
1eda0 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
1edb0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
1edc0 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
1edd0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
1ede0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
1edf0 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
1ee00 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
1ee10 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
1ee20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
1ee30 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
1ee40 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
1ee50 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
1ee60 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
1ee70 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
1ee80 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
1ee90 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
1eea0 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
1eeb0 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
1eec0 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
1eed0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
1eee0 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
1eef0 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
1ef00 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
1ef10 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
1ef20 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
1ef30 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
1ef40 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
1ef50 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
1ef60 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
1ef70 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
1ef80 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
1ef90 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
1efa0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1efb0 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
1efc0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
1efd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
1efe0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
1eff0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
1f000 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
1f010 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
1f020 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
1f030 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
1f040 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
1f050 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a   data */.  int *
1f060 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
1f070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1f080 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
1f090 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
1f0a0 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
1f0b0 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
1f0c0 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
1f0d0 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
1f0e0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
1f0f0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1f100 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
1f110 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1f120 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
1f130 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
1f140 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
1f150 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1f160 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
1f170 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
1f180 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  der;.  CellInfo 
1f190 69 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  info;..  /* Fill
1f1a0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
1f1b0 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
1f1c0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
1f1d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
1f1e0 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
1f1f0 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
1f200 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
1f210 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
1f220 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
1f230 6e 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 7b  nData);.  }else{
1f240 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a  .    nData = 0;.
1f250 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
1f260 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
1f270 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
1f280 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 70 61 72  4*)&nKey);.  par
1f290 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
1f2a0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1f2b0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
1f2c0 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
1f2d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
1f2e0 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
1f2f0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
1f300 44 61 74 61 3d 3d 6e 44 61 74 61 20 29 3b 0a 20  Data==nData );. 
1f310 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
1f320 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  he payload */.  
1f330 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
1f340 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
1f350 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
1f360 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
1f370 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
1f380 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
1f390 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  lse{.    nPayloa
1f3a0 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70  d += nKey;.    p
1f3b0 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
1f3c0 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d  nSrc = nKey;.  }
1f3d0 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
1f3e0 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
1f3f0 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
1f400 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
1f410 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
1f420 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
1f430 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
1f440 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
1f450 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
1f460 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
1f470 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
1f480 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1f490 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
1f4a0 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
1f4b0 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
1f4c0 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
1f4d0 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
1f4e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
1f4f0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1f500 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
1f510 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
1f520 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
1f530 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f540 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
1f550 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
1f560 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
1f570 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
1f580 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
1f590 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
1f5a0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
1f5b0 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
1f5c0 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
1f5d0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1f5e0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
1f5f0 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 54 68 65  at page now. The
1f600 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
1f610 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
1f620 67 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  ge will be.     
1f630 20 2a 2a 20 61 64 64 65 64 20 6c 61 74 65 72 2c   ** added later,
1f640 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65   by the insertCe
1f650 6c 6c 28 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20  ll() routine..  
1f660 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1f670 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1f680 20 26 26 20 70 67 6e 6f 50 74 72 6d 61 70 21 3d   && pgnoPtrmap!=
1f690 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
1f6a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1f6b0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
1f6c0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d  , pgnoOvfl, PTRM
1f6d0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 70 67  AP_OVERFLOW2, pg
1f6e0 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20  noPtrmap);.     
1f6f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1f700 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1f710 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
1f720 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
1f730 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f740 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
1f750 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
1f760 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
1f770 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
1f780 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
1f790 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
1f7a0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
1f7b0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
1f7c0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
1f7d0 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
1f7e0 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
1f7f0 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
1f800 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
1f810 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
1f820 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d  4;.    }.    n =
1f830 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69   nPayload;.    i
1f840 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29  f( n>spaceLeft )
1f850 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a   n = spaceLeft;.
1f860 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
1f870 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 61   n = nSrc;.    a
1f880 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
1f890 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
1f8a0 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
1f8b0 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
1f8c0 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
1f8d0 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
1f8e0 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
1f8f0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
1f900 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
1f910 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
1f920 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
1f930 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
1f940 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
1f950 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
1f960 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
1f970 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1f980 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d 65  ** Change the Me
1f990 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70 6f  mPage.pParent po
1f9a0 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61 67  inter on the pag
1f9b0 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20 69  e whose number i
1f9c0 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  s.** given in th
1f9d0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1f9e0 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61 67  t so that MemPag
1f9f0 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  e.pParent holds 
1fa00 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69  the.** pointer i
1fa10 6e 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  n the third argu
1fa20 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1fa30 69 6e 74 20 72 65 70 61 72 65 6e 74 50 61 67 65  int reparentPage
1fa40 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1fa50 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61  Pgno pgno, MemPa
1fa60 67 65 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20  ge *pNewParent, 
1fa70 69 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d 50  int idx){.  MemP
1fa80 61 67 65 20 2a 70 54 68 69 73 3b 0a 20 20 44 62  age *pThis;.  Db
1fa90 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
1faa0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 50 61    assert( pNewPa
1fab0 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  rent!=0 );.  if(
1fac0 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72   pgno==0 ) retur
1fad0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  n SQLITE_OK;.  a
1fae0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
1faf0 65 72 21 3d 30 20 29 3b 0a 20 20 70 44 62 50 61  er!=0 );.  pDbPa
1fb00 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
1fb10 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61  rLookup(pBt->pPa
1fb20 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
1fb30 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
1fb40 20 70 54 68 69 73 20 3d 20 28 4d 65 6d 50 61 67   pThis = (MemPag
1fb50 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
1fb60 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
1fb70 29 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69 73  );.    if( pThis
1fb80 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
1fb90 20 20 61 73 73 65 72 74 28 20 70 54 68 69 73 2d    assert( pThis-
1fba0 3e 61 44 61 74 61 3d 3d 28 73 71 6c 69 74 65 33  >aData==(sqlite3
1fbb0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
1fbc0 50 61 67 65 29 29 20 29 3b 0a 20 20 20 20 20 20  Page)) );.      
1fbd0 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65  if( pThis->pPare
1fbe0 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20 29  nt!=pNewParent )
1fbf0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
1fc00 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20 73  his->pParent ) s
1fc10 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1fc20 28 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d  (pThis->pParent-
1fc30 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1fc40 20 20 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e     pThis->pParen
1fc50 74 20 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a  t = pNewParent;.
1fc60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1fc70 61 67 65 72 52 65 66 28 70 4e 65 77 50 61 72 65  agerRef(pNewPare
1fc80 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
1fc90 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 68 69      }.      pThi
1fca0 73 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 69  s->idxParent = i
1fcb0 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dx;.    }.    sq
1fcc0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1fcd0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 23  pDbPage);.  }..#
1fce0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fcf0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1fd00 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1fd10 75 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72  uum ){.    retur
1fd20 6e 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  n ptrmapPut(pBt,
1fd30 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
1fd40 52 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d  REE, pNewParent-
1fd50 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64  >pgno);.  }.#end
1fd60 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
1fd70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
1fd80 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 50 61  * Change the pPa
1fd90 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  rent pointer of 
1fda0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
1fdb0 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 62  pPage to point b
1fdc0 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e  ack.** to pPage.
1fdd0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
1fde0 77 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72 79  words, for every
1fdf0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2c   child of pPage,
1fe00 20 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e 74   invoke reparent
1fe10 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b  Page().** to mak
1fe20 65 20 73 75 72 65 20 74 68 61 74 20 65 61 63 68  e sure that each
1fe30 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61   child knows tha
1fe40 74 20 70 50 61 67 65 20 69 73 20 69 74 73 20 70  t pPage is its p
1fe50 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  arent..**.** Thi
1fe60 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
1fe70 61 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75 20  alled after you 
1fe80 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61 67  memcpy() one pag
1fe90 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65  e into.** anothe
1fea0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1feb0 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
1fec0 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ges(MemPage *pPa
1fed0 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ge){.  int i;.  
1fee0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1fef0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
1ff00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ff10 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ;..  if( pPage->
1ff20 6c 65 61 66 20 29 20 72 65 74 75 72 6e 20 53 51  leaf ) return SQ
1ff30 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28  LITE_OK;..  for(
1ff40 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
1ff50 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
1ff60 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1ff70 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
1ff80 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1ff90 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
1ffa0 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70  = reparentPage(p
1ffb0 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65  Bt, get4byte(pCe
1ffc0 6c 6c 29 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a  ll), pPage, i);.
1ffd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ffe0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1fff0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
20000 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
20010 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  f ){.    rc = re
20020 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20  parentPage(pBt, 
20030 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
20040 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
20050 72 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20  rOffset+8]), .  
20060 20 20 20 20 20 70 50 61 67 65 2c 20 69 29 3b 0a       pPage, i);.
20070 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68      pPage->idxSh
20080 69 66 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ift = 0;.  }.  r
20090 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
200a0 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
200b0 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
200c0 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
200d0 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
200e0 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
200f0 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
20100 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
20110 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
20120 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
20130 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
20140 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
20150 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
20160 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
20170 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
20180 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
20190 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
201a0 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
201b0 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
201c0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
201d0 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
201e0 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
201f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
20200 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b  nt idx, int sz){
20210 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
20220 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
20230 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
20240 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
20250 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
20260 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
20270 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
20280 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
20290 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
202a0 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
202b0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
202c0 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
202d0 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
202e0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
202f0 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
20300 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
20310 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  t( sz==cellSize(
20320 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
20330 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20340 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
20350 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
20360 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
20370 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
20380 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
20390 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
203a0 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
203b0 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61 73 73  byte(ptr);.  ass
203c0 65 72 74 28 20 70 63 3e 31 30 20 26 26 20 70 63  ert( pc>10 && pc
203d0 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz<=pPage->pBt-
203e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
203f0 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
20400 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f 72  , pc, sz);.  for
20410 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67  (i=idx+1; i<pPag
20420 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70  e->nCell; i++, p
20430 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b  tr+=2){.    ptr[
20440 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20  0] = ptr[2];.   
20450 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d   ptr[1] = ptr[3]
20460 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
20470 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79  Cell--;.  put2by
20480 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
20490 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50  hdrOffset+3], pP
204a0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
204b0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
204c0 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68  ;.  pPage->idxSh
204d0 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ift = 1;.}../*.*
204e0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
204f0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
20500 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
20510 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
20520 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
20530 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
20540 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
20550 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
20560 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
20570 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
20580 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
20590 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
205a0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
205b0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
205c0 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
205d0 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
205e0 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
205f0 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
20600 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
20610 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d  n pPage->aOvfl[]
20620 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
20630 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
20640 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
20650 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
20660 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
20670 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
20680 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
20690 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
206a0 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
206b0 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
206c0 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
206d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
206e0 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
206f0 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f  * If nSkip is no
20700 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20  n-zero, then do 
20710 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72  not copy the fir
20720 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
20730 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54  f the.** cell. T
20740 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
20750 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66  verwrite them af
20760 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
20770 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a  n returns. If.**
20780 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
20790 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d  ro, then pCell m
207a0 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  ay not point to 
207b0 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72  an invalid memor
207c0 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28  y location .** (
207d0 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20  but pCell+nSkip 
207e0 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29  is always valid)
207f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20800 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
20810 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
20820 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
20830 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
20840 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
20850 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
20860 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
20870 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
20880 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
20890 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
208a0 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
208b0 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
208c0 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
208d0 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
208e0 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
208f0 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
20900 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
20910 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
20920 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
20930 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20  /.  u8 nSkip    
20940 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
20950 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  write the first 
20960 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74  nSkip bytes of t
20970 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20  he cell */.){.  
20980 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20  int idx;        
20990 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
209a0 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
209b0 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
209c0 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
209d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
209e0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  unter */.  int t
209f0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
20a00 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f  First byte of co
20a10 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65  ntent for any ce
20a20 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ll in data[] */.
20a30 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
20a40 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
20a50 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
20a60 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
20a70 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
20a80 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
20a90 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
20aa0 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
20ab0 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
20ac0 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ted */.  int hdr
20ad0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
20ae0 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d  fset into data[]
20af0 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65 61   of the page hea
20b00 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  der */.  int cel
20b10 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
20b20 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
20b30 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
20b40 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
20b50 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
20b60 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
20b70 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
20b80 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
20b90 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72       /* Used for
20ba0 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74   moving informat
20bb0 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61  ion around in da
20bc0 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ta[] */..  asser
20bd0 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
20be0 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
20bf0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
20c00 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
20c10 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
20c20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  pCell) );.  asse
20c30 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
20c40 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
20c50 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
20c60 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
20c70 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
20c80 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
20c90 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
20ca0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
20cb0 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e  p+nSkip, pCell+n
20cc0 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
20cd0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  .      pCell = p
20ce0 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Temp;.    }.    
20cf0 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
20d00 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
20d10 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61  rt( j<sizeof(pPa
20d20 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f  ge->aOvfl)/sizeo
20d30 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
20d40 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ]) );.    pPage-
20d50 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20  >aOvfl[j].pCell 
20d60 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61  = pCell;.    pPa
20d70 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78  ge->aOvfl[j].idx
20d80 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65 2d   = i;.    pPage-
20d90 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  >nFree = 0;.  }e
20da0 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20  lse{.    data = 
20db0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
20dc0 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
20dd0 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f  drOffset;.    to
20de0 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
20df0 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
20e00 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
20e10 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
20e20 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66      end = cellOf
20e30 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
20e40 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69  nCell + 2;.    i
20e50 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
20e60 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65  + 2*i;.    if( e
20e70 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b  nd > top - sz ){
20e80 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
20e90 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
20ea0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
20eb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20ec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20ed0 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
20ee0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
20ef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e        assert( en
20f00 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b  d + sz <= top );
20f10 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d  .    }.    idx =
20f20 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
20f30 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61  Page, sz);.    a
20f40 73 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a  ssert( idx>0 );.
20f50 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20      assert( end 
20f60 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74  <= get2byte(&dat
20f70 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20  a[hdr+5]) );.   
20f80 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b   pPage->nCell++;
20f90 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
20fa0 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63  e -= 2;.    memc
20fb0 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b  py(&data[idx+nSk
20fc0 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  ip], pCell+nSkip
20fd0 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
20fe0 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74   for(j=end-2, pt
20ff0 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e  r=&data[j]; j>in
21000 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29  s; j-=2, ptr-=2)
21010 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d  {.      ptr[0] =
21020 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20   ptr[-2];.      
21030 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d  ptr[1] = ptr[-1]
21040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32  ;.    }.    put2
21050 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c  byte(&data[ins],
21060 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62   idx);.    put2b
21070 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
21080 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
21090 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53  .    pPage->idxS
210a0 68 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64 65  hift = 1;.#ifnde
210b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
210c0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
210d0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
210e0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
210f0 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
21100 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
21110 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
21120 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
21130 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
21140 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
21150 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
21160 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
21170 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
21180 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
21190 3b 0a 20 20 20 20 20 20 70 61 72 73 65 43 65 6c  ;.      parseCel
211a0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
211b0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
211c0 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e   assert( (info.n
211d0 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
211e0 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
211f0 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  )==info.nPayload
21200 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
21210 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
21220 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
21230 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63  nKey))>info.nLoc
21240 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  al ){.        Pg
21250 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65  no pgnoOvfl = ge
21260 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
21270 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
21280 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
21290 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
212a0 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  ->pBt, pgnoOvfl,
212b0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
212c0 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  1, pPage->pgno);
212d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
212e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
212f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
21300 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
21310 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
21320 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
21330 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
21340 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
21350 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
21360 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
21370 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
21380 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
21390 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
213a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
213b0 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
213c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
213d0 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
213e0 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
213f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
21400 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
21410 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
21420 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
21430 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
21440 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
21450 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
21460 64 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  dies */.  int *a
21470 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
21480 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
21490 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
214a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
214b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
214c0 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20   int totalSize; 
214d0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
214e0 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f   of all cells */
214f0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
21500 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
21510 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
21520 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20    int cellptr;  
21530 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
21540 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e  f next cell poin
21550 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ter */.  int cel
21560 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64  lbody;     /* Ad
21570 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
21580 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20  ll body */.  u8 
21590 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
215a0 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 70  * Data for the p
215b0 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
215c0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
215d0 6f 77 3d 3d 30 20 29 3b 0a 20 20 74 6f 74 61 6c  ow==0 );.  total
215e0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Size = 0;.  for(
215f0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
21600 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a  +){.    totalSiz
21610 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  e += aSize[i];. 
21620 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74   }.  assert( tot
21630 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d  alSize+2*nCell<=
21640 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a  pPage->nFree );.
21650 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
21660 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63  >nCell==0 );.  c
21670 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d 3e  ellptr = pPage->
21680 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61  cellOffset;.  da
21690 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
216a0 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
216b0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 70  ->hdrOffset;.  p
216c0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
216d0 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20  r+3], nCell);.  
216e0 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  if( nCell ){.   
216f0 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f   cellbody = allo
21700 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
21710 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20   totalSize);.   
21720 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64   assert( cellbod
21730 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  y>0 );.    asser
21740 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  t( pPage->nFree 
21750 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20  >= 2*nCell );.  
21760 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
21770 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66  = 2*nCell;.    f
21780 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
21790 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75 74   i++){.      put
217a0 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
217b0 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  ptr], cellbody);
217c0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64  .      memcpy(&d
217d0 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61  ata[cellbody], a
217e0 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b  pCell[i], aSize[
217f0 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70  i]);.      cellp
21800 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63  tr += 2;.      c
21810 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65  ellbody += aSize
21820 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  [i];.    }.    a
21830 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d  ssert( cellbody=
21840 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
21850 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20  bleSize );.  }. 
21860 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
21870 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nCell;.}../*.** 
21880 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  The following pa
21890 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69  rameters determi
218a0 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61  ne how many adja
218b0 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69  cent pages get i
218c0 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20  nvolved.** in a 
218d0 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
218e0 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20  ion.  NN is the 
218f0 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  number of neighb
21900 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
21910 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  de.** of the pag
21920 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  e that participa
21930 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
21940 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
21950 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74  NB is the.** tot
21960 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
21970 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70  es that particip
21980 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  ate, including t
21990 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61  he target page a
219a0 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f  nd.** NN neighbo
219b0 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
219c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e  e..**.** The min
219d0 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e  imum value of NN
219e0 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65   is 1 (of course
219f0 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e  ).  Increasing N
21a00 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f  N above 1.** (to
21a10 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61   2 or 3) gives a
21a20 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d   modest improvem
21a30 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e  ent in SELECT an
21a40 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d  d DELETE perform
21a50 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61  ance.** in excha
21a60 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72  nge for a larger
21a70 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20   degradation in 
21a80 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
21a90 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a  E performance..*
21aa0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e  * The value of N
21ab0 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76  N appears to giv
21ac0 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c  e the best resul
21ad0 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23  ts overall..*/.#
21ae0 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20  define NN 1     
21af0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21b00 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
21b10 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
21b20 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e   pPage */.#defin
21b30 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20  e NB (NN*2+1)   
21b40 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65     /* Total page
21b50 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
21b60 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a  e balance */../*
21b70 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
21b80 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
21b90 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65   balance(MemPage
21ba0 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65  *, int);..#ifnde
21bb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
21bc0 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a  ICKBALANCE./*.**
21bd0 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
21be0 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c   balance() handl
21bf0 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70  es the common sp
21c00 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
21c10 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20  .** a new entry 
21c20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
21c30 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65  d on the extreme
21c40 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68   right-end of th
21c50 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74  e.** tree, in ot
21c60 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20  her words, when 
21c70 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  the new entry wi
21c80 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61  ll become the la
21c90 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69  rgest.** entry i
21ca0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  n the tree..**.*
21cb0 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79  * Instead of try
21cc0 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ing balance the 
21cd0 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
21ce0 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
21cf0 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
21d00 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
21d10 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
21d20 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
21d30 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
21d40 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
21d50 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
21d60 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
21d70 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
21d80 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
21d90 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
21da0 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
21db0 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
21dc0 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
21dd0 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
21de0 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
21df0 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
21e00 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
21e10 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
21e20 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
21e30 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
21e40 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
21e50 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
21e60 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
21e70 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
21e80 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
21e90 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
21ea0 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
21eb0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
21ec0 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
21ed0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
21ee0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50  lance_quick(MemP
21ef0 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50  age *pPage, MemP
21f00 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20  age *pParent){. 
21f10 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
21f20 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f  ge *pNew;.  Pgno
21f30 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a   pgnoNew;.  u8 *
21f40 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a 43  pCell;.  int szC
21f50 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  ell;.  CellInfo 
21f60 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72 65 64  info;.  BtShared
21f70 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
21f80 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74  Bt;.  int parent
21f90 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e  Idx = pParent->n
21fa0 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65  Cell;   /* pPare
21fb0 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  nt new divider c
21fc0 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ell index */.  i
21fd0 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20  nt parentSize;  
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ff0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20   /* Size of new 
22000 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
22010 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b    u8 parentCell[
22020 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  64];            
22030 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
22040 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
22050 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41   cell */..  /* A
22060 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
22070 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f  ge. Insert the o
22080 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f  verflow cell fro
22090 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74  m pPage.  ** int
220a0 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76  o it. Then remov
220b0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
220c0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
220d0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f    */.  rc = allo
220e0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
220f0 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
22100 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  ew, 0, 0);.  if(
22110 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22120 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
22130 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20 70  .  }.  pCell = p
22140 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  Page->aOvfl[0].p
22150 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d  Cell;.  szCell =
22160 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
22170 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a 65  ge, pCell);.  ze
22180 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61  roPage(pNew, pPa
22190 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  ge->aData[0]);. 
221a0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
221b0 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
221c0 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  szCell);.  pPage
221d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
221e0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70  ..  /* Set the p
221f0 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  arent of the new
22200 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ly allocated pag
22210 65 20 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f  e to pParent. */
22220 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74  .  pNew->pParent
22230 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 73 71   = pParent;.  sq
22240 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
22250 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
22260 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
22270 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69  currently the ri
22280 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61  ght-child of pPa
22290 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69  rent. Change thi
222a0 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74  s.  ** so that t
222b0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69  he right-child i
222c0 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61  s the new page a
222d0 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20 61  llocated above a
222e0 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65 20 69 73  nd.  ** pPage is
222f0 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67   the next-to-rig
22300 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2f 0a  ht child. .  */.
22310 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
22320 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 70 61  >nCell>0 );.  pa
22330 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
22340 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
22350 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  , pPage->nCell-1
22360 29 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63 20  ), &info);.  rc 
22370 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
22380 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c  rent, parentCell
22390 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20  , 0, info.nKey, 
223a0 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a  0, 0, &parentSiz
223b0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
223c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
223d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
223e0 61 73 73 65 72 74 28 20 70 61 72 65 6e 74 53 69  assert( parentSi
223f0 7a 65 3c 36 34 20 29 3b 0a 20 20 72 63 20 3d 20  ze<64 );.  rc = 
22400 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
22410 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20 70  nt, parentIdx, p
22420 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e  arentCell, paren
22430 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20  tSize, 0, 4);.  
22440 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22450 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
22460 72 63 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  rc;.  }.  put4by
22470 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
22480 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61 72 65  ell(pParent,pare
22490 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d 3e 70  ntIdx), pPage->p
224a0 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62 79 74 65  gno);.  put4byte
224b0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
224c0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
224d0 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
224e0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
224f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
22500 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  M.  /* If this i
22510 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
22520 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
22530 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
22540 70 0a 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72  p.  ** with entr
22550 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
22560 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
22570 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
22580 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
22590 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
225a0 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
225b0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
225c0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
225d0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
225e0 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50   pgnoNew, PTRMAP
225f0 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
22600 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  >pgno);.    if( 
22610 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22620 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
22630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
22640 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
22650 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  New, 0);.    if(
22660 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22670 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
22680 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  c;.    }.  }.#en
22690 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  dif..  /* Releas
226a0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
226b0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  to the new page 
226c0 61 6e 64 20 62 61 6c 61 6e 63 65 20 74 68 65 20  and balance the 
226d0 70 61 72 65 6e 74 20 70 61 67 65 2c 0a 20 20 2a  parent page,.  *
226e0 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 64 69  * in case the di
226f0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65 72  vider cell inser
22700 74 65 64 20 63 61 75 73 65 64 20 69 74 20 74 6f  ted caused it to
22710 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
22720 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
22730 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 72 65  Page(pNew);.  re
22740 74 75 72 6e 20 62 61 6c 61 6e 63 65 28 70 50 61  turn balance(pPa
22750 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64  rent, 0);.}.#end
22760 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
22770 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
22780 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49 53 41  /../*.** The ISA
22790 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 20  UTOVACUUM macro 
227a0 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 62  is used within b
227b0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
227c0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a   to determine.**
227d0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
227e0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
227f0 61 63 75 75 6d 20 6f 72 20 6e 6f 74 2e 20 42 65  acuum or not. Be
22800 63 61 75 73 65 20 69 74 20 69 73 20 75 73 65 64  cause it is used
22810 0a 2a 2a 20 77 69 74 68 69 6e 20 61 6e 20 65 78  .** within an ex
22820 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
22830 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
22840 61 6e 6f 74 68 65 72 20 6d 61 63 72 6f 20 0a 2a  another macro .*
22850 2a 20 28 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52  * (sqliteMallocR
22860 61 77 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  aw), it is not p
22870 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 63  ossible to use c
22880 6f 6e 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 69  onditional compi
22890 6c 61 74 69 6f 6e 2e 0a 2a 2a 20 53 6f 2c 20 74  lation..** So, t
228a0 68 69 73 20 6d 61 63 72 6f 20 69 73 20 64 65 66  his macro is def
228b0 69 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f  ined instead..*/
228c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
228d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
228e0 23 64 65 66 69 6e 65 20 49 53 41 55 54 4f 56 41  #define ISAUTOVA
228f0 43 55 55 4d 20 28 70 42 74 2d 3e 61 75 74 6f 56  CUUM (pBt->autoV
22900 61 63 75 75 6d 29 0a 23 65 6c 73 65 0a 23 64 65  acuum).#else.#de
22910 66 69 6e 65 20 49 53 41 55 54 4f 56 41 43 55 55  fine ISAUTOVACUU
22920 4d 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  M 0.#endif../*.*
22930 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
22940 65 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c  edistributes Cel
22950 6c 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20  ls on pPage and 
22960 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69  up to NN*2 sibli
22970 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20  ngs.** of pPage 
22980 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
22990 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
229a0 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20   same amount of 
229b0 66 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55  free space..** U
229c0 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e  sually NN siblin
229d0 67 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  gs on either sid
229e0 65 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73  e of pPage is us
229f0 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
22a00 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d  ing,.** though m
22a10 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67  ore siblings mig
22a20 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65  ht come from one
22a30 20 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69   side if pPage i
22a40 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f  s the first.** o
22a50 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20  r last child of 
22a60 69 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20  its parent.  If 
22a70 70 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20  pPage has fewer 
22a80 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e  than 2*NN siblin
22a90 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67  gs.** (something
22aa0 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20   which can only 
22ab0 68 61 70 70 65 6e 20 69 66 20 70 50 61 67 65 20  happen if pPage 
22ac0 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
22ad0 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20   or a .** child 
22ae0 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c  of root) then al
22af0 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c  l available sibl
22b00 69 6e 67 73 20 70 61 72 74 69 63 69 70 61 74 65  ings participate
22b10 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
22b20 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  g..**.** The num
22b30 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ber of siblings 
22b40 6f 66 20 70 50 61 67 65 20 6d 69 67 68 74 20 62  of pPage might b
22b50 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64  e increased or d
22b60 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20  ecreased by one 
22b70 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20  or.** two in an 
22b80 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
22b90 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
22ba0 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
22bb0 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67  ll. The root pag
22bc0 65 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20  e.** is special 
22bd0 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  and is allowed t
22be0 6f 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  o be nearly empt
22bf0 79 2e 20 49 66 20 70 50 61 67 65 20 69 73 20 0a  y. If pPage is .
22c00 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
22c10 2c 20 74 68 65 6e 20 74 68 65 20 64 65 70 74 68  , then the depth
22c20 20 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69 67   of the tree mig
22c30 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a  ht be increased.
22c40 2a 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ** or decreased 
22c50 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73  by one, as neces
22c60 73 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68  sary, to keep th
22c70 65 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d  e root page from
22c80 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75   being.** overfu
22c90 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79  ll or completely
22ca0 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   empty..**.** No
22cb0 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
22cc0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
22cd0 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65  led, some of the
22ce0 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a   Cells on pPage.
22cf0 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
22d00 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
22d10 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
22d20 5d 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70  ].  This can hap
22d30 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
22d40 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
22d50 20 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62   Part of the job
22d60 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
22d70 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73   is to.** make s
22d80 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f  ure all Cells fo
22d90 72 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61  r pPage once aga
22da0 69 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d  in fit in pPage-
22db0 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  >aData[]..**.** 
22dc0 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66  In the course of
22dd0 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73   balancing the s
22de0 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65  iblings of pPage
22df0 2c 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  , the parent of 
22e00 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62  pPage.** might b
22e10 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
22e20 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66  r underfull.  If
22e30 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74   that happens, t
22e40 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
22e50 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65  .** is called re
22e60 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65  cursively on the
22e70 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   parent..**.** I
22e80 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
22e90 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
22ea0 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65  son, it might le
22eb0 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ave the database
22ec0 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74  .** in a corrupt
22ed0 65 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66  ed state.  So if
22ee0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
22ef0 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ils, the databas
22f00 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  e should.** be r
22f10 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73  olled back..*/.s
22f20 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
22f30 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67  e_nonroot(MemPag
22f40 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d  e *pPage){.  Mem
22f50 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20  Page *pParent;  
22f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22f70 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65   parent of pPage
22f80 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
22f90 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
22fa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
22fb0 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
22fc0 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20   int nCell = 0; 
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22fe0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
22ff0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
23000 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20    int nMaxCells 
23010 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
23020 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
23030 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65   of apCell, szCe
23040 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20  ll, aFrom. */.  
23050 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20  int nOld;       
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23070 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
23080 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
23090 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20  int nNew;       
230a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
230b0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
230c0 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
230d0 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20  int nDiv;       
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
230f0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
23100 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20  in apDiv[] */.  
23110 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20  int i, j, k;    
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23130 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
23140 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23160 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67  /* Index of pPag
23170 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43  e in pParent->aC
23180 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
23190 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  xDiv;           
231a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
231b0 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20  divider slot in 
231c0 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
231d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231f0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
23200 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c   code */.  int l
23210 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20  eafCorrection;  
23220 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20          /* 4 if 
23230 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
23240 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20    0 if not */.  
23250 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20  int leafData;   
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23270 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73  True if pPage is
23280 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41   a leaf of a LEA
23290 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20  FDATA tree */.  
232a0 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b  int usableSpace;
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
232c0 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62  Bytes in pPage b
232d0 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72  eyond the header
232e0 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c   */.  int pageFl
232f0 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
23300 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
23310 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a  Page->aData[0] *
23320 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c  /.  int subtotal
23330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23340 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20   /* Subtotal of 
23350 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f  bytes in cells o
23360 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  n one page */.  
23370 69 6e 74 20 69 53 70 61 63 65 20 3d 20 30 3b 20  int iSpace = 0; 
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23390 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
233a0 65 20 6f 66 20 61 53 70 61 63 65 5b 5d 20 2a 2f  e of aSpace[] */
233b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c  .  MemPage *apOl
233c0 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
233d0 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
233e0 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20  to two siblings 
233f0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c  */.  Pgno pgnoOl
23400 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
23410 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
23420 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  s for each page 
23430 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
23440 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b  MemPage *apCopy[
23450 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  NB];         /* 
23460 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f  Private copies o
23470 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20  f apOld[] pages 
23480 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
23490 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
234a0 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
234b0 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73  p to NB siblings
234c0 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   after balancing
234d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e   */.  Pgno pgnoN
234e0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
234f0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
23500 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  rs for each page
23510 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
23520 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20   u8 *apDiv[NB]; 
23530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23540 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   Divider cells i
23550 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69  n pParent */.  i
23560 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b  nt cntNew[NB+2];
23570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
23580 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20  ndex in aCell[] 
23590 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d  of cell after i-
235a0 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  th page */.  int
235b0 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20   szNew[NB+2];   
235c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
235d0 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65  bined size of ce
235e0 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74  lls place on i-t
235f0 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  h page */.  u8 *
23600 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20  *apCell = 0;    
23610 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
23620 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61  cells begin bala
23630 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 73  nced */.  int *s
23640 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zCell;          
23650 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
23660 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
23670 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
23680 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d  .  u8 *aCopy[NB]
23690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
236a0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c  /* Space for hol
236b0 64 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70 43  ding data of apC
236c0 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61  opy[] */.  u8 *a
236d0 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
236e0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
236f0 20 74 6f 20 68 6f 6c 64 20 63 6f 70 69 65 73 20   to hold copies 
23700 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c  of dividers cell
23710 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  s */.#ifndef SQL
23720 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
23730 55 55 4d 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20  UUM.  u8 *aFrom 
23740 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  = 0;.#endif..  /
23750 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  * .  ** Find the
23760 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
23770 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
23780 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
23790 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
237a0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
237b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
237c0 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
237d0 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72 65 6e 74  ->pBt;.  pParent
237e0 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
237f0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  t;.  assert( pPa
23800 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51  rent );.  if( SQ
23810 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
23820 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
23830 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
23840 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e)) ){.    retur
23850 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 54 52 41 43  n rc;.  }.  TRAC
23860 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67  E(("BALANCE: beg
23870 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64  in page %d child
23880 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   of %d\n", pPage
23890 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d  ->pgno, pParent-
238a0 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65  >pgno));..#ifnde
238b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
238c0 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a  ICKBALANCE.  /*.
238d0 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63    ** A special c
238e0 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65  ase:  If a new e
238f0 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65  ntry has just be
23900 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
23910 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74   a.  ** table (t
23920 68 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20  hat is, a btree 
23930 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79  with integer key
23940 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61  s and all data a
23950 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20  t the leaves).  
23960 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65  ** and the new e
23970 6e 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68  ntry is the righ
23980 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20  t-most entry in 
23990 74 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73  the tree (it has
239a0 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73   the.  ** larges
239b0 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20  t key) then use 
239c0 74 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61  the special bala
239d0 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74  nce_quick() rout
239e0 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c  ine for.  ** bal
239f0 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65  ancing.  balance
23a00 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68  _quick() is much
23a10 20 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75   faster and resu
23a20 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72  lts in a tighter
23a30 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66  .  ** packing of
23a40 20 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d   data in the com
23a50 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  mon case..  */. 
23a60 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
23a70 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
23a80 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20  >intKey &&.     
23a90 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
23aa0 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
23ab0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26  >nOverflow==1 &&
23ac0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  .      pPage->aO
23ad0 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67  vfl[0].idx==pPag
23ae0 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20  e->nCell &&.    
23af0 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74    pPage->pParent
23b00 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20  ->pgno!=1 &&.   
23b10 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
23b20 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
23b30 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
23b40 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a  ])==pPage->pgno.
23b50 20 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20    ){.    /*.    
23b60 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74  ** TODO: Check t
23b70 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74  he siblings to t
23b80 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65  he left of pPage
23b90 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74  . It may be that
23ba0 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65  .    ** they are
23bb0 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f   not full and no
23bc0 20 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71   new page is req
23bd0 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
23be0 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65    return balance
23bf0 5f 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50  _quick(pPage, pP
23c00 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  arent);.  }.#end
23c10 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  if..  /*.  ** Fi
23c20 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74  nd the cell in t
23c30 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
23c40 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20  hose left child 
23c50 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a  points back.  **
23c60 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20   to pPage.  The 
23c70 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20 69  "idx" variable i
23c80 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
23c90 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50  hat cell.  If pP
23ca0 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  age.  ** is the 
23cb0 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20  rightmost child 
23cc0 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20  of pParent then 
23cd0 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72 65  set idx to pPare
23ce0 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a  nt->nCell .  */.
23cf0 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 69    if( pParent->i
23d00 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20 50  dxShift ){.    P
23d10 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67  gno pgno;.    pg
23d20 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
23d30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
23d40 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
23d50 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
23d60 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
23d70 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78    for(idx=0; idx
23d80 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b  <pParent->nCell;
23d90 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69   idx++){.      i
23da0 66 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  f( get4byte(find
23db0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 64  Cell(pParent, id
23dc0 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20  x))==pgno ){.   
23dd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23de0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
23df0 73 65 72 74 28 20 69 64 78 3c 70 50 61 72 65 6e  sert( idx<pParen
23e00 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20  t->nCell.       
23e10 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79 74        || get4byt
23e20 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
23e30 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
23e40 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29  fset+8])==pgno )
23e50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
23e60 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50  dx = pPage->idxP
23e70 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arent;.  }..  /*
23e80 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  ** Initialize
23e90 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68   variables so th
23ea0 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61  at it will be sa
23eb0 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20  fe to jump.  ** 
23ec0 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61  directly to bala
23ed0 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61  nce_cleanup at a
23ee0 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  ny moment..  */.
23ef0 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20    nOld = nNew = 
23f00 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  0;.  sqlite3Page
23f10 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
23f20 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20  bPage);..  /*.  
23f30 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20  ** Find sibling 
23f40 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61  pages to pPage a
23f50 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  nd the cells in 
23f60 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76  pParent that div
23f70 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62  ide.  ** the sib
23f80 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d  lings.  An attem
23f90 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
23fa0 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
23fb0 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69  n either.  ** si
23fc0 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f  de of pPage.  Mo
23fd0 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
23fe0 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
23ff0 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66  ide, however, if
24000 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72  .  ** pPage ther
24010 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e  e are fewer than
24020 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
24030 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20  the other side. 
24040 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a   If pParent.  **
24050 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72   has NB or fewer
24060 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61   children then a
24070 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
24080 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e  Parent are taken
24090 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d  ..  */.  nxDiv =
240a0 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28   idx - NN;.  if(
240b0 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50   nxDiv + NB > pP
240c0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
240d0 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72      nxDiv = pPar
240e0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20  ent->nCell - NB 
240f0 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  + 1;.  }.  if( n
24100 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78  xDiv<0 ){.    nx
24110 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  Div = 0;.  }.  n
24120 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  Div = 0;.  for(i
24130 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e  =0, k=nxDiv; i<N
24140 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20  B; i++, k++){.  
24150 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d    if( k<pParent-
24160 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
24170 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
24180 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b  ell(pParent, k);
24190 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20  .      nDiv++;. 
241a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
241b0 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20  arent->leaf );. 
241c0 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20       pgnoOld[i] 
241d0 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
241e0 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [i]);.    }else 
241f0 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e  if( k==pParent->
24200 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  nCell ){.      p
24210 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
24220 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
24230 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
24240 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
24250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72   }else{.      br
24260 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
24270 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
24280 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b  ge(pBt, pgnoOld[
24290 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70  i], &apOld[i], p
242a0 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
242b0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
242c0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
242d0 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72  apOld[i]->idxPar
242e0 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43  ent = k;.    apC
242f0 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  opy[i] = 0;.    
24300 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20  assert( i==nOld 
24310 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20  );.    nOld++;. 
24320 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20     nMaxCells += 
24330 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c  1+apOld[i]->nCel
24340 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65  l+apOld[i]->nOve
24350 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rflow;.  }..  /*
24360 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20   Make nMaxCells 
24370 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 32 20  a multiple of 2 
24380 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73  in order to pres
24390 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a  erve 8-byte.  **
243a0 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20   alignment */.  
243b0 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61  nMaxCells = (nMa
243c0 78 43 65 6c 6c 73 20 2b 20 31 29 26 7e 31 3b 0a  xCells + 1)&~1;.
243d0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
243e0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
243f0 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
24400 20 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20    */.  apCell = 
24410 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
24420 20 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c   .       nMaxCel
24430 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24450 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
24460 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
24470 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 69 6e  xCells*sizeof(in
24480 74 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t)              
24490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
244a0 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
244b0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d   ROUND8(sizeof(M
244c0 65 6d 50 61 67 65 29 29 2a 4e 42 20 20 20 20 20  emPage))*NB     
244d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244e0 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20   /* aCopy */.   
244f0 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a    + pBt->pageSiz
24500 65 2a 28 35 2b 4e 42 29 20 20 20 20 20 20 20 20  e*(5+NB)        
24510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24520 20 20 20 20 2f 2a 20 61 53 70 61 63 65 20 2a 2f      /* aSpace */
24530 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56  .     + (ISAUTOV
24540 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c  ACUUM ? nMaxCell
24550 73 20 3a 20 30 29 20 20 20 20 20 20 20 20 20 20  s : 0)          
24560 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d          /* aFrom
24570 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 61   */.  );.  if( a
24580 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
24590 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
245a0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
245b0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
245c0 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e 74  .  szCell = (int
245d0 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&apCell[nMaxCe
245e0 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d  lls];.  aCopy[0]
245f0 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b   = (u8*)&szCell[
24600 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73  nMaxCells];.  as
24610 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 30 5d  sert( ((aCopy[0]
24620 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
24630 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
24640 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
24650 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66 6f 72  equired */.  for
24660 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29  (i=1; i<NB; i++)
24670 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d  {.    aCopy[i] =
24680 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74   &aCopy[i-1][pBt
24690 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44  ->pageSize+ROUND
246a0 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
246b0 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ))];.    assert(
246c0 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75   ((aCopy[i] - (u
246d0 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
246e0 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
246f0 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
24700 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61  ed */.  }.  aSpa
24710 63 65 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31  ce = &aCopy[NB-1
24720 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b  ][pBt->pageSize+
24730 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
24740 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65  mPage))];.  asse
24750 72 74 28 20 28 28 61 53 70 61 63 65 20 2d 20 28  rt( ((aSpace - (
24760 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29  u8*)apCell) & 7)
24770 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65  ==0 ); /* 8-byte
24780 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69   alignment requi
24790 72 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  red */.#ifndef S
247a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
247b0 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
247c0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
247d0 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70 61     aFrom = &aSpa
247e0 63 65 5b 35 2a 70 42 74 2d 3e 70 61 67 65 53 69  ce[5*pBt->pageSi
247f0 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ze];.  }.#endif.
24800 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b    .  /*.  ** Mak
24810 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
24820 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65  content of pPage
24830 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67   and its sibling
24840 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20  s into aOld[].. 
24850 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20   ** The rest of 
24860 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
24870 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d  ll use data from
24880 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68   the copies rath
24890 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  er.  ** that the
248a0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
248b0 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e  since the origin
248c0 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  al pages will be
248d0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f   in the.  ** pro
248e0 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76  cess of being ov
248f0 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  erwritten..  */.
24900 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
24910 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
24920 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79  Page *p = apCopy
24930 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  [i] = (MemPage*)
24940 26 61 43 6f 70 79 5b 69 5d 5b 70 42 74 2d 3e 70  &aCopy[i][pBt->p
24950 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 2d  ageSize];.    p-
24960 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29  >aData = &((u8*)
24970 70 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a  p)[-pBt->pageSiz
24980 65 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  e];.    memcpy(p
24990 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69  ->aData, apOld[i
249a0 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70  ]->aData, pBt->p
249b0 61 67 65 53 69 7a 65 20 2b 20 73 69 7a 65 6f 66  ageSize + sizeof
249c0 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20  (MemPage));.    
249d0 2f 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20  /* The memcpy() 
249e0 61 62 6f 76 65 20 63 68 61 6e 67 65 73 20 74 68  above changes th
249f0 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 61 44  e value of p->aD
24a00 61 74 61 20 73 6f 20 77 65 20 68 61 76 65 20 74  ata so we have t
24a10 6f 0a 20 20 20 20 2a 2a 20 73 65 74 20 69 74 20  o.    ** set it 
24a20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 70 2d  again. */.    p-
24a30 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29  >aData = &((u8*)
24a40 70 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a  p)[-pBt->pageSiz
24a50 65 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  e];.  }..  /*.  
24a60 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73  ** Load pointers
24a70 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   to all cells on
24a80 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
24a90 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63  nd the divider c
24aa0 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74  ells.  ** into t
24ab0 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b  he local apCell[
24ac0 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63  ] array.  Make c
24ad0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76  opies of the div
24ae0 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
24af0 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
24b00 6e 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65 5b  ned form aSpace[
24b10 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65  ] and remove the
24b20 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c   the divider Cel
24b30 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61  ls.  ** from pPa
24b40 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rent..  **.  ** 
24b50 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
24b60 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  are on leaf page
24b70 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
24b80 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68  d pointers of th
24b90 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63  e.  ** divider c
24ba0 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65  ells are strippe
24bb0 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73  d from the cells
24bc0 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65   before they are
24bd0 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74   copied.  ** int
24be0 6f 20 61 53 70 61 63 65 5b 5d 2e 20 20 49 6e 20  o aSpace[].  In 
24bf0 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65  this way, all ce
24c00 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
24c10 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a  are without.  **
24c20 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
24c30 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72    If siblings ar
24c40 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
24c50 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20  en all cell in. 
24c60 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63   ** apCell[] inc
24c70 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  lude child point
24c80 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  ers.  Either way
24c90 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
24ca0 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65  pCell[].  ** are
24cb0 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a   alike..  **.  *
24cc0 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  * leafCorrection
24cd0 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73  :  4 if pPage is
24ce0 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70   a leaf.  0 if p
24cf0 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  Page is not a le
24d00 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c  af..  **       l
24d10 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70  eafData:  1 if p
24d20 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64  Page holds key+d
24d30 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20  ata and pParent 
24d40 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e  holds only keys.
24d50 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20  .  */.  nCell = 
24d60 30 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74  0;.  leafCorrect
24d70 69 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ion = pPage->lea
24d80 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20  f*4;.  leafData 
24d90 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74  = pPage->leafDat
24da0 61 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66  a && pPage->leaf
24db0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
24dc0 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Old; i++){.    M
24dd0 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61  emPage *pOld = a
24de0 70 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e  pCopy[i];.    in
24df0 74 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e  t limit = pOld->
24e00 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65  nCell+pOld->nOve
24e10 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a  rflow;.    for(j
24e20 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
24e30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
24e40 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
24e50 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c   );.      apCell
24e60 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76  [nCell] = findOv
24e70 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c  erflowCell(pOld,
24e80 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c   j);.      szCel
24e90 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53  l[nCell] = cellS
24ea0 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43  izePtr(pOld, apC
24eb0 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66  ell[nCell]);.#if
24ec0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24ed0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
24ee0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
24ef0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
24f00 20 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20   int a;.        
24f10 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69  aFrom[nCell] = i
24f20 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d  ;.        for(a=
24f30 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72  0; a<pOld->nOver
24f40 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20  flow; a++){.    
24f50 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e        if( pOld->
24f60 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d  aOvfl[a].pCell==
24f70 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b  apCell[nCell] ){
24f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72  .            aFr
24f90 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46  om[nCell] = 0xFF
24fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
24fb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
24fc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24fd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
24fe0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
24ff0 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20     if( i<nOld-1 
25000 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20  ){.      int sz 
25010 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
25020 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
25030 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
25040 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
25050 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41 46  /* With the LEAF
25060 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65  DATA flag, pPare
25070 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e  nt cells hold on
25080 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a  ly INTKEYs that.
25090 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64          ** are d
250a0 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79  uplicates of key
250b0 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70  s on the child p
250c0 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74  ages.  We need t
250d0 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20  o remove.       
250e0 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72 20   ** the divider 
250f0 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65  cells from pPare
25100 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69 76 69  nt, but the divi
25110 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e  ders cells are n
25120 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  ot.        ** ad
25130 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20  ded to apCell[] 
25140 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65  because they are
25150 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63   duplicates of c
25160 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20  hild cells..    
25170 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64      */.        d
25180 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
25190 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20   nxDiv, sz);.   
251a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
251b0 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
251c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
251d0 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
251e0 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
251f0 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20  Cell] = sz;.    
25200 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
25210 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20  ace[iSpace];.   
25220 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73       iSpace += s
25230 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
25240 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e  t( iSpace<=pBt->
25250 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20  pageSize*5 );.  
25260 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
25270 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a  mp, apDiv[i], sz
25280 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c  );.        apCel
25290 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70  l[nCell] = pTemp
252a0 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b  +leafCorrection;
252b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
252c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
252d0 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
252e0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
252f0 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e           aFrom[n
25300 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20  Cell] = 0xFF;.  
25310 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
25320 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28         dropCell(
25330 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
25340 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  sz);.        szC
25350 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65  ell[nCell] -= le
25360 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
25370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65        assert( ge
25380 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70  t4byte(pTemp)==p
25390 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20  gnoOld[i] );.   
253a0 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e       if( !pOld->
253b0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
253c0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
253d0 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20  rrection==0 );. 
253e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
253f0 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66  right pointer of
25400 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
25410 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65  pOld becomes the
25420 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20   left.          
25430 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ** pointer of th
25440 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  e divider cell *
25450 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
25460 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(apCell[nCell]
25470 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70  , &pOld->aData[p
25480 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  Old->hdrOffset+8
25490 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], 4);.        }
254a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
254b0 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
254c0 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
254d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
254e0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Cell++;.      }.
254f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
25500 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
25510 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
25520 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ges needed to ho
25530 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c  ld all nCell cel
25540 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74  ls..  ** Store t
25550 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b  his number in "k
25560 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65  ".  Also compute
25570 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69   szNew[] which i
25580 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a  s the total.  **
25590 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
255a0 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70  ls on the i-th p
255b0 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d  age and cntNew[]
255c0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
255d0 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65  dex.  ** in apCe
255e0 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c  ll[] of the cell
255f0 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61   that divides pa
25600 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69  ge i from page i
25610 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65  +1.  .  ** cntNe
25620 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61  w[k] should equa
25630 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20  l nCell..  **.  
25640 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74  ** Values comput
25650 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
25660 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
25670 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74        k: The tot
25680 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  al number of sib
25690 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20  ling pages.  ** 
256a0 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61     szNew[i]: Spa
256b0 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20  ced used on the 
256c0 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
256d0 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77  e..  **   cntNew
256e0 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70  [i]: Index in ap
256f0 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
25700 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73  l[] for the firs
25710 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20  t cell to.  **  
25720 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
25730 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74  right of the i-t
25740 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
25750 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65    ** usableSpace
25760 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  : Number of byte
25770 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c  s of space avail
25780 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62  able on each sib
25790 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f  ling..  ** .  */
257a0 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d  .  usableSpace =
257b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
257c0 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72   - 12 + leafCorr
257d0 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75  ection;.  for(su
257e0 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c  btotal=k=i=0; i<
257f0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
25800 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43   assert( i<nMaxC
25810 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74  ells );.    subt
25820 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69  otal += szCell[i
25830 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73  ] + 2;.    if( s
25840 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65  ubtotal > usable
25850 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Space ){.      s
25860 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
25870 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  al - szCell[i];.
25880 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20        cntNew[k] 
25890 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  = i;.      if( l
258a0 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20  eafData ){ i--; 
258b0 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c  }.      subtotal
258c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b   = 0;.      k++;
258d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e  .    }.  }.  szN
258e0 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
258f0 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20  ;.  cntNew[k] = 
25900 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20  nCell;.  k++;.. 
25910 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63   /*.  ** The pac
25920 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79  king computed by
25930 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c   the previous bl
25940 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f  ock is biased to
25950 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67  ward the sibling
25960 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65  s.  ** on the le
25970 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65  ft side.  The le
25980 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  ft siblings are 
25990 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75  always nearly fu
259a0 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20  ll, while the.  
259b0 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  ** right-most si
259c0 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e  bling might be n
259d0 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  early empty.  Th
259e0 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  is block of code
259f0 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74   attempts.  ** t
25a00 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63  o adjust the pac
25a10 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73  king of siblings
25a20 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72   to get a better
25a30 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20   balance..  **. 
25a40 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d   ** This adjustm
25a50 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ent is more than
25a60 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
25a70 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61  .  The packing a
25a80 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20  bove might.  ** 
25a90 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c  be so out of bal
25aa0 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c  ance as to be il
25ab0 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d  legal.  For exam
25ac0 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d  ple, the right-m
25ad0 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67  ost.  ** sibling
25ae0 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65   might be comple
25af0 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  tely empty.  Thi
25b00 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
25b10 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20  not optional..  
25b20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20  */.  for(i=k-1; 
25b30 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  i>0; i--){.    i
25b40 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e  nt szRight = szN
25b50 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20  ew[i];  /* Size 
25b60 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
25b70 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69  e right */.    i
25b80 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65  nt szLeft = szNe
25b90 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20  w[i-1]; /* Size 
25ba0 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
25bb0 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e  e left */.    in
25bc0 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  t r;            
25bd0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69    /* Index of ri
25be0 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e  ght-most cell in
25bf0 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f   left sibling */
25c00 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20  .    int d;     
25c10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
25c20 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
25c30 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72  to the left of r
25c40 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  ight sibling */.
25c50 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b  .    r = cntNew[
25c60 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20  i-1] - 1;.    d 
25c70 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
25c80 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
25c90 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  d<nMaxCells );. 
25ca0 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61     assert( r<nMa
25cb0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68  xCells );.    wh
25cc0 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20  ile( szRight==0 
25cd0 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c  || szRight+szCel
25ce0 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28  l[d]+2<=szLeft-(
25cf0 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a  szCell[r]+2) ){.
25d00 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d        szRight +=
25d10 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a   szCell[d] + 2;.
25d20 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20        szLeft -= 
25d30 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20  szCell[r] + 2;. 
25d40 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d       cntNew[i-1]
25d50 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e  --;.      r = cn
25d60 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
25d70 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d       d = r + 1 -
25d80 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d   leafData;.    }
25d90 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20  .    szNew[i] = 
25da0 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e  szRight;.    szN
25db0 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74  ew[i-1] = szLeft
25dc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68  ;.  }..  /* Eith
25dd0 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20  er we found one 
25de0 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63  or more cells (c
25df0 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20  ntnew[0])>0) or 
25e00 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20  we are the.  ** 
25e10 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
25e20 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
25e30 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
25e40 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
25e50 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
25e60 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
25e70 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
25e80 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f   that page..  */
25e90 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65  .  assert( cntNe
25ea0 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65  w[0]>0 || (pPare
25eb0 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70  nt->pgno==1 && p
25ec0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
25ed0 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
25ee0 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
25ef0 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
25f00 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
25f10 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  sible..  */.  as
25f20 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
25f30 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61  o>1 );.  pageFla
25f40 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  gs = pPage->aDat
25f50 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  a[0];.  for(i=0;
25f60 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
25f70 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
25f80 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b     if( i<nOld ){
25f90 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70  .      pNew = ap
25fa0 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69  New[i] = apOld[i
25fb0 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
25fc0 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d  [i] = pgnoOld[i]
25fd0 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
25fe0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
25ff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
26000 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  te(pNew->pDbPage
26010 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
26020 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
26030 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
26040 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
26050 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
26060 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
26070 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
26080 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67   &pgnoNew[i], pg
26090 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a  noNew[i-1], 0);.
260a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
260b0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
260c0 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nup;.      apNew
260d0 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  [i] = pNew;.    
260e0 7d 0a 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20  }.    nNew++;.  
260f0 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
26100 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 7d   pageFlags);.  }
26110 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
26120 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77  old pages that w
26130 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61  ere not reused a
26140 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  s new pages..  *
26150 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c  /.  while( i<nOl
26160 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72  d ){.    rc = fr
26170 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  eePage(apOld[i])
26180 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
26190 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
261a0 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  nup;.    release
261b0 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
261c0 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
261d0 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  ;.    i++;.  }..
261e0 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68    /*.  ** Put th
261f0 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61  e new pages in a
26200 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  ccending order. 
26210 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20   This helps to. 
26220 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73   ** keep entries
26230 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
26240 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68  e in order so th
26250 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f  at a scan.  ** o
26260 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  f the table is a
26270 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72   linear scan thr
26280 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20  ough the file.  
26290 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72  That.  ** in tur
262a0 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72  n helps the oper
262b0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20  ating system to 
262c0 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20  deliver pages.  
262d0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ** from the disk
262e0 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20   more rapidly.. 
262f0 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e   **.  ** An O(n^
26300 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72  2) insertion sor
26310 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75  t algorithm is u
26320 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20  sed, but since. 
26330 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d   ** n is never m
26340 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73  ore than NB (a s
26350 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20  mall constant), 
26360 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  that should.  **
26370 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
26380 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  m..  **.  ** Whe
26390 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e  n NB==3, this on
263a0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d  e optimization m
263b0 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73  akes the databas
263c0 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25  e.  ** about 25%
263d0 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67   faster for larg
263e0 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64  e insertions and
263f0 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f   deletions..  */
26400 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d  .  for(i=0; i<k-
26410 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  1; i++){.    int
26420 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b   minV = pgnoNew[
26430 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49  i];.    int minI
26440 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = i;.    for(j=
26450 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a  i+1; j<k; j++){.
26460 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65        if( pgnoNe
26470 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d  w[j]<(unsigned)m
26480 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
26490 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
264a0 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b   minV = pgnoNew[
264b0 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j];.      }.    
264c0 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69  }.    if( minI>i
264d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b   ){.      int t;
264e0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
264f0 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67  pT;.      t = pg
26500 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  noNew[i];.      
26510 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  pT = apNew[i];. 
26520 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20       pgnoNew[i] 
26530 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b  = pgnoNew[minI];
26540 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
26550 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  = apNew[minI];. 
26560 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e       pgnoNew[min
26570 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70  I] = t;.      ap
26580 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a  New[minI] = pT;.
26590 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43      }.  }.  TRAC
265a0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64  E(("BALANCE: old
265b0 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a  : %d %d %d  new:
265c0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
265d0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
265e0 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f  %d)\n",.    pgno
265f0 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c  Old[0], .    nOl
26600 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31  d>=2 ? pgnoOld[1
26610 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e  ] : 0,.    nOld>
26620 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20  =3 ? pgnoOld[2] 
26630 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77  : 0,.    pgnoNew
26640 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  [0], szNew[0],. 
26650 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e     nNew>=2 ? pgn
26660 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[1] : 0, nNe
26670 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20  w>=2 ? szNew[1] 
26680 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33  : 0,.    nNew>=3
26690 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20   ? pgnoNew[2] : 
266a0 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
266b0 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
266c0 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77  New>=4 ? pgnoNew
266d0 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34  [3] : 0, nNew>=4
266e0 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c   ? szNew[3] : 0,
266f0 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70  .    nNew>=5 ? p
26700 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e  gnoNew[4] : 0, n
26710 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
26720 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20  ] : 0));..  /*. 
26730 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72   ** Evenly distr
26740 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69  ibute the data i
26750 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73  n apCell[] acros
26760 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e  s the new pages.
26770 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76  .  ** Insert div
26780 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
26790 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73  pParent as neces
267a0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d  sary..  */.  j =
267b0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
267c0 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
267d0 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65   /* Assemble the
267e0 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
267f0 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  e. */.    MemPag
26800 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
26810 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
26820 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
26830 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
26840 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69  >pgno==pgnoNew[i
26850 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  ] );.    assembl
26860 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e  ePage(pNew, cntN
26870 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c  ew[i]-j, &apCell
26880 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29  [j], &szCell[j])
26890 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
268a0 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28  ew->nCell>0 || (
268b0 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65  nNew==1 && cntNe
268c0 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20  w[0]==0) );.    
268d0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
268e0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23  verflow==0 );..#
268f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26900 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
26910 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
26920 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
26930 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
26940 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
26950 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74  entries.    ** t
26960 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  hat point to the
26970 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77   siblings that w
26980 65 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20  ere rearranged. 
26990 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65  These can be: le
269a0 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72  ft.    ** childr
269b0 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65  en of cells, the
269c0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
269d0 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65  the page, or ove
269e0 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20  rflow pages.    
269f0 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
26a00 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   cells..    */. 
26a10 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
26a20 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
26a30 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65  for(k=j; k<cntNe
26a40 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  w[i]; k++){.    
26a50 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d      assert( k<nM
26a60 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
26a70 20 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d     if( aFrom[k]=
26a80 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b  =0xFF || apCopy[
26a90 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21  aFrom[k]]->pgno!
26aa0 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20  =pNew->pgno ){. 
26ab0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74           rc = pt
26ac0 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77  rmapPutOvfl(pNew
26ad0 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20  , k-j);.        
26ae0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
26b00 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
26b10 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
26b20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26b30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
26b40 64 69 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74  dif..    j = cnt
26b50 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20  New[i];..    /* 
26b60 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
26b70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
26b80 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20  ove was not the 
26b90 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
26ba0 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ng,.    ** inser
26bb0 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  t a divider cell
26bc0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
26bd0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
26be0 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26    if( i<nNew-1 &
26bf0 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  & j<nCell ){.   
26c00 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
26c10 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
26c20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
26c30 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
26c40 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
26c50 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
26c60 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
26c70 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
26c80 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
26c90 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66   if( !pNew->leaf
26ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
26cb0 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b  py(&pNew->aData[
26cc0 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20  8], pCell, 4);. 
26cd0 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30         pTemp = 0
26ce0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
26cf0 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 09 2f  ( leafData ){../
26d00 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73  * If the tree is
26d10 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
26d20 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69  e, and the sibli
26d30 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20  ngs are leaves, 
26d40 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
26d50 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76   there is no div
26d60 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43  ider cell in apC
26d70 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20  ell[]. Instead, 
26d80 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20  the divider .   
26d90 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e       ** cell con
26da0 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74  sists of the int
26db0 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65  eger key for the
26dc0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
26dd0 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   of .        ** 
26de0 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65  the sibling-page
26df0 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
26e00 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a   only..        *
26e10 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  /.        CellIn
26e20 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
26e30 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70 61   j--;.        pa
26e40 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c  rseCellPtr(pNew,
26e50 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66   apCell[j], &inf
26e60 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  o);.        pCel
26e70 6c 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61  l = &aSpace[iSpa
26e80 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 66 69 6c  ce];.        fil
26e90 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lInCell(pParent,
26ea0 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e   pCell, 0, info.
26eb0 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 26 73 7a 29  nKey, 0, 0, &sz)
26ec0 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
26ed0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
26ee0 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d  assert( iSpace<=
26ef0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20  pBt->pageSize*5 
26f00 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
26f10 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
26f20 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
26f30 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 70   -= 4;.        p
26f40 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69  Temp = &aSpace[i
26f50 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
26f60 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  iSpace += sz;.  
26f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
26f80 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
26f90 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 7d  ize*5 );.      }
26fa0 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65  .      rc = inse
26fb0 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
26fc0 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
26fd0 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20  , pTemp, 4);.   
26fe0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26ff0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
27000 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
27010 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
27020 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
27030 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65  rent,nxDiv), pNe
27040 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65  w->pgno);.#ifnde
27050 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
27060 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
27070 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
27080 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
27090 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20  base, and not a 
270a0 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a  leaf-data tree,.
270b0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70        ** then up
270c0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
270d0 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74   map with an ent
270e0 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
270f0 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
27100 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20  * that the cell 
27110 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f  just inserted po
27120 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29  ints to (if any)
27130 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
27140 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
27150 63 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74  cuum && !leafDat
27160 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  a ){.        rc 
27170 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
27180 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b  pParent, nxDiv);
27190 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
271a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
271b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
271c0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
271d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
271e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b  #endif.      j++
271f0 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
27200 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
27210 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
27220 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
27230 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
27240 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
27250 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
27260 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
27270 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e  memcpy(&apNew[nN
27280 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ew-1]->aData[8],
27290 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d   &apCopy[nOld-1]
272a0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a  ->aData[8], 4);.
272b0 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d    }.  if( nxDiv=
272c0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b  =pParent->nCell+
272d0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
272e0 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67  ow ){.    /* Rig
272f0 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
27300 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
27310 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t child of pPare
27320 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  nt */.    put4by
27330 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
27340 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
27350 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
27360 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65  w[nNew-1]);.  }e
27370 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  lse{.    /* Righ
27380 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
27390 73 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64  s the left child
273a0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e   of the first en
273b0 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20  try in pParent. 
273c0 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72     ** past the r
273d0 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65  ight-most divide
273e0 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70  r entry */.    p
273f0 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
27400 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
27410 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65  , nxDiv), pgnoNe
27420 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a  w[nNew-1]);.  }.
27430 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72  .  /*.  ** Repar
27440 65 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  ent children of 
27450 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a  all cells..  */.
27460 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
27470 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20  w; i++){.    rc 
27480 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50  = reparentChildP
27490 61 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  ages(apNew[i]);.
274a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
274b0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
274c0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
274d0 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e  }.  rc = reparen
274e0 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72  tChildPages(pPar
274f0 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ent);.  if( rc!=
27500 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
27510 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
27520 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c  ;..  /*.  ** Bal
27530 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
27540 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  page.  Note that
27550 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
27560 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a  e (pPage) might.
27570 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61    ** have been a
27580 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
27590 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74  list so it might
275a0 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e   no longer be in
275b0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
275c0 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  But the parent p
275d0 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  age will always 
275e0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
275f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
27600 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29  Parent->isInit )
27610 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  ;.  rc = balance
27620 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20  (pParent, 0);.  
27630 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
27640 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
27650 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
27660 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
27670 69 74 65 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  iteFree(apCell);
27680 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
27690 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ld; i++){.    re
276a0 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
276b0 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  i]);.  }.  for(i
276c0 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
276d0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
276e0 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d  e(apNew[i]);.  }
276f0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
27700 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45  Parent);.  TRACE
27710 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
27720 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c  shed with %d: ol
27730 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
27740 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
27750 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
27760 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
27770 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  l));.  return rc
27780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
27790 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
277a0 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  d for the root p
277b0 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77  age of a btree w
277c0 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  hen the root.** 
277d0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
277e0 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73   cells.  This is
277f0 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
27800 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65  to make the tree
27810 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79  .** shallower by
27820 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73   one level..*/.s
27830 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
27840 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50  e_shallower(MemP
27850 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
27860 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
27870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27880 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61  he only child pa
27890 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  ge of pPage */. 
278a0 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b   Pgno pgnoChild;
278b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
278c0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
278d0 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74   pChild */.  int
278e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
278f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
27900 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
27910 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
27920 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27940 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72   /* The main BTr
27950 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
27960 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50    int mxCellPerP
27970 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
27980 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
27990 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61   of cells per pa
279a0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
279b0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
279c0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
279d0 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69  s from pages bei
279e0 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
279f0 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   int *szCell;   
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27a10 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
27a20 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61  ll cells */..  a
27a30 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50  ssert( pPage->pP
27a40 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  arent==0 );.  as
27a50 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
27a60 6c 6c 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d  ll==0 );.  pBt =
27a70 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d   pPage->pBt;.  m
27a80 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d  xCellPerPage = M
27a90 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61  X_CELL(pBt);.  a
27aa0 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61  pCell = sqliteMa
27ab0 6c 6c 6f 63 52 61 77 28 20 6d 78 43 65 6c 6c 50  llocRaw( mxCellP
27ac0 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75  erPage*(sizeof(u
27ad0 38 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  8*)+sizeof(int))
27ae0 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
27af0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
27b00 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43  ITE_NOMEM;.  szC
27b10 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43  ell = (int*)&apC
27b20 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67  ell[mxCellPerPag
27b30 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  e];.  if( pPage-
27b40 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  >leaf ){.    /* 
27b50 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  The table is com
27b60 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f  pletely empty */
27b70 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
27b80 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c  ANCE: empty tabl
27b90 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  e %d\n", pPage->
27ba0 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
27bb0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
27bc0 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62   page is empty b
27bd0 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64  ut has one child
27be0 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
27bf0 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
27c00 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65  on from that one
27c10 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20   child into the 
27c20 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20  root page if it 
27c30 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74  .    ** will fit
27c40 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
27c50 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
27c60 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20   tree by one..  
27c70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
27c80 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
27c90 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
27ca0 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
27cb0 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ble than.    ** 
27cc0 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
27cd0 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
27ce0 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
27cf0 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
27d00 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
27d10 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20   database fle), 
27d20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  so it might not 
27d30 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  be able to hold 
27d40 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20  all of the .    
27d50 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
27d60 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
27d70 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
27d80 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
27d90 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74   .    ** case, t
27da0 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  hen do not do th
27db0 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61  e transfer.  Lea
27dc0 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20  ve page 1 empty 
27dd0 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
27de0 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
27df0 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64  ter to the child
27e00 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c   page.  The chil
27e10 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20  d page becomes. 
27e20 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61     ** the virtua
27e30 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  l root of the tr
27e40 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ee..    */.    p
27e50 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
27e60 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
27e70 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
27e80 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
27e90 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20  rt( pgnoChild>0 
27ea0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27eb0 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65  gnoChild<=sqlite
27ec0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
27ed0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
27ee0 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
27ef0 67 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70  getPage(pPage->p
27f00 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26  Bt, pgnoChild, &
27f10 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20  pChild, 0);.    
27f20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
27f30 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
27f40 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
27f50 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ->pgno==1 ){.   
27f60 20 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65     rc = initPage
27f70 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b  (pChild, pPage);
27f80 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
27f90 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
27fa0 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20  _balance;.      
27fb0 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
27fc0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
27fd0 20 20 20 20 20 20 69 66 28 20 70 43 68 69 6c 64        if( pChild
27fe0 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a  ->nFree>=100 ){.
27ff0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
28000 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hild information
28010 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
28020 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64   root page, so d
28030 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
28040 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20   copy */.       
28050 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
28060 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
28070 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
28080 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
28090 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43  =0; i<pChild->nC
280a0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
280b0 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d       apCell[i] =
280c0 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64   findCell(pChild
280d0 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ,i);.          s
280e0 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53  zCell[i] = cellS
280f0 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61  izePtr(pChild, a
28100 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  pCell[i]);.     
28110 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
28120 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c  emblePage(pPage,
28130 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20   pChild->nCell, 
28140 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b  apCell, szCell);
28150 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  .        /* Copy
28160 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
28170 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
28180 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a  to the parent. *
28190 2f 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  /.        put4by
281a0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
281b0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
281c0 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  t+8], .         
281d0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 43 68     get4byte(&pCh
281e0 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c  ild->aData[pChil
281f0 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  d->hdrOffset+8])
28200 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  );.        freeP
28210 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
28220 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
28230 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74  ANCE: child %d t
28240 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20  ransfer to page 
28250 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67  1\n", pChild->pg
28260 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  no));.      }els
28270 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
28280 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65  e child has more
28290 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
282a0 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
282b0 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20  e root..        
282c0 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73 20 61  ** The tree is a
282d0 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e  lready balanced.
282e0 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f    Do nothing. */
282f0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
28300 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20  "BALANCE: child 
28310 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  %d will not fit 
28320 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43  on page 1\n", pC
28330 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
28340 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
28350 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
28360 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69  age->aData, pChi
28370 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65  ld->aData, pPage
28380 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
28390 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  e);.      pPage-
283a0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
283b0 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
283c0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
283d0 3d 20 69 6e 69 74 50 61 67 65 28 70 50 61 67 65  = initPage(pPage
283e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
283f0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
28400 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50  K );.      freeP
28410 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
28420 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
28430 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69  CE: transfer chi
28440 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20  ld %d into root 
28450 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
28460 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e       pChild->pgn
28470 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  o, pPage->pgno))
28480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
28490 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
284a0 67 65 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ges(pPage);.    
284b0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
284c0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23  Overflow==0 );.#
284d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
284e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
284f0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
28500 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 69  acuum ){.      i
28510 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
28520 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
28530 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  ell; i++){ .    
28540 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
28550 75 74 4f 76 66 6c 28 70 50 61 67 65 2c 20 69 29  utOvfl(pPage, i)
28560 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28580 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
28590 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
285a0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
285b0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
285c0 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  f.    if( rc!=SQ
285d0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
285e0 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
285f0 63 65 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  ce;.    releaseP
28600 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d  age(pChild);.  }
28610 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c  .end_shallow_bal
28620 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 46 72  ance:.  sqliteFr
28630 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65  ee(apCell);.  re
28640 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
28650 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
28660 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a   is overfull.**.
28670 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68 61 70  ** When this hap
28680 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61 20 6e  pens, Create a n
28690 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 61 6e  ew child page an
286a0 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f  d copy the.** co
286b0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f  ntents of the ro
286c0 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c  ot into the chil
286d0 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20 74 68  d.  Then make th
286e0 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61  e root.** page a
286f0 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74  n empty page wit
28700 68 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69  h rightChild poi
28710 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77  nting to the new
28720 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46 69 6e  .** child.   Fin
28730 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e  ally, call balan
28740 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e  ce_internal() on
28750 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a   the new child.*
28760 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20 74 6f  * to cause it to
28770 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69   split..*/.stati
28780 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65  c int balance_de
28790 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  eper(MemPage *pP
287a0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  age){.  int rc; 
287b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
287c0 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
287d0 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
287e0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  /.  MemPage *pCh
287f0 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ild;    /* Point
28800 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  er to a new chil
28810 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  d page */.  Pgno
28820 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20   pgnoChild;     
28830 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
28840 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  f the new child 
28850 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  page */.  BtShar
28860 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
28870 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f   /* The BTree */
28880 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
28890 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
288a0 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61  usable size of a
288b0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64   page */.  u8 *d
288c0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ata;           /
288d0 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
288e0 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a   parent page */.
288f0 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20 20 20    u8 *cdata;    
28900 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
28910 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
28920 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ge */.  int hdr;
28930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
28940 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68 65  ffset to page he
28950 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74 20 2a  ader in parent *
28960 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20 20 20  /.  int brk;    
28970 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
28980 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t to content of 
28990 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 70 61  first cell in pa
289a0 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  rent */..  asser
289b0 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  t( pPage->pParen
289c0 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
289d0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
289e0 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74 20 3d 20  ow>0 );.  pBt = 
289f0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 72 63  pPage->pBt;.  rc
28a00 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
28a10 50 61 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c  Page(pBt, &pChil
28a20 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70  d, &pgnoChild, p
28a30 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a  Page->pgno, 0);.
28a40 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
28a50 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  n rc;.  assert( 
28a60 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
28a70 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e  iteable(pChild->
28a80 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73  pDbPage) );.  us
28a90 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
28aa0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61  usableSize;.  da
28ab0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
28ac0 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
28ad0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 62  ->hdrOffset;.  b
28ae0 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
28af0 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63  ata[hdr+5]);.  c
28b00 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61  data = pChild->a
28b10 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63  Data;.  memcpy(c
28b20 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d  data, &data[hdr]
28b30 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  , pPage->cellOff
28b40 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65  set+2*pPage->nCe
28b50 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70  ll-hdr);.  memcp
28b60 79 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c 20 26  y(&cdata[brk], &
28b70 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c  data[brk], usabl
28b80 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20 61 73  eSize-brk);.  as
28b90 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73  sert( pChild->is
28ba0 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20  Init==0 );.  rc 
28bb0 3d 20 69 6e 69 74 50 61 67 65 28 70 43 68 69 6c  = initPage(pChil
28bc0 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 69 66 28  d, pPage);.  if(
28bd0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
28be0 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20  cedeeper_out;.  
28bf0 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61  memcpy(pChild->a
28c00 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76  Ovfl, pPage->aOv
28c10 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  fl, pPage->nOver
28c20 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67  flow*sizeof(pPag
28c30 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20  e->aOvfl[0]));. 
28c40 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
28c50 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ow = pPage->nOve
28c60 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43 68  rflow;.  if( pCh
28c70 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ild->nOverflow )
28c80 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46  {.    pChild->nF
28c90 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ree = 0;.  }.  a
28ca0 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
28cb0 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  Cell==pPage->nCe
28cc0 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  ll );.  zeroPage
28cd0 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
28ce0 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f  aData[0] & ~PTF_
28cf0 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74  LEAF);.  put4byt
28d00 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
28d10 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
28d20 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  +8], pgnoChild);
28d30 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
28d40 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64  CE: copy root %d
28d50 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61   into %d\n", pPa
28d60 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64  ge->pgno, pChild
28d70 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64 65  ->pgno));.#ifnde
28d80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
28d90 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
28da0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
28db0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
28dc0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
28dd0 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  pBt, pChild->pgn
28de0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
28df0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
28e00 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
28e10 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f   balancedeeper_o
28e20 75 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ut;.    for(i=0;
28e30 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c   i<pChild->nCell
28e40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
28e50 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
28e60 28 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20  (pChild, i);.   
28e70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28e80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28e90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28ea0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
28eb0 64 69 66 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e  dif.  rc = balan
28ec0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c  ce_nonroot(pChil
28ed0 64 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70  d);..balancedeep
28ee0 65 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73  er_out:.  releas
28ef0 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
28f00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28f10 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69 66 20 74  *.** Decide if t
28f20 68 65 20 70 61 67 65 20 70 50 61 67 65 20 6e 65  he page pPage ne
28f30 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63  eds to be balanc
28f40 65 64 2e 20 20 49 66 20 62 61 6c 61 6e 63 69 6e  ed.  If balancin
28f50 67 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64  g is.** required
28f60 2c 20 63 61 6c 6c 20 74 68 65 20 61 70 70 72 6f  , call the appro
28f70 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67  priate balancing
28f80 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
28f90 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
28fa0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
28fb0 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20 20 69  int insert){.  i
28fc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28fd0 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  K;.  if( pPage->
28fe0 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20  pParent==0 ){.  
28ff0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
29000 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20  erflow>0 ){.    
29010 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64    rc = balance_d
29020 65 65 70 65 72 28 70 50 61 67 65 29 3b 0a 20 20  eeper(pPage);.  
29030 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
29040 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
29050 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  ge->nCell==0 ){.
29060 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
29070 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50 61  ce_shallower(pPa
29080 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ge);.    }.  }el
29090 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  se{.    if( pPag
290a0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  e->nOverflow>0 |
290b0 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69 6e 73  | .        (!ins
290c0 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ert && pPage->nF
290d0 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ree>pPage->pBt->
290e0 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20  usableSize*2/3) 
290f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
29100 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50  lance_nonroot(pP
29110 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
29120 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29130 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
29140 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75  ne checks all cu
29150 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74  rsors that point
29160 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f   to table pgnoRo
29170 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66  ot..** If any of
29180 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77   those cursors w
29190 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ere opened with 
291a0 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64  wrFlag==0 in a d
291b0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61  ifferent.** data
291c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
291d0 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  (a database conn
291e0 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72  ection that shar
291f0 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  es the pager.** 
29200 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63  cache with the c
29210 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  urrent connectio
29220 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65  n) and that othe
29230 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  r connection .**
29240 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52   is not in the R
29250 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20  eadUncommmitted 
29260 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
29270 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
29280 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b   .** SQLITE_LOCK
29290 45 44 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64  ED..**.** In add
292a0 69 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69 6e  ition to checkin
292b0 67 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b 73  g for read-locks
292c0 20 28 77 68 65 72 65 20 61 20 72 65 61 64 2d 6c   (where a read-l
292d0 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61 20  ock .** means a 
292e0 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 77 69  cursor opened wi
292f0 74 68 20 77 72 46 6c 61 67 3d 3d 30 29 20 74 68  th wrFlag==0) th
29300 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
29310 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 63 75 72  moves.** all cur
29320 73 6f 72 73 20 77 72 69 74 65 20 63 75 72 73 6f  sors write curso
29330 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  rs so that they 
29340 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  are pointing to 
29350 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 43 65  the .** first Ce
29360 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70  ll on the root p
29370 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  age.  This is ne
29380 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
29390 61 6e 20 69 6e 73 65 72 74 20 0a 2a 2a 20 6f 72  an insert .** or
293a0 20 64 65 6c 65 74 65 20 6d 69 67 68 74 20 63 68   delete might ch
293b0 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65 72 20  ange the number 
293c0 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61 20 70 61  of cells on a pa
293d0 67 65 20 6f 72 20 64 65 6c 65 74 65 0a 2a 2a 20  ge or delete.** 
293e0 61 20 70 61 67 65 20 65 6e 74 69 72 65 6c 79 20  a page entirely 
293f0 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  and we do not wa
29400 6e 74 20 74 6f 20 6c 65 61 76 65 20 61 6e 79 20  nt to leave any 
29410 63 75 72 73 6f 72 73 20 0a 2a 2a 20 70 6f 69 6e  cursors .** poin
29420 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78 69 73  ting to non-exis
29430 74 61 6e 74 20 70 61 67 65 73 20 6f 72 20 63 65  tant pages or ce
29440 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lls..*/.static i
29450 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  nt checkReadLock
29460 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
29470 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20   Pgno pgnoRoot, 
29480 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75  BtCursor *pExclu
29490 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  de){.  BtCursor 
294a0 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  *p;.  BtShared *
294b0 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42  pBt = pBtree->pB
294c0 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
294d0 20 3d 20 70 42 74 72 65 65 2d 3e 70 53 71 6c 69   = pBtree->pSqli
294e0 74 65 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d  te;.  for(p=pBt-
294f0 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
29500 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
29510 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20  ( p==pExclude ) 
29520 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
29530 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  ( p->eState!=CUR
29540 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74  SOR_VALID ) cont
29550 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
29560 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52  >pgnoRoot!=pgnoR
29570 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  oot ) continue;.
29580 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61      if( p->wrFla
29590 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  g==0 ){.      sq
295a0 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d  lite3 *dbOther =
295b0 20 70 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c   p->pBtree->pSql
295c0 69 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ite;.      if( d
295d0 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20 20 20  bOther==0 ||.   
295e0 20 20 20 20 20 20 28 64 62 4f 74 68 65 72 21 3d        (dbOther!=
295f0 64 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e  db && (dbOther->
29600 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
29610 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d  eadUncommitted)=
29620 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =0) ){.        r
29630 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
29640 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KED;.      }.   
29650 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 50   }else if( p->pP
29660 61 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e 70 67  age->pgno!=p->pg
29670 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  noRoot ){.      
29680 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b 0a 20  moveToRoot(p);. 
29690 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
296a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
296b0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
296c0 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
296d0 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b  he BTree.  The k
296e0 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ey is given by (
296f0 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e  pKey,nKey).** an
29700 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69  d the data is gi
29710 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44  ven by (pData,nD
29720 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f  ata).  The curso
29730 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  r is used only t
29740 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74  o.** define what
29750 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72   table the recor
29760 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  d should be inse
29770 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20  rted into.  The 
29780 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
29790 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
297a0 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e  random location.
297b0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e  .**.** For an IN
297c0 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79  TKEY table, only
297d0 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20   the nKey value 
297e0 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73  of the key is us
297f0 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20  ed.  pKey is.** 
29800 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20  ignored.  For a 
29810 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20  ZERODATA table, 
29820 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44  the pData and nD
29830 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e  ata are both ign
29840 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ored..*/.int sql
29850 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
29860 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
29870 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
29880 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
29890 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20   into the table 
298a0 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  of this cursor *
298b0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
298c0 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
298d0 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66     /* The key of
298e0 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
298f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
29900 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
29910 61 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  a   /* The data 
29920 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
29930 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
29940 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69  ;.  int loc;.  i
29950 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50  nt szNew;.  MemP
29960 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
29970 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
29980 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b  ur->pBtree->pBt;
29990 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
299a0 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
299b0 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
299c0 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ell = 0;..  if( 
299d0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
299e0 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on!=TRANS_WRITE 
299f0 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73  ){.    /* Must s
29a00 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
29a10 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20  on before doing 
29a20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20  an insert */.   
29a30 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
29a40 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
29a50 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
29a60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73  _ERROR;.  }.  as
29a70 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
29a80 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70  Only );.  if( !p
29a90 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Cur->wrFlag ){. 
29aa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29ab0 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73  _PERM;   /* Curs
29ac0 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20  or not open for 
29ad0 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
29ae0 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
29af0 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
29b00 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
29b10 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72  , pCur) ){.    r
29b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
29b30 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c  KED; /* The tabl
29b40 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
29b50 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
29b60 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61   */.  }..  /* Sa
29b70 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
29b80 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
29b90 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
29ba0 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 65  is table */.  re
29bb0 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
29bc0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c  orPosition(pCur,
29bd0 20 30 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20   0);.  if( .    
29be0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
29bf0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
29c00 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
29c10 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20  oot, pCur)) ||. 
29c20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
29c30 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
29c40 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65  Moveto(pCur, pKe
29c50 79 2c 20 6e 4b 65 79 2c 20 26 6c 6f 63 29 29 0a  y, nKey, &loc)).
29c60 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
29c70 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  rc;.  }..  pPage
29c80 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
29c90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
29ca0 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e  >intKey || nKey>
29cb0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
29cc0 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21  pPage->leaf || !
29cd0 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
29ce0 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53  );.  TRACE(("INS
29cf0 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b  ERT: table=%d nk
29d00 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64  ey=%lld ndata=%d
29d10 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a   page=%d %s\n",.
29d20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
29d30 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20  pgnoRoot, nKey, 
29d40 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67  nData, pPage->pg
29d50 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f  no,.          lo
29d60 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74  c==0 ? "overwrit
29d70 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22  e" : "new entry"
29d80 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
29d90 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
29da0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29db0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
29dc0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
29dd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
29de0 20 6e 65 77 43 65 6c 6c 20 3d 20 73 71 6c 69 74   newCell = sqlit
29df0 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58 5f 43  eMallocRaw( MX_C
29e00 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
29e10 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
29e20 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
29e30 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
29e40 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
29e50 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
29e60 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
29e70 61 74 61 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20  ata, &szNew);.  
29e80 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
29e90 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65  d_insert;.  asse
29ea0 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53  rt( szNew==cellS
29eb0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65  izePtr(pPage, ne
29ec0 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  wCell) );.  asse
29ed0 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45  rt( szNew<=MX_CE
29ee0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
29ef0 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20    if( loc==0 && 
29f00 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
29f10 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
29f20 20 20 69 6e 74 20 73 7a 4f 6c 64 3b 0a 20 20 20    int szOld;.   
29f30 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29f40 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
29f50 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
29f60 29 3b 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d  );.    oldCell =
29f70 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
29f80 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 20   pCur->idx);.   
29f90 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
29fa0 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  f ){.      memcp
29fb0 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65  y(newCell, oldCe
29fc0 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 4);.    }.  
29fd0 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69    szOld = cellSi
29fe0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64  zePtr(pPage, old
29ff0 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  Cell);.    rc = 
2a000 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
2a010 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69   oldCell);.    i
2a020 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2a030 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 64 72 6f  _insert;.    dro
2a040 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  pCell(pPage, pCu
2a050 72 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a  r->idx, szOld);.
2a060 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c    }else if( loc<
2a070 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c  0 && pPage->nCel
2a080 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  l>0 ){.    asser
2a090 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
2a0a0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2b  ;.    pCur->idx+
2a0b0 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  +;.    pCur->inf
2a0c0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d  o.nSize = 0;.  }
2a0d0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2a0e0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
2a0f0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65  .  }.  rc = inse
2a100 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  rtCell(pPage, pC
2a110 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c 6c  ur->idx, newCell
2a120 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  , szNew, 0, 0);.
2a130 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a140 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69  _OK ) goto end_i
2a150 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62 61  nsert;.  rc = ba
2a160 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 31 29 3b  lance(pPage, 1);
2a170 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 42 74 72  .  /* sqlite3Btr
2a180 65 65 50 61 67 65 44 75 6d 70 28 70 43 75 72 2d  eePageDump(pCur-
2a190 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  >pBt, pCur->pgno
2a1a0 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f  Root, 1); */.  /
2a1b0 2a 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  * fflush(stdout)
2a1c0 3b 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  ; */.  if( rc==S
2a1d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a1e0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2a1f0 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74  ;.  }.end_insert
2a200 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 6e  :.  sqliteFree(n
2a210 65 77 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72  ewCell);.  retur
2a220 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
2a230 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20  elete the entry 
2a240 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
2a250 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
2a260 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
2a270 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2a280 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  at a random loca
2a290 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
2a2a0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
2a2b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2a2c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2a2d0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2a2e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2a2f0 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72   *pCell;.  int r
2a300 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  c;.  Pgno pgnoCh
2a310 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  ild = 0;.  BtSha
2a320 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
2a330 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20  >pBtree->pBt;.. 
2a340 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a350 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
2a360 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
2a370 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on!=TRANS_WRITE 
2a380 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73  ){.    /* Must s
2a390 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
2a3a0 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20  on before doing 
2a3b0 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20  a delete */.    
2a3c0 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64  return pBt->read
2a3d0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2a3e0 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2a3f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73  ERROR;.  }.  ass
2a400 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
2a410 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43 75  nly );.  if( pCu
2a420 72 2d 3e 69 64 78 20 3e 3d 20 70 50 61 67 65 2d  r->idx >= pPage-
2a430 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65  >nCell ){.    re
2a440 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2a450 52 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  R;  /* The curso
2a460 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2a470 67 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f  g to anything */
2a480 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 43 75 72  .  }.  if( !pCur
2a490 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ->wrFlag ){.    
2a4a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
2a4b0 52 4d 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74  RM;   /* Did not
2a4c0 20 6f 70 65 6e 20 74 68 69 73 20 63 75 72 73 6f   open this curso
2a4d0 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f  r for writing */
2a4e0 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b  .  }.  if( check
2a4f0 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e  ReadLocks(pCur->
2a500 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67  pBtree, pCur->pg
2a510 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b  noRoot, pCur) ){
2a520 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a530 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68  TE_LOCKED; /* Th
2a540 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69  e table pCur poi
2a550 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61  nts to has a rea
2a560 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20  d lock */.  }.. 
2a570 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   /* Restore the 
2a580 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
2a590 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70  osition (a no-op
2a5a0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2a5b0 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43  s not in .  ** C
2a5c0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2a5d0 4b 20 73 74 61 74 65 29 20 61 6e 64 20 73 61 76  K state) and sav
2a5e0 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
2a5f0 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72  of any other cur
2a600 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20  sors .  ** open 
2a610 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
2a620 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c  e. Then call sql
2a630 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2a640 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a   on the page.  *
2a650 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79  * that the entry
2a660 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
2a670 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66   from..  */.  if
2a680 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73  ( .    (rc = res
2a690 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
2a6a0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20  rPosition(pCur, 
2a6b0 31 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  1))!=0 ||.    (r
2a6c0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
2a6d0 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
2a6e0 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d  noRoot, pCur))!=
2a6f0 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73  0 ||.    (rc = s
2a700 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2a710 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2a720 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65  )!=0.  ){.    re
2a730 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2a740 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65  /* Locate the ce
2a750 6c 6c 20 77 69 74 68 69 6e 20 69 74 27 73 20 70  ll within it's p
2a760 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43  age and leave pC
2a770 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ell pointing to 
2a780 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54  the.  ** data. T
2a790 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63  he clearCell() c
2a7a0 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76  all frees any ov
2a7b0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
2a7c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2a7d0 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  .  ** cell. The 
2a7e0 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73  cell itself is s
2a7f0 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a  till intact..  *
2a800 2f 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  /.  pCell = find
2a810 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2a820 2d 3e 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70  ->idx);.  if( !p
2a830 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2a840 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
2a850 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
2a860 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43   }.  rc = clearC
2a870 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2a880 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
2a890 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
2a8a0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2a8b0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
2a8c0 65 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61  e entry we are a
2a8d0 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69  bout to delete i
2a8e0 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20  s not a leaf so 
2a8f0 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20  if we do not.   
2a900 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   ** do something
2a910 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61   we will leave a
2a920 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65   hole on an inte
2a930 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a  rnal page..    *
2a940 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c  * We have to fil
2a950 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f  l the hole by mo
2a960 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66  ving in a cell f
2a970 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65  rom a leaf.  The
2a980 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c  .    ** next Cel
2a990 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20  l after the one 
2a9a0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73  to be deleted is
2a9b0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
2a9c0 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  xist and.    ** 
2a9d0 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20  to be a leaf so 
2a9e0 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20  we can use it.. 
2a9f0 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73     */.    BtCurs
2aa00 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20  or leafCur;.    
2aa10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2aa20 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Next;.    int sz
2aa30 4e 65 78 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f  Next;  /* The co
2aa40 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 69  mpiler warning i
2aa50 73 20 77 72 6f 6e 67 3a 20 73 7a 4e 65 78 74 20  s wrong: szNext 
2aa60 69 73 20 61 6c 77 61 79 73 20 0a 20 20 20 20 20  is always .     
2aa70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2aa80 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72  nitialized befor
2aa90 65 20 75 73 65 2e 20 20 41 64 64 69 6e 67 20 61  e use.  Adding a
2aaa0 6e 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69  n extra initiali
2aab0 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  zation.         
2aac0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 69          ** to si
2aad0 6c 65 6e 63 65 20 74 68 65 20 63 6f 6d 70 69 6c  lence the compil
2aae0 65 72 20 73 6c 6f 77 73 20 64 6f 77 6e 20 74 68  er slows down th
2aaf0 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69  e code. */.    i
2ab00 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  nt notUsed;.    
2ab10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
2ab20 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20  empCell = 0;.   
2ab30 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 2d   assert( !pPage-
2ab40 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20  >leafData );.   
2ab50 20 67 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70   getTempCursor(p
2ab60 43 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a  Cur, &leafCur);.
2ab70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ab80 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43  BtreeNext(&leafC
2ab90 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20  ur, &notUsed);. 
2aba0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2abb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
2abc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc!=SQLITE_NOM
2abd0 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  EM ){.        rc
2abe0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2abf0 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
2ac00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2ac10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ac20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ac30 65 33 50 61 67 65 72 57 72 69 74 65 28 6c 65 61  e3PagerWrite(lea
2ac40 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 44 62 50  fCur.pPage->pDbP
2ac50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
2ac60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ac70 4b 20 29 7b 0a 20 20 20 20 20 20 54 52 41 43 45  K ){.      TRACE
2ac80 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65  (("DELETE: table
2ac90 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72  =%d delete inter
2aca0 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c  nal from %d repl
2acb0 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ace from leaf %d
2acc0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43  \n",.         pC
2acd0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50  ur->pgnoRoot, pP
2ace0 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43  age->pgno, leafC
2acf0 75 72 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  ur.pPage->pgno))
2ad00 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c  ;.      dropCell
2ad10 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2ad20 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
2ad30 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20  Page, pCell));. 
2ad40 20 20 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e       pNext = fin
2ad50 64 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50  dCell(leafCur.pP
2ad60 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78  age, leafCur.idx
2ad70 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20  );.      szNext 
2ad80 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65  = cellSizePtr(le
2ad90 61 66 43 75 72 2e 70 50 61 67 65 2c 20 70 4e 65  afCur.pPage, pNe
2ada0 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xt);.      asser
2adb0 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  t( MX_CELL_SIZE(
2adc0 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29  pBt)>=szNext+4 )
2add0 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c  ;.      tempCell
2ade0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
2adf0 61 77 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  aw( MX_CELL_SIZE
2ae00 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 69  (pBt) );.      i
2ae10 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29  f( tempCell==0 )
2ae20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2ae30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2ae40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2ae50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ae60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   ){.      rc = i
2ae70 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c  nsertCell(pPage,
2ae80 20 70 43 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78   pCur->idx, pNex
2ae90 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74  t-4, szNext+4, t
2aea0 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20  empCell, 0);.   
2aeb0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2aec0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2aed0 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
2aee0 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67  verflowCell(pPag
2aef0 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 2c 20 70  e, pCur->idx), p
2af00 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  gnoChild);.     
2af10 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
2af20 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  age, 0);.    }. 
2af30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2af40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 64 72  E_OK ){.      dr
2af50 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70  opCell(leafCur.p
2af60 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64  Page, leafCur.id
2af70 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20  x, szNext);.    
2af80 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c    rc = balance(l
2af90 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 30 29  eafCur.pPage, 0)
2afa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2afb0 74 65 46 72 65 65 28 74 65 6d 70 43 65 6c 6c 29  teFree(tempCell)
2afc0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 54 65 6d  ;.    releaseTem
2afd0 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72  pCursor(&leafCur
2afe0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2aff0 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20  TRACE(("DELETE: 
2b000 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20  table=%d delete 
2b010 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
2b020 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67  .       pCur->pg
2b030 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70  noRoot, pPage->p
2b040 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43  gno));.    dropC
2b050 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2b060 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74  >idx, cellSizePt
2b070 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
2b080 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e  ;.    rc = balan
2b090 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ce(pPage, 0);.  
2b0a0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2b0b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76  TE_OK ){.    mov
2b0c0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2b0d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2b0e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2b0f0 61 20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c  a new BTree tabl
2b100 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  e.  Write into *
2b110 70 69 54 61 62 6c 65 20 74 68 65 20 70 61 67 65  piTable the page
2b120 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
2b130 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
2b140 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  the new table..*
2b150 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66  *.** The type of
2b160 20 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69   type is determi
2b170 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73  ned by the flags
2b180 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c   parameter.  Onl
2b190 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  y the.** followi
2b1a0 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61  ng values of fla
2b1b0 67 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  gs are currently
2b1c0 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20   in use.  Other 
2b1d0 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c  values for.** fl
2b1e0 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f  ags might not wo
2b1f0 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54  rk:.**.**     BT
2b200 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45  REE_INTKEY|BTREE
2b210 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 55 73  _LEAFDATA     Us
2b220 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65  ed for SQL table
2b230 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79  s with rowid key
2b240 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a  s.**     BTREE_Z
2b250 45 52 4f 44 41 54 41 20 20 20 20 20 20 20 20 20  ERODATA         
2b260 20 20 20 20 20 20 20 20 20 55 73 65 64 20 66 6f           Used fo
2b270 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f  r SQL indices.*/
2b280 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2b290 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
2b2a0 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
2b2b0 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
2b2c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2b2d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
2b2e0 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50  Page *pRoot;.  P
2b2f0 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  gno pgnoRoot;.  
2b300 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 42  int rc;.  if( pB
2b310 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2b320 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2b330 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2b340 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2b350 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 72 65   first */.    re
2b360 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
2b370 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2b380 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2b390 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ROR;.  }.  asser
2b3a0 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
2b3b0 79 20 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  y );..  /* It is
2b3c0 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 72 65 61   illegal to crea
2b3d0 74 65 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e  te a table if an
2b3e0 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70  y cursors are op
2b3f0 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  en on the.  ** d
2b400 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
2b410 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f   because in auto
2b420 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65  -vacuum mode the
2b430 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a   backend may.  *
2b440 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61  * need to move a
2b450 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 74   database page t
2b460 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
2b470 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
2b480 65 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 20 6f 70  e..  ** If an op
2b490 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75 73  en cursor was us
2b4a0 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 20 70  ing the page a p
2b4b0 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 6f 63 63  roblem would occ
2b4c0 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ur..  */.  if( p
2b4d0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Bt->pCursor ){. 
2b4e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b4f0 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 23 69  _LOCKED;.  }..#i
2b500 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
2b510 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63  _AUTOVACUUM.  rc
2b520 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2b530 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74  Page(pBt, &pRoot
2b540 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20  , &pgnoRoot, 1, 
2b550 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
2b560 65 74 75 72 6e 20 72 63 3b 0a 23 65 6c 73 65 0a  eturn rc;.#else.
2b570 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2b580 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
2b590 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20  o pgnoMove;     
2b5a0 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20   /* Move a page 
2b5b0 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f  here to make roo
2b5c0 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  m for the root-p
2b5d0 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  age */.    MemPa
2b5e0 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f  ge *pPageMove; /
2b5f0 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f  * The page to mo
2b600 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f  ve to. */..    /
2b610 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65  * Read the value
2b620 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d   of meta[3] from
2b630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
2b640 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65   determine where
2b650 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74   the.    ** root
2b660 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
2b670 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f   table should go
2b680 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65  . meta[3] is the
2b690 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
2b6a0 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  ge.    ** create
2b6b0 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65  d so far, so the
2b6c0 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69   new root-page i
2b6d0 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20  s (meta[3]+1).. 
2b6e0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2b6f0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
2b700 74 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f  ta(p, 4, &pgnoRo
2b710 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ot);.    if( rc!
2b720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2b730 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 67 6e 6f  urn rc;.    pgno
2b740 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  Root++;..    /* 
2b750 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  The new root-pag
2b760 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c  e may not be all
2b770 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e  ocated on a poin
2b780 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72  ter-map page, or
2b790 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44   the.    ** PEND
2b7a0 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20  ING_BYTE page.. 
2b7b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
2b7c0 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50  noRoot==PTRMAP_P
2b7d0 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52  AGENO(pBt, pgnoR
2b7e0 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  oot) ||.        
2b7f0 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e  pgnoRoot==PENDIN
2b800 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2b810 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f   ){.      pgnoRo
2b820 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ot++;.    }.    
2b830 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74  assert( pgnoRoot
2b840 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  >=3 );..    /* A
2b850 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20  llocate a page. 
2b860 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 75  The page that cu
2b870 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20  rrently resides 
2b880 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c  at pgnoRoot will
2b890 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64  .    ** be moved
2b8a0 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
2b8b0 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74  d page (unless t
2b8c0 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2b8d0 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a  e happens.    **
2b8e0 20 74 6f 20 72 65 73 69 64 65 20 61 74 20 70 67   to reside at pg
2b8f0 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a  noRoot)..    */.
2b900 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2b910 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2b920 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e  &pPageMove, &pgn
2b930 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c  oMove, pgnoRoot,
2b940 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   1);.    if( rc!
2b950 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b960 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2b970 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67     }..    if( pg
2b980 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74  noMove!=pgnoRoot
2b990 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79   ){.      u8 eTy
2b9a0 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  pe;.      Pgno i
2b9b0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20  PtrPage;..      
2b9c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2b9d0 65 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 72 63  eMove);.      rc
2b9e0 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
2b9f0 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
2ba00 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2ba10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ba20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2ba30 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2ba40 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
2ba50 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2ba60 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
2ba70 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2ba80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65  !=SQLITE_OK || e
2ba90 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
2baa0 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d  TPAGE || eType==
2bab0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
2bac0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2bad0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2bae0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2baf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bb00 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
2bb10 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
2bb20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2bb30 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52  eType!=PTRMAP_FR
2bb40 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  EEPAGE );.      
2bb50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2bb60 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
2bb70 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2bb80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2bb90 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2bba0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2bbb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2bbc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bbd0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
2bbe0 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54  e(pBt, pRoot, eT
2bbf0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70  ype, iPtrPage, p
2bc00 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  gnoMove);.      
2bc10 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2bc20 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
2bc30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2bc40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2bc50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bc60 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
2bc70 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f  , pgnoRoot, &pRo
2bc80 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ot, 0);.      if
2bc90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2bca0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2bcb0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2bcc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2bcd0 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74  PagerWrite(pRoot
2bce0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2bcf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2bd00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2bd10 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2bd20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2bd30 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2bd40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2bd50 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65  Root = pPageMove
2bd60 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a  ;.    } ..    /*
2bd70 20 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   Update the poin
2bd80 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61  ter-map and meta
2bd90 2d 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e  -data with the n
2bda0 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  ew root-page num
2bdb0 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ber. */.    rc =
2bdc0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2bdd0 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50  pgnoRoot, PTRMAP
2bde0 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20  _ROOTPAGE, 0);. 
2bdf0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2be00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2be10 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
2be20 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2be30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2be40 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
2be50 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20   4, pgnoRoot);. 
2be60 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2be70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2be80 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
2be90 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
2bea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2beb0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2bec0 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
2bed0 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
2bee0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2bef0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
2bf00 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73  ndif.  assert( s
2bf10 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2bf20 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44  teable(pRoot->pD
2bf30 62 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f  bPage) );.  zero
2bf40 50 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67  Page(pRoot, flag
2bf50 73 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20  s | PTF_LEAF);. 
2bf60 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2bf70 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  ef(pRoot->pDbPag
2bf80 65 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d  e);.  *piTable =
2bf90 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a   (int)pgnoRoot;.
2bfa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bfb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  OK;.}../*.** Era
2bfc0 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  se the given dat
2bfd0 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61  abase page and a
2bfe0 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e  ll its children.
2bff0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
2c000 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
2c010 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
2c020 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73  int clearDatabas
2c030 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2c040 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2c050 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74    /* The BTree t
2c060 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2c070 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f   table */.  Pgno
2c080 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
2c090 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2c0a0 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 4d   to clear */.  M
2c0b0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2c0c0 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70       /* Parent p
2c0d0 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74  age.  NULL for t
2c0e0 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74  he root */.  int
2c0f0 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 20 20   freePageFlag   
2c100 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
2c110 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f   page if true */
2c120 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
2c130 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
2c140 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
2c150 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
2c160 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f  t i;..  if( pgno
2c170 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  >sqlite3PagerPag
2c180 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
2c190 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
2c1a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2c1b0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63  _BKPT;.  }..  rc
2c1c0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2c1d0 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50  e(pBt, pgno, &pP
2c1e0 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  age, pParent);. 
2c1f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2c200 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2c210 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  _out;.  for(i=0;
2c220 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
2c230 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c   i++){.    pCell
2c240 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2c250 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21  e, i);.    if( !
2c260 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2c270 20 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44       rc = clearD
2c280 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
2c290 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
2c2a0 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  , pPage->pParent
2c2b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
2c2c0 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2c2d0 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2c2e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2c2f0 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
2c300 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
2c310 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2c320 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2c330 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
2c340 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2c350 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
2c360 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
2c370 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2c380 74 61 5b 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70  ta[8]), pPage->p
2c390 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20  Parent, 1);.    
2c3a0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2c3b0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2c3c0 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  out;.  }.  if( f
2c3d0 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20  reePageFlag ){. 
2c3e0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2c3f0 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  (pPage);.  }else
2c400 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
2c410 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2c420 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30  ge->pDbPage))==0
2c430 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   ){.    zeroPage
2c440 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61  (pPage, pPage->a
2c450 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45  Data[0] | PTF_LE
2c460 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64  AF);.  }..cleard
2c470 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a  atabasepage_out:
2c480 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2c490 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
2c4a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
2c4b0 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ete all informat
2c4c0 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ion from a singl
2c4d0 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  e table in the d
2c4e0 61 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65  atabase.  iTable
2c4f0 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20   is.** the page 
2c500 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f  number of the ro
2c510 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ot of the table.
2c520 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75    After this rou
2c530 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a  tine returns,.**
2c540 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
2c550 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69  s empty, but sti
2c560 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ll exists..**.**
2c570 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
2c580 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c  ll fail with SQL
2c590 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68  ITE_LOCKED if th
2c5a0 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e  ere are any open
2c5b0 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73  .** read cursors
2c5c0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   on the table.  
2c5d0 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f  Open write curso
2c5e0 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  rs are moved to 
2c5f0 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74  the.** root of t
2c600 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  he table..*/.int
2c610 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
2c620 61 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  arTable(Btree *p
2c630 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
2c640 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
2c650 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2c660 74 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  t;.  if( p->inTr
2c670 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2c680 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2c690 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2c6a0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2c6b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2c6c0 20 7d 0a 20 20 72 63 20 3d 20 63 68 65 63 6b 52   }.  rc = checkR
2c6d0 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62  eadLocks(p, iTab
2c6e0 6c 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  le, 0);.  if( rc
2c6f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2c700 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76  c;.  }..  /* Sav
2c710 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6f  e the position o
2c720 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  f all cursors op
2c730 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  en on this table
2c740 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
2c750 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
2c760 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69  llCursors(pBt, i
2c770 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20  Table, 0)) ){.  
2c780 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2c790 0a 0a 20 20 72 65 74 75 72 6e 20 63 6c 65 61 72  ..  return clear
2c7a0 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
2c7b0 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20  , (Pgno)iTable, 
2c7c0 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
2c7d0 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  Erase all inform
2c7e0 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65  ation in a table
2c7f0 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f   and add the roo
2c800 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  t of the table t
2c810 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73  o.** the freelis
2c820 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 20  t.  Except, the 
2c830 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e  root of the prin
2c840 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ciple table (the
2c850 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20   one on.** page 
2c860 31 29 20 69 73 20 6e 65 76 65 72 20 61 64 64 65  1) is never adde
2c870 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
2c880 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
2c890 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20  utine will fail 
2c8a0 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  with SQLITE_LOCK
2c8b0 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ED if there are 
2c8c0 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73  any open.** curs
2c8d0 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ors on the table
2c8e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56  ..**.** If AUTOV
2c8f0 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64  ACUUM is enabled
2c900 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 61 74   and the page at
2c910 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74   iTable is not t
2c920 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20  he last.** root 
2c930 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
2c940 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
2c950 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2c960 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ge .** in the da
2c970 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
2c980 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c  oved into the sl
2c990 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75  ot formerly occu
2c9a0 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c  pied by.** iTabl
2c9b0 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20  e and that last 
2c9c0 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63  slot formerly oc
2c9d0 63 75 70 69 65 64 20 62 79 20 74 68 65 20 6c 61  cupied by the la
2c9e0 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  st root page.** 
2c9f0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
2ca00 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64  freelist instead
2ca10 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20   of iTable.  In 
2ca20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a  this say, all.**
2ca30 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20   root pages are 
2ca40 6b 65 70 74 20 61 74 20 74 68 65 20 62 65 67 69  kept at the begi
2ca50 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
2ca60 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
2ca70 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72  h.** is necessar
2ca80 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d  y for AUTOVACUUM
2ca90 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20   to work right. 
2caa0 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74   *piMoved is set
2cab0 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   to the .** page
2cac0 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73 65   number that use
2cad0 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74  d to be the last
2cae0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
2caf0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a  e file before.**
2cb00 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e   the move.  If n
2cb10 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65  o page gets move
2cb20 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73  d, *piMoved is s
2cb30 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20  et to 0..** The 
2cb40 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69  last root page i
2cb50 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65  s recorded in me
2cb60 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61  ta[3] and the va
2cb70 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33  lue of.** meta[3
2cb80 5d 20 69 73 20 75 70 64 61 74 65 64 20 62 79 20  ] is updated by 
2cb90 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a  this procedure..
2cba0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2cbb0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72  reeDropTable(Btr
2cbc0 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
2cbd0 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29  e, int *piMoved)
2cbe0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
2cbf0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
2cc00 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2cc10 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 69  t = p->pBt;..  i
2cc20 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
2cc30 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2cc40 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
2cc50 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2cc60 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2cc70 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
2cc80 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  /* It is illegal
2cc90 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
2cca0 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20   if any cursors 
2ccb0 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
2ccc0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
2ccd0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
2cce0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
2ccf0 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d  de the backend m
2cd00 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  ay.  ** need to 
2cd10 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f  move another roo
2cd20 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61  t-page to fill a
2cd30 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
2cd40 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f   deleted.  ** ro
2cd50 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f  ot page. If an o
2cd60 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75  pen cursor was u
2cd70 73 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61  sing this page a
2cd80 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a   problem would .
2cd90 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f    ** occur..  */
2cda0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72  .  if( pBt->pCur
2cdb0 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sor ){.    retur
2cdc0 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2cdd0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74  .  }..  rc = get
2cde0 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
2cdf0 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20  iTable, &pPage, 
2ce00 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
2ce10 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
2ce20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
2ce30 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c  arTable(p, iTabl
2ce40 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
2ce50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2ce60 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  pPage);.    retu
2ce70 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70  rn rc;.  }..  *p
2ce80 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69  iMoved = 0;..  i
2ce90 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23  f( iTable>1 ){.#
2cea0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2ceb0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2cec0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2ced0 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Page);.    relea
2cee0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23  sePage(pPage);.#
2cef0 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42 74  else.    if( pBt
2cf00 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2cf10 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f        Pgno maxRo
2cf20 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63  otPgno;.      rc
2cf30 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2cf40 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61  etMeta(p, 4, &ma
2cf50 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
2cf60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2cf70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2cf80 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2cf90 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2cfa0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
2cfb0 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d       if( iTable=
2cfc0 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a  =maxRootPgno ){.
2cfd0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
2cfe0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
2cff0 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61 62  opped is the tab
2d000 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  le with the larg
2d010 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
2d020 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
2d030 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
2d040 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61   put the root pa
2d050 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c  ge on the free l
2d060 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ist. .        */
2d070 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
2d080 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2d090 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2d0a0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2d0b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d0c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d0d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2d0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2d0f0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
2d100 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
2d110 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20  ropped does not 
2d120 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73 74  have the largest
2d130 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
2d140 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20     ** number in 
2d150 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f  the database. So
2d160 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 74   move the page t
2d170 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68  hat does into th
2d180 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61  e .        ** ga
2d190 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65  p left by the de
2d1a0 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e  leted root-page.
2d1b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2d1c0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f      MemPage *pMo
2d1d0 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  ve;.        rele
2d1e0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2d1f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
2d200 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f  Page(pBt, maxRoo
2d210 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30  tPgno, &pMove, 0
2d220 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2d230 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d240 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2d250 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2d260 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
2d270 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d  catePage(pBt, pM
2d280 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  ove, PTRMAP_ROOT
2d290 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 29  PAGE, 0, iTable)
2d2a0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2d2b0 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
2d2c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d2d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d2e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d2f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d300 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
2d310 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
2d320 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20   &pMove, 0);.   
2d330 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2d340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d350 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d370 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2d380 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Move);.        r
2d390 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
2d3a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2d3b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d3c0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2d3d0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2d3e0 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20         *piMoved 
2d3f0 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20  = maxRootPgno;. 
2d400 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2d410 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61   Set the new 'ma
2d420 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c  x-root-page' val
2d430 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ue in the databa
2d440 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a  se header. This.
2d450 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
2d460 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f  old value less o
2d470 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72  ne, less one mor
2d480 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e  e if that happen
2d490 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65  s to.      ** be
2d4a0 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d   a root-page num
2d4b0 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67  ber, less one ag
2d4c0 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74  ain if that is t
2d4d0 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44  he.      ** PEND
2d4e0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20  ING_BYTE_PAGE.. 
2d4f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61       */.      ma
2d500 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
2d510 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
2d520 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
2d530 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
2d540 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
2d550 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o--;.      }.   
2d560 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
2d570 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  no==PTRMAP_PAGEN
2d580 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  O(pBt, maxRootPg
2d590 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  no) ){.        m
2d5a0 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
2d5b0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2d5c0 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21  rt( maxRootPgno!
2d5d0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2d5e0 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20  GE(pBt) );..    
2d5f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2d600 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
2d610 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29   4, maxRootPgno)
2d620 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d630 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2d640 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  (pPage);.      r
2d650 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2d660 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2d670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2d680 49 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  If sqlite3BtreeD
2d690 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c  ropTable was cal
2d6a0 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a  led on page 1. *
2d6b0 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  /.    zeroPage(p
2d6c0 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59  Page, PTF_INTKEY
2d6d0 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20  |PTF_LEAF );.   
2d6e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2d6f0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
2d700 6e 20 72 63 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a  n rc;  .}.../*.*
2d710 2a 20 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d  * Read the meta-
2d720 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
2d730 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  of a database fi
2d740 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20  le.  Meta[0].** 
2d750 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2d760 20 66 72 65 65 20 70 61 67 65 73 20 63 75 72 72   free pages curr
2d770 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74  ently in the dat
2d780 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a  abase.  Meta[1].
2d790 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b  ** through meta[
2d7a0 31 35 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c  15] are availabl
2d7b0 65 20 66 6f 72 20 75 73 65 20 62 79 20 68 69 67  e for use by hig
2d7c0 68 65 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74  her layers.  Met
2d7d0 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d  a[0].** is read-
2d7e0 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73  only, the others
2d7f0 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
2d800 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65  .** .** The sche
2d810 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73  ma layer numbers
2d820 20 6d 65 74 61 20 76 61 6c 75 65 73 20 64 69 66   meta values dif
2d830 66 65 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68  ferently.  At th
2d840 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65  e schema.** laye
2d850 72 20 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f  r (and the SetCo
2d860 6f 6b 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f  okie and ReadCoo
2d870 6b 69 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65  kie opcodes) the
2d880 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72   number of.** fr
2d890 65 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20  ee pages is not 
2d8a0 76 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f  visible.  So Coo
2d8b0 6b 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61  kie[0] is the sa
2d8c0 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a  me as Meta[1]..*
2d8d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2d8e0 65 65 47 65 74 4d 65 74 61 28 42 74 72 65 65 20  eeGetMeta(Btree 
2d8f0 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32  *p, int idx, u32
2d900 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61   *pMeta){.  DbPa
2d910 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 69  ge *pDbPage;.  i
2d920 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
2d930 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42  d char *pP1;.  B
2d940 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2d950 2d 3e 70 42 74 3b 0a 0a 20 20 2f 2a 20 52 65 61  ->pBt;..  /* Rea
2d960 64 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61  ding a meta-data
2d970 20 76 61 6c 75 65 20 72 65 71 75 69 72 65 73 20   value requires 
2d980 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70  a read-lock on p
2d990 61 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65  age 1 (and hence
2d9a0 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
2d9b0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57  _master table. W
2d9c0 65 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b  e grab this lock
2d9d0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2d9e0 68 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e  hether or.  ** n
2d9f0 6f 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65  ot the SQLITE_Re
2da00 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
2da10 61 67 20 69 73 20 73 65 74 20 28 74 68 65 20 74  ag is set (the t
2da20 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
2da30 61 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72  age.  ** 1 is tr
2da40 65 61 74 65 64 20 61 73 20 61 20 73 70 65 63 69  eated as a speci
2da50 61 6c 20 63 61 73 65 20 62 79 20 71 75 65 72 79  al case by query
2da60 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20  TableLock() and 
2da70 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20  lockTable())..  
2da80 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54  */.  rc = queryT
2da90 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52  ableLock(p, 1, R
2daa0 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
2dab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2dac0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2dad0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
2dae0 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31  idx>=0 && idx<=1
2daf0 35 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  5 );.  rc = sqli
2db00 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
2db10 3e 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62  >pPager, 1, &pDb
2db20 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2db30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
2db40 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  P1 = (unsigned c
2db50 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
2db60 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
2db70 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67  e);.  *pMeta = g
2db80 65 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20  et4byte(&pP1[36 
2db90 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73 71 6c  + idx*4]);.  sql
2dba0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2dbb0 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 49  DbPage);..  /* I
2dbc0 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69  f autovacuumed i
2dbd0 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
2dbe0 69 73 20 62 75 69 6c 64 20 62 75 74 20 77 65 20  is build but we 
2dbf0 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20  are trying to . 
2dc00 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75   ** access an au
2dc10 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61 62  tovacuumed datab
2dc20 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74  ase, then make t
2dc30 68 65 20 64 61 74 61 62 61 73 65 20 72 65 61 64  he database read
2dc40 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64  only. .  */.#ifd
2dc50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2dc60 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
2dc70 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61  idx==4 && *pMeta
2dc80 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e  >0 ) pBt->readOn
2dc90 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  ly = 1;.#endif..
2dca0 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 72 65    /* Grab the re
2dcb0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20  ad-lock on page 
2dcc0 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f 63  1. */.  rc = loc
2dcd0 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20 52 45 41  kTable(p, 1, REA
2dce0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75 72  D_LOCK);.  retur
2dcf0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
2dd00 72 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d  rite meta-inform
2dd10 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20  ation back into 
2dd20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d  the database.  M
2dd30 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61  eta[0] is.** rea
2dd40 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e  d-only and may n
2dd50 6f 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a  ot be written..*
2dd60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2dd70 65 65 55 70 64 61 74 65 4d 65 74 61 28 42 74 72  eeUpdateMeta(Btr
2dd80 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ee *p, int idx, 
2dd90 75 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74  u32 iMeta){.  Bt
2dda0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2ddb0 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  >pBt;.  unsigned
2ddc0 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e   char *pP1;.  in
2ddd0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
2dde0 69 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31  idx>=1 && idx<=1
2ddf0 35 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  5 );.  if( p->in
2de00 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
2de10 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
2de20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2de30 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2de40 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2de50 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2de60 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b  Bt->pPage1!=0 );
2de70 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
2de80 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72  age1->aData;.  r
2de90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2dea0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
2deb0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
2dec0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2ded0 63 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  c;.  put4byte(&p
2dee0 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20  P1[36 + idx*4], 
2def0 69 4d 65 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  iMeta);.  return
2df00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2df10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2df20 66 6c 61 67 20 62 79 74 65 20 61 74 20 74 68 65  flag byte at the
2df30 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2df40 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20  e page that the 
2df50 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72  cursor.** is cur
2df60 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
2df70 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  to..*/.int sqlit
2df80 65 33 42 74 72 65 65 46 6c 61 67 73 28 42 74 43  e3BtreeFlags(BtC
2df90 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2dfa0 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62  /* TODO: What ab
2dfb0 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49  out CURSOR_REQUI
2dfc0 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72  RESEEK state? Pr
2dfd0 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63  obably need to c
2dfe0 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  all.  ** restore
2dff0 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
2e000 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20  ition() here..  
2e010 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
2e020 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2e030 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  e;.  return pPag
2e040 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  e ? pPage->aData
2e050 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2e060 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  t] : 0;.}..#ifde
2e070 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2e080 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 64 69 73  *.** Print a dis
2e090 61 73 73 65 6d 62 6c 79 20 6f 66 20 74 68 65 20  assembly of the 
2e0a0 67 69 76 65 6e 20 70 61 67 65 20 6f 6e 20 73 74  given page on st
2e0b0 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 20 20  andard output.  
2e0c0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
2e0d0 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  is used for debu
2e0e0 67 67 69 6e 67 20 61 6e 64 20 74 65 73 74 69 6e  gging and testin
2e0f0 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  g only..*/.stati
2e100 63 20 69 6e 74 20 62 74 72 65 65 50 61 67 65 44  c int btreePageD
2e110 75 6d 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  ump(BtShared *pB
2e120 74 2c 20 69 6e 74 20 70 67 6e 6f 2c 20 69 6e 74  t, int pgno, int
2e130 20 72 65 63 75 72 73 69 76 65 2c 20 4d 65 6d 50   recursive, MemP
2e140 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20  age *pParent){. 
2e150 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
2e160 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  ge *pPage;.  int
2e170 20 69 2c 20 6a 2c 20 63 3b 0a 20 20 69 6e 74 20   i, j, c;.  int 
2e180 6e 46 72 65 65 3b 0a 20 20 75 31 36 20 69 64 78  nFree;.  u16 idx
2e190 3b 0a 20 20 69 6e 74 20 68 64 72 3b 0a 20 20 69  ;.  int hdr;.  i
2e1a0 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  nt nCell;.  int 
2e1b0 69 73 49 6e 69 74 3b 0a 20 20 75 6e 73 69 67 6e  isInit;.  unsign
2e1c0 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
2e1d0 20 63 68 61 72 20 72 61 6e 67 65 5b 32 30 5d 3b   char range[20];
2e1e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2e1f0 20 70 61 79 6c 6f 61 64 5b 32 30 5d 3b 0a 0a 20   payload[20];.. 
2e200 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
2e210 74 2c 20 28 50 67 6e 6f 29 70 67 6e 6f 2c 20 26  t, (Pgno)pgno, &
2e220 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 73 49  pPage, 0);.  isI
2e230 6e 69 74 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  nit = pPage->isI
2e240 6e 69 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65  nit;.  if( pPage
2e250 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  ->isInit==0 ){. 
2e260 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61 67     initPage(pPag
2e270 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  e, pParent);.  }
2e280 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2e290 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2e2a0 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
2e2b0 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61  drOffset;.  data
2e2c0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2e2d0 0a 20 20 63 20 3d 20 64 61 74 61 5b 68 64 72 5d  .  c = data[hdr]
2e2e0 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ;.  pPage->intKe
2e2f0 79 20 3d 20 28 63 20 26 20 28 50 54 46 5f 49 4e  y = (c & (PTF_IN
2e300 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
2e310 41 29 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d  A))!=0;.  pPage-
2e320 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28 63 20 26  >zeroData = (c &
2e330 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d   PTF_ZERODATA)!=
2e340 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  0;.  pPage->leaf
2e350 44 61 74 61 20 3d 20 28 63 20 26 20 50 54 46 5f  Data = (c & PTF_
2e360 4c 45 41 46 44 41 54 41 29 21 3d 30 3b 0a 20 20  LEAFDATA)!=0;.  
2e370 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 63  pPage->leaf = (c
2e380 20 26 20 50 54 46 5f 4c 45 41 46 29 21 3d 30 3b   & PTF_LEAF)!=0;
2e390 0a 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  .  pPage->hasDat
2e3a0 61 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a 65 72  a = !(pPage->zer
2e3b0 6f 44 61 74 61 20 7c 7c 20 28 21 70 50 61 67 65  oData || (!pPage
2e3c0 2d 3e 6c 65 61 66 20 26 26 20 70 50 61 67 65 2d  ->leaf && pPage-
2e3d0 3e 6c 65 61 66 44 61 74 61 29 29 3b 0a 20 20 6e  >leafData));.  n
2e3e0 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
2e3f0 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
2e400 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2e410 6e 74 66 28 22 50 41 47 45 20 25 64 3a 20 20 66  ntf("PAGE %d:  f
2e420 6c 61 67 73 3d 30 78 25 30 32 78 20 20 66 72 61  lags=0x%02x  fra
2e430 67 3d 25 64 20 20 20 70 61 72 65 6e 74 3d 25 64  g=%d   parent=%d
2e440 5c 6e 22 2c 20 70 67 6e 6f 2c 0a 20 20 20 20 64  \n", pgno,.    d
2e450 61 74 61 5b 68 64 72 5d 2c 20 64 61 74 61 5b 68  ata[hdr], data[h
2e460 64 72 2b 37 5d 2c 20 0a 20 20 20 20 28 70 50 61  dr+7], .    (pPa
2e470 67 65 2d 3e 69 73 49 6e 69 74 20 26 26 20 70 50  ge->isInit && pP
2e480 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 20 3f 20  age->pParent) ? 
2e490 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e  pPage->pParent->
2e4a0 70 67 6e 6f 20 3a 20 30 29 3b 0a 20 20 61 73 73  pgno : 0);.  ass
2e4b0 65 72 74 28 20 68 64 72 20 3d 3d 20 28 70 67 6e  ert( hdr == (pgn
2e4c0 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
2e4d0 29 3b 0a 20 20 69 64 78 20 3d 20 68 64 72 20 2b  );.  idx = hdr +
2e4e0 20 31 32 20 2d 20 70 50 61 67 65 2d 3e 6c 65 61   12 - pPage->lea
2e4f0 66 2a 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  f*4;.  for(i=0; 
2e500 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
2e510 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
2e520 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  ;.    Pgno child
2e530 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
2e540 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20  har *pCell;.    
2e550 69 6e 74 20 73 7a 3b 0a 20 20 20 20 69 6e 74 20  int sz;.    int 
2e560 61 64 64 72 3b 0a 0a 20 20 20 20 61 64 64 72 20  addr;..    addr 
2e570 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
2e580 5b 69 64 78 20 2b 20 32 2a 69 5d 29 3b 0a 20 20  [idx + 2*i]);.  
2e590 20 20 70 43 65 6c 6c 20 3d 20 26 64 61 74 61 5b    pCell = &data[
2e5a0 61 64 64 72 5d 3b 0a 20 20 20 20 70 61 72 73 65  addr];.    parse
2e5b0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
2e5c0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
2e5d0 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a    sz = info.nSiz
2e5e0 65 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 72  e;.    sprintf(r
2e5f0 61 6e 67 65 2c 22 25 64 2e 2e 25 64 22 2c 20 61  ange,"%d..%d", a
2e600 64 64 72 2c 20 61 64 64 72 2b 73 7a 2d 31 29 3b  ddr, addr+sz-1);
2e610 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2e620 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68  leaf ){.      ch
2e630 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ild = 0;.    }el
2e640 73 65 7b 0a 20 20 20 20 20 20 63 68 69 6c 64 20  se{.      child 
2e650 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
2e660 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 20  );.    }.    sz 
2e670 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  = info.nData;.  
2e680 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e    if( !pPage->in
2e690 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66  tKey ) sz += inf
2e6a0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 69 66 28 20  o.nKey;.    if( 
2e6b0 73 7a 3e 73 69 7a 65 6f 66 28 70 61 79 6c 6f 61  sz>sizeof(payloa
2e6c0 64 29 2d 31 20 29 20 73 7a 20 3d 20 73 69 7a 65  d)-1 ) sz = size
2e6d0 6f 66 28 70 61 79 6c 6f 61 64 29 2d 31 3b 0a 20  of(payload)-1;. 
2e6e0 20 20 20 6d 65 6d 63 70 79 28 70 61 79 6c 6f 61     memcpy(payloa
2e6f0 64 2c 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e  d, &pCell[info.n
2e700 48 65 61 64 65 72 5d 2c 20 73 7a 29 3b 0a 20 20  Header], sz);.  
2e710 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 7a 3b    for(j=0; j<sz;
2e720 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
2e730 20 70 61 79 6c 6f 61 64 5b 6a 5d 3c 30 78 32 30   payload[j]<0x20
2e740 20 7c 7c 20 70 61 79 6c 6f 61 64 5b 6a 5d 3e 30   || payload[j]>0
2e750 78 37 66 20 29 20 70 61 79 6c 6f 61 64 5b 6a 5d  x7f ) payload[j]
2e760 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7d 0a 20 20   = '.';.    }.  
2e770 20 20 70 61 79 6c 6f 61 64 5b 73 7a 5d 20 3d 20    payload[sz] = 
2e780 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  0;.    sqlite3De
2e790 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
2e7a0 20 22 63 65 6c 6c 20 25 32 64 3a 20 69 3d 25 2d   "cell %2d: i=%-
2e7b0 31 30 73 20 63 68 6c 64 3d 25 2d 34 64 20 6e 6b  10s chld=%-4d nk
2e7c0 3d 25 2d 34 6c 6c 64 20 6e 64 3d 25 2d 34 64 20  =%-4lld nd=%-4d 
2e7d0 70 61 79 6c 6f 61 64 3d 25 73 5c 6e 22 2c 0a 20  payload=%s\n",. 
2e7e0 20 20 20 20 20 69 2c 20 72 61 6e 67 65 2c 20 63       i, range, c
2e7f0 68 69 6c 64 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  hild, info.nKey,
2e800 20 69 6e 66 6f 2e 6e 44 61 74 61 2c 20 70 61 79   info.nData, pay
2e810 6c 6f 61 64 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  load.    );.  }.
2e820 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2e830 61 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  af ){.    sqlite
2e840 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72 69  3DebugPrintf("ri
2e850 67 68 74 5f 63 68 69 6c 64 3a 20 25 64 5c 6e 22  ght_child: %d\n"
2e860 2c 20 67 65 74 34 62 79 74 65 28 26 64 61 74 61  , get4byte(&data
2e870 5b 68 64 72 2b 38 5d 29 29 3b 0a 20 20 7d 0a 20  [hdr+8]));.  }. 
2e880 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 69 20   nFree = 0;.  i 
2e890 3d 20 30 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  = 0;.  idx = get
2e8a0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2e8b0 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  1]);.  while( id
2e8c0 78 3e 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  x>0 && idx<pPage
2e8d0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2e8e0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20  e ){.    int sz 
2e8f0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
2e900 5b 69 64 78 2b 32 5d 29 3b 0a 20 20 20 20 73 70  [idx+2]);.    sp
2e910 72 69 6e 74 66 28 72 61 6e 67 65 2c 22 25 64 2e  rintf(range,"%d.
2e920 2e 25 64 22 2c 20 69 64 78 2c 20 69 64 78 2b 73  .%d", idx, idx+s
2e930 7a 2d 31 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  z-1);.    nFree 
2e940 2b 3d 20 73 7a 3b 0a 20 20 20 20 73 71 6c 69 74  += sz;.    sqlit
2e950 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2e960 72 65 65 62 6c 6f 63 6b 20 25 32 64 3a 20 69 3d  reeblock %2d: i=
2e970 25 2d 31 30 73 20 73 69 7a 65 3d 25 2d 34 64 20  %-10s size=%-4d 
2e980 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20  total=%d\n",.   
2e990 20 20 20 20 69 2c 20 72 61 6e 67 65 2c 20 73 7a      i, range, sz
2e9a0 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 64  , nFree);.    id
2e9b0 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
2e9c0 74 61 5b 69 64 78 5d 29 3b 0a 20 20 20 20 69 2b  ta[idx]);.    i+
2e9d0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 64 78  +;.  }.  if( idx
2e9e0 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
2e9f0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 45  e3DebugPrintf("E
2ea00 52 52 4f 52 3a 20 6e 65 78 74 20 66 72 65 65 62  RROR: next freeb
2ea10 6c 6f 63 6b 20 69 6e 64 65 78 20 6f 75 74 20 6f  lock index out o
2ea20 66 20 72 61 6e 67 65 3a 20 25 64 5c 6e 22 2c 20  f range: %d\n", 
2ea30 69 64 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  idx);.  }.  if( 
2ea40 72 65 63 75 72 73 69 76 65 20 26 26 20 21 70 50  recursive && !pP
2ea50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2ea60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
2ea70 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
2ea80 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2ea90 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
2eaa0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
2eab0 62 74 72 65 65 50 61 67 65 44 75 6d 70 28 70 42  btreePageDump(pB
2eac0 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  t, get4byte(pCel
2ead0 6c 29 2c 20 31 2c 20 70 50 61 67 65 29 3b 0a 20  l), 1, pPage);. 
2eae0 20 20 20 20 20 69 64 78 20 3d 20 67 65 74 32 62       idx = get2b
2eaf0 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
2eb00 7d 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 44  }.    btreePageD
2eb10 75 6d 70 28 70 42 74 2c 20 67 65 74 34 62 79 74  ump(pBt, get4byt
2eb20 65 28 26 64 61 74 61 5b 68 64 72 2b 38 5d 29 2c  e(&data[hdr+8]),
2eb30 20 31 2c 20 70 50 61 67 65 29 3b 0a 20 20 7d 0a   1, pPage);.  }.
2eb40 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
2eb50 3d 20 69 73 49 6e 69 74 3b 0a 20 20 73 71 6c 69  = isInit;.  sqli
2eb60 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2eb70 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2eb80 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
2eb90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2eba0 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
2ebb0 65 33 42 74 72 65 65 50 61 67 65 44 75 6d 70 28  e3BtreePageDump(
2ebc0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 67  Btree *p, int pg
2ebd0 6e 6f 2c 20 69 6e 74 20 72 65 63 75 72 73 69 76  no, int recursiv
2ebe0 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 62 74 72  e){.  return btr
2ebf0 65 65 50 61 67 65 44 75 6d 70 28 70 2d 3e 70 42  eePageDump(p->pB
2ec00 74 2c 20 70 67 6e 6f 2c 20 72 65 63 75 72 73 69  t, pgno, recursi
2ec10 76 65 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  ve, 0);.}.#endif
2ec20 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2ec30 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
2ec40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
2ec50 55 47 29 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 61  UG)./*.** Fill a
2ec60 52 65 73 75 6c 74 5b 5d 20 77 69 74 68 20 69 6e  Result[] with in
2ec70 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
2ec80 74 68 65 20 65 6e 74 72 79 20 61 6e 64 20 70 61  the entry and pa
2ec90 67 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 63  ge that the.** c
2eca0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
2ecb0 67 20 74 6f 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 61  g to..** .**   a
2ecc0 52 65 73 75 6c 74 5b 30 5d 20 3d 20 20 54 68 65  Result[0] =  The
2ecd0 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   page number.** 
2ece0 20 20 61 52 65 73 75 6c 74 5b 31 5d 20 3d 20 20    aResult[1] =  
2ecf0 54 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65 72  The entry number
2ed00 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 32 5d  .**   aResult[2]
2ed10 20 3d 20 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   =  Total number
2ed20 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 74   of entries on t
2ed30 68 69 73 20 70 61 67 65 0a 2a 2a 20 20 20 61 52  his page.**   aR
2ed40 65 73 75 6c 74 5b 33 5d 20 3d 20 20 43 65 6c 6c  esult[3] =  Cell
2ed50 20 73 69 7a 65 20 28 6c 6f 63 61 6c 20 70 61 79   size (local pay
2ed60 6c 6f 61 64 20 2b 20 68 65 61 64 65 72 29 0a 2a  load + header).*
2ed70 2a 20 20 20 61 52 65 73 75 6c 74 5b 34 5d 20 3d  *   aResult[4] =
2ed80 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65    Number of free
2ed90 20 62 79 74 65 73 20 6f 6e 20 74 68 69 73 20 70   bytes on this p
2eda0 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  age.**   aResult
2edb0 5b 35 5d 20 3d 20 20 4e 75 6d 62 65 72 20 6f 66  [5] =  Number of
2edc0 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 6f 6e 20   free blocks on 
2edd0 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 61 52  the page.**   aR
2ede0 65 73 75 6c 74 5b 36 5d 20 3d 20 20 54 6f 74 61  esult[6] =  Tota
2edf0 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 28  l payload size (
2ee00 6c 6f 63 61 6c 20 2b 20 6f 76 65 72 66 6c 6f 77  local + overflow
2ee10 29 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 37  ).**   aResult[7
2ee20 5d 20 3d 20 20 48 65 61 64 65 72 20 73 69 7a 65  ] =  Header size
2ee30 20 69 6e 20 62 79 74 65 73 0a 2a 2a 20 20 20 61   in bytes.**   a
2ee40 52 65 73 75 6c 74 5b 38 5d 20 3d 20 20 4c 6f 63  Result[8] =  Loc
2ee50 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 0a  al payload size.
2ee60 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20  **   aResult[9] 
2ee70 3d 20 20 50 61 72 65 6e 74 20 70 61 67 65 20 6e  =  Parent page n
2ee80 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73 75  umber.**   aResu
2ee90 6c 74 5b 31 30 5d 3d 20 20 50 61 67 65 20 6e 75  lt[10]=  Page nu
2eea0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
2eeb0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  t overflow page.
2eec0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2eed0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
2eee0 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
2eef0 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ging only..*/.in
2ef00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
2ef10 72 73 6f 72 49 6e 66 6f 28 42 74 43 75 72 73 6f  rsorInfo(BtCurso
2ef20 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 61 52  r *pCur, int *aR
2ef30 65 73 75 6c 74 2c 20 69 6e 74 20 75 70 43 6e 74  esult, int upCnt
2ef40 29 7b 0a 20 20 69 6e 74 20 63 6e 74 2c 20 69 64  ){.  int cnt, id
2ef50 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
2ef60 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2ef70 65 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 74 6d  e;.  BtCursor tm
2ef80 70 43 75 72 3b 0a 0a 20 20 69 6e 74 20 72 63 20  pCur;..  int rc 
2ef90 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
2efa0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2efb0 43 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72  Cur, 1);.  if( r
2efc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2efd0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2efe0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
2eff0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2f000 20 67 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70   getTempCursor(p
2f010 43 75 72 2c 20 26 74 6d 70 43 75 72 29 3b 0a 20  Cur, &tmpCur);. 
2f020 20 77 68 69 6c 65 28 20 75 70 43 6e 74 2d 2d 20   while( upCnt-- 
2f030 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  ){.    moveToPar
2f040 65 6e 74 28 26 74 6d 70 43 75 72 29 3b 0a 20 20  ent(&tmpCur);.  
2f050 7d 0a 20 20 70 50 61 67 65 20 3d 20 74 6d 70 43  }.  pPage = tmpC
2f060 75 72 2e 70 50 61 67 65 3b 0a 20 20 61 52 65 73  ur.pPage;.  aRes
2f070 75 6c 74 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  ult[0] = sqlite3
2f080 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
2f090 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2f0a0 0a 20 20 61 73 73 65 72 74 28 20 61 52 65 73 75  .  assert( aResu
2f0b0 6c 74 5b 30 5d 3d 3d 70 50 61 67 65 2d 3e 70 67  lt[0]==pPage->pg
2f0c0 6e 6f 20 29 3b 0a 20 20 61 52 65 73 75 6c 74 5b  no );.  aResult[
2f0d0 31 5d 20 3d 20 74 6d 70 43 75 72 2e 69 64 78 3b  1] = tmpCur.idx;
2f0e0 0a 20 20 61 52 65 73 75 6c 74 5b 32 5d 20 3d 20  .  aResult[2] = 
2f0f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2f100 69 66 28 20 74 6d 70 43 75 72 2e 69 64 78 3e 3d  if( tmpCur.idx>=
2f110 30 20 26 26 20 74 6d 70 43 75 72 2e 69 64 78 3c  0 && tmpCur.idx<
2f120 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2f130 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
2f140 26 74 6d 70 43 75 72 29 3b 0a 20 20 20 20 61 52  &tmpCur);.    aR
2f150 65 73 75 6c 74 5b 33 5d 20 3d 20 74 6d 70 43 75  esult[3] = tmpCu
2f160 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  r.info.nSize;.  
2f170 20 20 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 74    aResult[6] = t
2f180 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 44 61 74 61  mpCur.info.nData
2f190 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 37 5d  ;.    aResult[7]
2f1a0 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e   = tmpCur.info.n
2f1b0 48 65 61 64 65 72 3b 0a 20 20 20 20 61 52 65 73  Header;.    aRes
2f1c0 75 6c 74 5b 38 5d 20 3d 20 74 6d 70 43 75 72 2e  ult[8] = tmpCur.
2f1d0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
2f1e0 65 6c 73 65 7b 0a 20 20 20 20 61 52 65 73 75 6c  else{.    aResul
2f1f0 74 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52  t[3] = 0;.    aR
2f200 65 73 75 6c 74 5b 36 5d 20 3d 20 30 3b 0a 20 20  esult[6] = 0;.  
2f210 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 30    aResult[7] = 0
2f220 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 38 5d  ;.    aResult[8]
2f230 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 52 65 73   = 0;.  }.  aRes
2f240 75 6c 74 5b 34 5d 20 3d 20 70 50 61 67 65 2d 3e  ult[4] = pPage->
2f250 6e 46 72 65 65 3b 0a 20 20 63 6e 74 20 3d 20 30  nFree;.  cnt = 0
2f260 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 32 62 79  ;.  idx = get2by
2f270 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2f280 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2f290 74 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20  t+1]);.  while( 
2f2a0 69 64 78 3e 30 20 26 26 20 69 64 78 3c 70 50 61  idx>0 && idx<pPa
2f2b0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2f2c0 69 7a 65 20 29 7b 0a 20 20 20 20 63 6e 74 2b 2b  ize ){.    cnt++
2f2d0 3b 0a 20 20 20 20 69 64 78 20 3d 20 67 65 74 32  ;.    idx = get2
2f2e0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2f2f0 74 61 5b 69 64 78 5d 29 3b 0a 20 20 7d 0a 20 20  ta[idx]);.  }.  
2f300 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20 63 6e 74  aResult[5] = cnt
2f310 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
2f320 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 69 73 52  Parent==0 || isR
2f330 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29  ootPage(pPage) )
2f340 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 39 5d  {.    aResult[9]
2f350 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
2f360 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20     aResult[9] = 
2f370 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e  pPage->pParent->
2f380 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pgno;.  }.  if( 
2f390 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 69 4f 76 65  tmpCur.info.iOve
2f3a0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 61 52 65  rflow ){.    aRe
2f3b0 73 75 6c 74 5b 31 30 5d 20 3d 20 67 65 74 34 62  sult[10] = get4b
2f3c0 79 74 65 28 26 74 6d 70 43 75 72 2e 69 6e 66 6f  yte(&tmpCur.info
2f3d0 2e 70 43 65 6c 6c 5b 74 6d 70 43 75 72 2e 69 6e  .pCell[tmpCur.in
2f3e0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
2f3f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65    }else{.    aRe
2f400 73 75 6c 74 5b 31 30 5d 20 3d 20 30 3b 0a 20 20  sult[10] = 0;.  
2f410 7d 0a 20 20 72 65 6c 65 61 73 65 54 65 6d 70 43  }.  releaseTempC
2f420 75 72 73 6f 72 28 26 74 6d 70 43 75 72 29 3b 0a  ursor(&tmpCur);.
2f430 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f440 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
2f450 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
2f460 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
2f470 77 69 74 68 20 61 20 42 54 72 65 65 2e 20 20 54  with a BTree.  T
2f480 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2f490 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
2f4a0 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
2f4b0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20   only..*/.Pager 
2f4c0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  *sqlite3BtreePag
2f4d0 65 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  er(Btree *p){.  
2f4e0 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
2f4f0 50 61 67 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Pager;.}../*.** 
2f500 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  This structure i
2f510 73 20 70 61 73 73 65 64 20 61 72 6f 75 6e 64 20  s passed around 
2f520 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20  through all the 
2f530 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
2f540 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 69 6e 20 6f  routines.** in o
2f550 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 72 61  rder to keep tra
2f560 63 6b 20 6f 66 20 73 6f 6d 65 20 67 6c 6f 62 61  ck of some globa
2f570 6c 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  l state informat
2f580 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
2f590 73 74 72 75 63 74 20 49 6e 74 65 67 72 69 74 79  struct Integrity
2f5a0 43 6b 20 49 6e 74 65 67 72 69 74 79 43 6b 3b 0a  Ck IntegrityCk;.
2f5b0 73 74 72 75 63 74 20 49 6e 74 65 67 72 69 74 79  struct Integrity
2f5c0 43 6b 20 7b 0a 20 20 42 74 53 68 61 72 65 64 20  Ck {.  BtShared 
2f5d0 2a 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  *pBt;    /* The 
2f5e0 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b  tree being check
2f5f0 65 64 20 6f 75 74 20 2a 2f 0a 20 20 50 61 67 65  ed out */.  Page
2f600 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 2f 2a  r *pPager;    /*
2f610 20 54 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   The associated 
2f620 70 61 67 65 72 2e 20 20 41 6c 73 6f 20 61 63 63  pager.  Also acc
2f630 65 73 73 69 62 6c 65 20 62 79 20 70 42 74 2d 3e  essible by pBt->
2f640 70 50 61 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20  pPager */.  int 
2f650 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f 2a  nPage;        /*
2f660 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2f670 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2f680 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 6e 52 65 66   */.  int *anRef
2f690 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2f6a0 72 20 6f 66 20 74 69 6d 65 73 20 65 61 63 68 20  r of times each 
2f6b0 70 61 67 65 20 69 73 20 72 65 66 65 72 65 6e 63  page is referenc
2f6c0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45 72  ed */.  int mxEr
2f6d0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  r;        /* Sto
2f6e0 70 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 65  p accumulating e
2f6f0 72 72 6f 72 73 20 77 68 65 6e 20 74 68 69 73 20  rrors when this 
2f700 72 65 61 63 68 65 73 20 7a 65 72 6f 20 2a 2f 0a  reaches zero */.
2f710 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b    char *zErrMsg;
2f720 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
2f730 6d 65 73 73 61 67 65 2e 20 20 4e 55 4c 4c 20 69  message.  NULL i
2f740 66 20 6e 6f 20 65 72 72 6f 72 73 20 73 65 65 6e  f no errors seen
2f750 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b  . */.  int nErr;
2f760 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f770 65 72 20 6f 66 20 6d 65 73 73 61 67 65 73 20 77  er of messages w
2f780 72 69 74 74 65 6e 20 74 6f 20 7a 45 72 72 4d 73  ritten to zErrMs
2f790 67 20 73 6f 20 66 61 72 20 2a 2f 0a 7d 3b 0a 0a  g so far */.};..
2f7a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f7b0 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
2f7c0 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  ECK./*.** Append
2f7d0 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68   a message to th
2f7e0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2f7f0 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
2f800 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65  c void checkAppe
2f810 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69  ndMsg(.  Integri
2f820 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20  tyCk *pCheck,.  
2f830 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63  char *zMsg1,.  c
2f840 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
2f850 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76  at,.  ....){.  v
2f860 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
2f870 72 20 2a 7a 4d 73 67 32 3b 0a 20 20 69 66 28 20  r *zMsg2;.  if( 
2f880 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29  !pCheck->mxErr )
2f890 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63   return;.  pChec
2f8a0 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43  k->mxErr--;.  pC
2f8b0 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  heck->nErr++;.  
2f8c0 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
2f8d0 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20 3d  rmat);.  zMsg2 =
2f8e0 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
2f8f0 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
2f900 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
2f910 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29 20 7a 4d  f( zMsg1==0 ) zM
2f920 73 67 31 20 3d 20 22 22 3b 0a 20 20 69 66 28 20  sg1 = "";.  if( 
2f930 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20  pCheck->zErrMsg 
2f940 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 6c  ){.    char *zOl
2f950 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72  d = pCheck->zErr
2f960 4d 73 67 3b 0a 20 20 20 20 70 43 68 65 63 6b 2d  Msg;.    pCheck-
2f970 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
2f980 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
2f990 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72  ng(&pCheck->zErr
2f9a0 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22 2c  Msg, zOld, "\n",
2f9b0 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28   zMsg1, zMsg2, (
2f9c0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73 71  char*)0);.    sq
2f9d0 6c 69 74 65 46 72 65 65 28 7a 4f 6c 64 29 3b 0a  liteFree(zOld);.
2f9e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
2f9f0 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
2fa00 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20  Check->zErrMsg, 
2fa10 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63  zMsg1, zMsg2, (c
2fa20 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 73  har*)0);.  }.  s
2fa30 71 6c 69 74 65 46 72 65 65 28 7a 4d 73 67 32 29  qliteFree(zMsg2)
2fa40 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2fa50 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
2fa60 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
2fa70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2fa80 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
2fa90 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f  K./*.** Add 1 to
2faa0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
2fab0 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50  ount for page iP
2fac0 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73  age.  If this is
2fad0 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72   the second.** r
2fae0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2faf0 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72  page, add an err
2fb00 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43  or message to pC
2fb10 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  heck->zErrMsg..*
2fb20 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
2fb30 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f  ere are 2 ore mo
2fb40 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
2fb50 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20   the page and 0 
2fb60 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  if.** if this is
2fb70 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72   the first refer
2fb80 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
2fb90 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65  ..**.** Also che
2fba0 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
2fbb0 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f   number is in bo
2fbc0 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unds..*/.static 
2fbd0 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74  int checkRef(Int
2fbe0 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
2fbf0 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61  , int iPage, cha
2fc00 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20  r *zContext){.  
2fc10 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
2fc20 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69  eturn 1;.  if( i
2fc30 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61  Page>pCheck->nPa
2fc40 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b  ge || iPage<0 ){
2fc50 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
2fc60 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
2fc70 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70  text, "invalid p
2fc80 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20  age number %d", 
2fc90 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  iPage);.    retu
2fca0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
2fcb0 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50  pCheck->anRef[iP
2fcc0 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63  age]==1 ){.    c
2fcd0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
2fce0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
2fcf0 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74  "2nd reference t
2fd00 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  o page %d", iPag
2fd10 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
2fd20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20  ;.  }.  return  
2fd30 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69  (pCheck->anRef[i
2fd40 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23  Page]++)>1;.}..#
2fd50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2fd60 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
2fd70 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .** Check that t
2fd80 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  he entry in the 
2fd90 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20  pointer-map for 
2fda0 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73  page iChild maps
2fdb0 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61   to .** page iPa
2fdc0 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79  rent, pointer ty
2fdd0 70 65 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e  pe ptrType. If n
2fde0 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72  ot, append an er
2fdf0 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74  ror message.** t
2fe00 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61  o pCheck..*/.sta
2fe10 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74  tic void checkPt
2fe20 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74  rmap(.  Integrit
2fe30 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f  yCk *pCheck,   /
2fe40 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63  * Integrity chec
2fe50 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  k context */.  P
2fe60 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
2fe70 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70        /* Child p
2fe80 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
2fe90 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
2fea0 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
2feb0 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74  ed pointer map t
2fec0 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ype */.  Pgno iP
2fed0 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  arent,          
2fee0 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e  /* Expected poin
2fef0 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70  ter map parent p
2ff00 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
2ff10 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20  char *zContext  
2ff20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
2ff30 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75  t description (u
2ff40 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73  sed for error ms
2ff50 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  g) */.){.  int r
2ff60 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54  c;.  u8 ePtrmapT
2ff70 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  ype;.  Pgno iPtr
2ff80 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63  mapParent;..  rc
2ff90 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43 68   = ptrmapGet(pCh
2ffa0 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64  eck->pBt, iChild
2ffb0 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20  , &ePtrmapType, 
2ffc0 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b  &iPtrmapParent);
2ffd0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2ffe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63  E_OK ){.    chec
2fff0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
30000 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61  k, zContext, "Fa
30010 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74 72  iled to read ptr
30020 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68  map key=%d", iCh
30030 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ild);.    return
30040 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74  ;.  }..  if( ePt
30050 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65 20  rmapType!=eType 
30060 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  || iPtrmapParent
30070 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  !=iParent ){.   
30080 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
30090 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
300a0 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20 70 74  , .      "Bad pt
300b0 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d  r map entry key=
300c0 25 64 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c  %d expected=(%d,
300d0 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22  %d) got=(%d,%d)"
300e0 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c  , .      iChild,
300f0 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c   eType, iParent,
30100 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50   ePtrmapType, iP
30110 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20  trmapParent);.  
30120 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
30130 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  * Check the inte
30140 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65  grity of the fre
30150 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f  elist or of an o
30160 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
30170 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  t..** Verify tha
30180 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
30190 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73  pages on the lis
301a0 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69  t is N..*/.stati
301b0 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74  c void checkList
301c0 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
301d0 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74  *pCheck,  /* Int
301e0 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20  egrity checking 
301f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
30200 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20   isFreeList,    
30210 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
30220 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73   freelist.  Fals
30230 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e for overflow p
30240 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  age list */.  in
30250 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20  t iPage,        
30260 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
30270 65 72 20 66 6f 72 20 66 69 72 73 74 20 70 61 67  er for first pag
30280 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  e in the list */
30290 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
302a0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
302b0 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70  cted number of p
302c0 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
302d0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
302e0 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43  text        /* C
302f0 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
30300 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a   messages */.){.
30310 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65    int i;.  int e
30320 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69  xpected = N;.  i
30330 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50 61 67  nt iFirst = iPag
30340 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  e;.  while( N-- 
30350 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d  > 0 && pCheck->m
30360 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61  xErr ){.    DbPa
30370 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20  ge *pOvflPage;. 
30380 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
30390 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20   *pOvflData;.   
303a0 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a   if( iPage<1 ){.
303b0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
303c0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
303d0 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
303e0 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73 20  "%d of %d pages 
303f0 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65  missing from ove
30400 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74  rflow list start
30410 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20  ing at %d",.    
30420 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63        N+1, expec
30430 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  ted, iFirst);.  
30440 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
30450 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
30460 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
30470 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65   zContext) ) bre
30480 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ak;.    if( sqli
30490 74 65 33 50 61 67 65 72 47 65 74 28 70 43 68 65  te3PagerGet(pChe
304a0 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e  ck->pPager, (Pgn
304b0 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50  o)iPage, &pOvflP
304c0 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  age) ){.      ch
304d0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
304e0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
304f0 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61  failed to get pa
30500 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
30510 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
30520 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61   }.    pOvflData
30530 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
30540 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  r *)sqlite3Pager
30550 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67  GetData(pOvflPag
30560 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72  e);.    if( isFr
30570 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  eeList ){.      
30580 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65  int n = get4byte
30590 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b  (&pOvflData[4]);
305a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
305b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
305c0 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
305d0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
305e0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
305f0 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
30600 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
30610 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
30620 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
30630 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
30640 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75  n>pCheck->pBt->u
30650 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29 7b  sableSize/4-8 ){
30660 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
30670 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
30680 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
30690 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c       "freelist l
306a0 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69  eaf count too bi
306b0 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69  g on page %d", i
306c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e  Page);.        N
306d0 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
306e0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
306f0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
30700 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
30710 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  ePage = get4byte
30720 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a  (&pOvflData[8+i*
30730 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  4]);.#ifndef SQL
30740 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
30750 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66  UUM.          if
30760 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
30770 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
30780 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74           checkPt
30790 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72  rmap(pCheck, iFr
307a0 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46  eePage, PTRMAP_F
307b0 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
307c0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20  text);.         
307d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
307e0 20 20 20 20 63 68 65 63 6b 52 65 66 28 70 43 68      checkRef(pCh
307f0 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
30800 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
30810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d     }.        N -
30820 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
30830 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
30840 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30850 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  M.    else{.    
30860 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
30870 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
30880 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69  uto-vacuum and i
30890 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Page is not the 
308a0 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61  last.      ** pa
308b0 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66  ge in this overf
308c0 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20  low list, check 
308d0 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72  that the pointer
308e0 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20  -map entry for. 
308f0 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c       ** the foll
30900 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68  owing page match
30910 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20  es iPage..      
30920 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  */.      if( pCh
30930 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
30940 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20  cuum && N>0 ){. 
30950 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 34 62         i = get4b
30960 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a  yte(pOvflData);.
30970 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
30980 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50  map(pCheck, i, P
30990 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
309a0 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
309b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
309c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67  .#endif.    iPag
309d0 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  e = get4byte(pOv
309e0 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  flData);.    sql
309f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
30a00 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  OvflPage);.  }.}
30a10 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
30a20 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
30a30 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
30a40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
30a50 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
30a60 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20  *.** Do various 
30a70 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e  sanity checks on
30a80 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f   a single page o
30a90 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72  f a tree.  Retur
30aa0 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65  n.** the tree de
30ab0 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73  pth.  Root pages
30ac0 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65   return 0.  Pare
30ad0 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  nts of root page
30ae0 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61  s.** return 1, a
30af0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20  nd so forth..** 
30b00 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73  .** These checks
30b10 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a   are done:.**.**
30b20 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73        1.  Make s
30b30 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61  ure that cells a
30b40 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f  nd freeblocks do
30b50 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20   not overlap.** 
30b60 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d           but com
30b70 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  bine to complete
30b80 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67  ly cover the pag
30b90 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d  e..**  NO  2.  M
30ba0 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65  ake sure cell ke
30bb0 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e  ys are in order.
30bc0 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b  .**  NO  3.  Mak
30bd0 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73  e sure no key is
30be0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
30bf0 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75  ual to zLowerBou
30c00 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20  nd..**  NO  4.  
30c10 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79  Make sure no key
30c20 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
30c30 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70   or equal to zUp
30c40 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20  perBound..**    
30c50 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20    5.  Check the 
30c60 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65  integrity of ove
30c70 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20  rflow pages..** 
30c80 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69       6.  Recursi
30c90 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54  vely call checkT
30ca0 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63  reePage on all c
30cb0 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20  hildren..**     
30cc0 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74   7.  Verify that
30cd0 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c   the depth of al
30ce0 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68  l children is th
30cf0 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20  e same..**      
30d00 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  8.  Make sure th
30d10 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65  is page is at le
30d20 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20  ast 33% full or 
30d30 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20  else it is.**   
30d40 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20         the root 
30d50 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a  of the tree..*/.
30d60 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
30d70 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65  TreePage(.  Inte
30d80 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
30d90 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
30da0 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   the sanity chec
30db0 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  k */.  int iPage
30dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
30dd0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
30de0 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b  he page to check
30df0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
30e00 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50  Parent,     /* P
30e10 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  arent page */.  
30e20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e  char *zParentCon
30e30 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20  text  /* Parent 
30e40 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
30e50 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
30e60 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70    int i, rc, dep
30e70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e  th, d2, pgno, cn
30e80 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65  t;.  int hdr, ce
30e90 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e  llStart;.  int n
30ea0 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61  Cell;.  u8 *data
30eb0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
30ec0 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  t;.  int usableS
30ed0 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e  ize;.  char zCon
30ee0 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61  text[100];.  cha
30ef0 72 20 2a 68 69 74 3b 0a 0a 20 20 73 70 72 69 6e  r *hit;..  sprin
30f00 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61  tf(zContext, "Pa
30f10 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65 29  ge %d: ", iPage)
30f20 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
30f30 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69 73  at the page exis
30f40 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20  ts.  */.  pBt = 
30f50 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75  pCheck->pBt;.  u
30f60 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
30f70 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69  >usableSize;.  i
30f80 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65  f( iPage==0 ) re
30f90 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 68  turn 0;.  if( ch
30fa0 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
30fb0 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e  Page, zParentCon
30fc0 74 65 78 74 29 20 29 20 72 65 74 75 72 6e 20 30  text) ) return 0
30fd0 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 67 65  ;.  if( (rc = ge
30fe0 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  tPage(pBt, (Pgno
30ff0 29 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20  )iPage, &pPage, 
31000 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68  0))!=0 ){.    ch
31010 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
31020 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
31030 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
31040 20 67 65 74 20 74 68 65 20 70 61 67 65 2e 20 65   get the page. e
31050 72 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20 72  rror code=%d", r
31060 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  c);.    return 0
31070 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63 20  ;.  }.  if( (rc 
31080 3d 20 69 6e 69 74 50 61 67 65 28 70 50 61 67 65  = initPage(pPage
31090 2c 20 70 50 61 72 65 6e 74 29 29 21 3d 30 20 29  , pParent))!=0 )
310a0 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
310b0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
310c0 6e 74 65 78 74 2c 20 22 69 6e 69 74 50 61 67 65  ntext, "initPage
310d0 28 29 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72  () returns error
310e0 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29 3b 0a   code %d", rc);.
310f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
31100 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  pPage);.    retu
31110 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
31120 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74 68  Check out all th
31130 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20  e cells..  */.  
31140 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 66 6f 72  depth = 0;.  for
31150 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
31160 43 65 6c 6c 20 26 26 20 70 43 68 65 63 6b 2d 3e  Cell && pCheck->
31170 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  mxErr; i++){.   
31180 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
31190 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43 65 6c 6c  int sz;.    Cell
311a0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20  Info info;..    
311b0 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f 61 64  /* Check payload
311c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
311d0 20 20 20 20 2a 2f 0a 20 20 20 20 73 70 72 69 6e      */.    sprin
311e0 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22 4f 6e  tf(zContext, "On
311f0 20 74 72 65 65 20 70 61 67 65 20 25 64 20 63 65   tree page %d ce
31200 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65 2c  ll %d: ", iPage,
31210 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d   i);.    pCell =
31220 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
31230 69 29 3b 0a 20 20 20 20 70 61 72 73 65 43 65 6c  i);.    parseCel
31240 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
31250 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73  l, &info);.    s
31260 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  z = info.nData;.
31270 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
31280 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69  intKey ) sz += i
31290 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73  nfo.nKey;.    as
312a0 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e  sert( sz==info.n
312b0 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69  Payload );.    i
312c0 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  f( sz>info.nLoca
312d0 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  l ){.      int n
312e0 50 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66  Page = (sz - inf
312f0 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c  o.nLocal + usabl
31300 65 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61 62  eSize - 5)/(usab
31310 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
31320 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c     Pgno pgnoOvfl
31330 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
31340 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
31350 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  w]);.#ifndef SQL
31360 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
31370 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42  UUM.      if( pB
31380 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
31390 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
313a0 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
313b0 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  oOvfl, PTRMAP_OV
313c0 45 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20  ERFLOW1, iPage, 
313d0 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
313e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
313f0 63 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63 6b  checkList(pCheck
31400 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e  , 0, pgnoOvfl, n
31410 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
31420 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
31430 68 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c  heck sanity of l
31440 65 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e 0a  eft child page..
31450 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
31460 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
31470 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
31480 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66  byte(pCell);.#if
31490 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
314a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
314b0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
314c0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
314d0 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
314e0 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  eck, pgno, PTRMA
314f0 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20  P_BTREE, iPage, 
31500 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
31510 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
31520 64 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50 61  d2 = checkTreePa
31530 67 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70  ge(pCheck,pgno,p
31540 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a  Page,zContext);.
31550 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
31560 20 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20   d2!=depth ){.  
31570 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
31580 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
31590 6e 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61  ntext, "Child pa
315a0 67 65 20 64 65 70 74 68 20 64 69 66 66 65 72 73  ge depth differs
315b0 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
315c0 20 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20    depth = d2;.  
315d0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70    }.  }.  if( !p
315e0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
315f0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
31600 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
31610 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
31620 2b 38 5d 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  +8]);.    sprint
31630 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22 4f 6e 20  f(zContext, "On 
31640 70 61 67 65 20 25 64 20 61 74 20 72 69 67 68 74  page %d at right
31650 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65   child: ", iPage
31660 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
31670 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
31680 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
31690 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
316a0 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
316b0 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52  Check, pgno, PTR
316c0 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65  MAP_BTREE, iPage
316d0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
316e0 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65  if.    checkTree
316f0 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e  Page(pCheck, pgn
31700 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65  o, pPage, zConte
31710 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20  xt);.  }. .  /* 
31720 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65  Check for comple
31730 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74  te coverage of t
31740 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64  he page.  */.  d
31750 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
31760 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
31770 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
31780 68 69 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  hit = sqliteMall
31790 6f 63 28 20 75 73 61 62 6c 65 53 69 7a 65 20 29  oc( usableSize )
317a0 3b 0a 20 20 69 66 28 20 68 69 74 20 29 7b 0a 20  ;.  if( hit ){. 
317b0 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20 31     memset(hit, 1
317c0 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  , get2byte(&data
317d0 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20 20 6e  [hdr+5]));.    n
317e0 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
317f0 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
31800 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d 20 68     cellStart = h
31810 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
31820 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f 72  e->leaf;.    for
31830 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
31840 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
31850 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
31860 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a 32  ta[cellStart+i*2
31870 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  ]);.      int si
31880 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
31890 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
318a0 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  ]);.      int j;
318b0 0a 20 20 20 20 20 20 69 66 28 20 28 70 63 2b 73  .      if( (pc+s
318c0 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69  ize-1)>=usableSi
318d0 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20  ze || pc<0 ){.  
318e0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
318f0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
31900 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f  .            "Co
31910 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65  rruption detecte
31920 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20  d in cell %d on 
31930 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65  page %d",i,iPage
31940 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,0);.      }else
31950 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
31960 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63  pc+size-1; j>=pc
31970 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b  ; j--) hit[j]++;
31980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
31990 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d     for(cnt=0, i=
319a0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
319b0 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20 69  dr+1]); i>0 && i
319c0 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  <usableSize && c
319d0 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20 20 20  nt<10000; .     
319e0 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20        cnt++){.  
319f0 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67      int size = g
31a00 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 2b  et2byte(&data[i+
31a10 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  2]);.      int j
31a20 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 2b 73  ;.      if( (i+s
31a30 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69  ize-1)>=usableSi
31a40 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20  ze || i<0 ){.   
31a50 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
31a60 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 20  Msg(pCheck, 0,  
31a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f  .            "Co
31a80 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65  rruption detecte
31a90 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20  d in cell %d on 
31aa0 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65  page %d",i,iPage
31ab0 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,0);.      }else
31ac0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
31ad0 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20  i+size-1; j>=i; 
31ae0 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20  j--) hit[j]++;. 
31af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
31b00 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
31b10 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
31b20 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73  or(i=cnt=0; i<us
31b30 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a  ableSize; i++){.
31b40 20 20 20 20 20 20 69 66 28 20 68 69 74 5b 69 5d        if( hit[i]
31b50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
31b60 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
31b70 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31 20 29  e if( hit[i]>1 )
31b80 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
31b90 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
31ba0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d   0,.          "M
31bb0 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66 6f 72  ultiple uses for
31bc0 20 62 79 74 65 20 25 64 20 6f 66 20 70 61 67 65   byte %d of page
31bd0 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65 29 3b   %d", i, iPage);
31be0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
31bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
31c00 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74 61 5b    if( cnt!=data[
31c10 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20  hdr+7] ){.      
31c20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
31c30 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20  Check, 0, .     
31c40 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74 65 64       "Fragmented
31c50 20 73 70 61 63 65 20 69 73 20 25 64 20 62 79 74   space is %d byt
31c60 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 25 64  e reported as %d
31c70 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a 20 20   on page %d",.  
31c80 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64 61 74          cnt, dat
31c90 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67 65 29  a[hdr+7], iPage)
31ca0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
31cb0 6c 69 74 65 46 72 65 65 28 68 69 74 29 3b 0a 0a  liteFree(hit);..
31cc0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
31cd0 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64  age);.  return d
31ce0 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66  epth+1;.}.#endif
31cf0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
31d00 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
31d10 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
31d20 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
31d30 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  Y_CHECK./*.** Th
31d40 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
31d50 61 20 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b  a complete check
31d60 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 42 54   of the given BT
31d70 72 65 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74  ree file.  aRoot
31d80 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61  [] is.** an arra
31d90 79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65  y of pages numbe
31da0 72 73 20 77 65 72 65 20 65 61 63 68 20 70 61 67  rs were each pag
31db0 65 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20  e number is the 
31dc0 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  root page of.** 
31dd0 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20  a table.  nRoot 
31de0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
31df0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f   entries in aRoo
31e00 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  t..**.** If ever
31e10 79 74 68 69 6e 67 20 63 68 65 63 6b 73 20 6f 75  ything checks ou
31e20 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
31e30 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 49  returns NULL.  I
31e40 66 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 0a 2a  f something is.*
31e50 2a 20 61 6d 69 73 73 2c 20 61 6e 20 65 72 72 6f  * amiss, an erro
31e60 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
31e70 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  tten into memory
31e80 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
31e90 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20 61  alloc().** and a
31ea0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74   pointer to that
31eb0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
31ec0 73 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65  s returned.  The
31ed0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
31ee0 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  n.** is responsi
31ef0 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20  ble for freeing 
31f00 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
31f10 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
31f20 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  e..*/.char *sqli
31f30 74 65 33 42 74 72 65 65 49 6e 74 65 67 72 69 74  te3BtreeIntegrit
31f40 79 43 68 65 63 6b 28 0a 20 20 42 74 72 65 65 20  yCheck(.  Btree 
31f50 2a 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 62  *p,     /* The b
31f60 74 72 65 65 20 74 6f 20 62 65 20 63 68 65 63 6b  tree to be check
31f70 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f  ed */.  int *aRo
31f80 6f 74 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72 61  ot,   /* An arra
31f90 79 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20  y of root pages 
31fa0 6e 75 6d 62 65 72 73 20 66 6f 72 20 69 6e 64 69  numbers for indi
31fb0 76 69 64 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a  vidual trees */.
31fc0 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20    int nRoot,    
31fd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
31fe0 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20  ries in aRoot[] 
31ff0 2a 2f 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c 20  */.  int mxErr, 
32000 20 20 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72     /* Stop repor
32010 74 69 6e 67 20 65 72 72 6f 72 73 20 61 66 74 65  ting errors afte
32020 72 20 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20  r this many */. 
32030 20 69 6e 74 20 2a 70 6e 45 72 72 20 20 20 20 2f   int *pnErr    /
32040 2a 20 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f  * Write number o
32050 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 74 6f  f errors seen to
32060 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 2a   this variable *
32070 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
32080 69 6e 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65  int nRef;.  Inte
32090 67 72 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a  grityCk sCheck;.
320a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
320b0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 6e 52 65  = p->pBt;..  nRe
320c0 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
320d0 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
320e0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63  ager);.  if( loc
320f0 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28  kBtreeWithRetry(
32100 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  p)!=SQLITE_OK ){
32110 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
32120 74 65 53 74 72 44 75 70 28 22 55 6e 61 62 6c 65  teStrDup("Unable
32130 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 72 65   to acquire a re
32140 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
32150 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20  atabase");.  }. 
32160 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42   sCheck.pBt = pB
32170 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67  t;.  sCheck.pPag
32180 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
32190 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  ;.  sCheck.nPage
321a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
321b0 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e  agecount(sCheck.
321c0 70 50 61 67 65 72 29 3b 0a 20 20 73 43 68 65 63  pPager);.  sChec
321d0 6b 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72 72 3b  k.mxErr = mxErr;
321e0 0a 20 20 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d  .  sCheck.nErr =
321f0 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 30   0;.  *pnErr = 0
32200 3b 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e  ;.  if( sCheck.n
32210 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75  Page==0 ){.    u
32220 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
32230 65 64 28 70 42 74 29 3b 0a 20 20 20 20 72 65 74  ed(pBt);.    ret
32240 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68  urn 0;.  }.  sCh
32250 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69  eck.anRef = sqli
32260 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 28 73 43  teMallocRaw( (sC
32270 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69  heck.nPage+1)*si
32280 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65  zeof(sCheck.anRe
32290 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21  f[0]) );.  if( !
322a0 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a  sCheck.anRef ){.
322b0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
322c0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
322d0 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20    *pnErr = 1;.  
322e0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
322f0 4d 50 72 69 6e 74 66 28 22 55 6e 61 62 6c 65 20  MPrintf("Unable 
32300 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79 74  to malloc %d byt
32310 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28 73  es", .        (s
32320 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73  Check.nPage+1)*s
32330 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52  izeof(sCheck.anR
32340 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 66  ef[0]));.  }.  f
32350 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63  or(i=0; i<=sChec
32360 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73  k.nPage; i++){ s
32370 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d  Check.anRef[i] =
32380 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44   0; }.  i = PEND
32390 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
323a0 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43 68  t);.  if( i<=sCh
323b0 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20  eck.nPage ){.   
323c0 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
323d0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68 65   = 1;.  }.  sChe
323e0 63 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  ck.zErrMsg = 0;.
323f0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
32400 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
32410 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20   freelist.  */. 
32420 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65   checkList(&sChe
32430 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28  ck, 1, get4byte(
32440 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
32450 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20  ata[32]),.      
32460 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
32470 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
32480 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66  ta[36]), "Main f
32490 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20  reelist: ");..  
324a0 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65  /* Check all the
324b0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
324c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74  for(i=0; i<nRoot
324d0 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72   && sCheck.mxErr
324e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
324f0 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f  aRoot[i]==0 ) co
32500 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20  ntinue;.#ifndef 
32510 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
32520 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
32530 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
32540 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a  & aRoot[i]>1 ){.
32550 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
32560 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74  p(&sCheck, aRoot
32570 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  [i], PTRMAP_ROOT
32580 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  PAGE, 0, 0);.   
32590 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68   }.#endif.    ch
325a0 65 63 6b 54 72 65 65 50 61 67 65 28 26 73 43 68  eckTreePage(&sCh
325b0 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30  eck, aRoot[i], 0
325c0 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20  , "List of tree 
325d0 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a  roots: ");.  }..
325e0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65    /* Make sure e
325f0 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
32600 20 66 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e   file is referen
32610 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ced.  */.  for(i
32620 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =1; i<=sCheck.nP
32630 61 67 65 20 26 26 20 73 43 68 65 63 6b 2e 6d 78  age && sCheck.mx
32640 45 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65  Err; i++){.#ifde
32650 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
32660 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
32670 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
32680 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ==0 ){.      che
32690 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
326a0 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
326b0 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
326c0 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65   i);.    }.#else
326d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
326e0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
326f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61   auto-vacuum, ma
32700 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65  ke sure no table
32710 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  s contain.    **
32720 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70   references to p
32730 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
32740 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
32750 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
32760 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28  ==0 && .       (
32770 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
32780 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42 74  t, i)!=i || !pBt
32790 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
327a0 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
327b0 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
327c0 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65  , "Page %d is ne
327d0 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20  ver used", i);. 
327e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 68     }.    if( sCh
327f0 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20  eck.anRef[i]!=0 
32800 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d  && .       (PTRM
32810 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69  AP_PAGENO(pBt, i
32820 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74  )==i && pBt->aut
32830 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
32840 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32850 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f  (&sCheck, 0, "Po
32860 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 25  inter map page %
32870 64 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 22  d is referenced"
32880 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , i);.    }.#end
32890 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  if.  }..  /* Mak
328a0 65 20 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c  e sure this anal
328b0 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61  ysis did not lea
328c0 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70  ve any unref() p
328d0 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f  ages.  */.  unlo
328e0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
328f0 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66  pBt);.  if( nRef
32900 20 21 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   != sqlite3Pager
32910 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
32920 61 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65  ager) ){.    che
32930 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
32940 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22  eck, 0, .      "
32950 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  Outstanding page
32960 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d   count goes from
32970 20 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67   %d to %d during
32980 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c   this analysis",
32990 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 73 71 6c  .      nRef, sql
329a0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
329b0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20  t(pBt->pPager). 
329c0 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20     );.  }..  /* 
329d0 43 6c 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65  Clean  up and re
329e0 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a  port errors..  *
329f0 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 73  /.  sqliteFree(s
32a00 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20  Check.anRef);.  
32a10 2a 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e  *pnErr = sCheck.
32a20 6e 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20 73  nErr;.  return s
32a30 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d  Check.zErrMsg;.}
32a40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
32a50 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
32a60 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _CHECK */../*.**
32a70 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
32a80 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
32a90 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
32aa0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
32ab0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
32ac0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
32ad0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
32ae0 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70  ssert( p->pBt->p
32af0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65  Pager!=0 );.  re
32b00 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65  turn sqlite3Page
32b10 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74  rFilename(p->pBt
32b20 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  ->pPager);.}../*
32b30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
32b40 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
32b50 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
32b60 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
32b70 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
32b80 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
32b90 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28  BtreeGetDirname(
32ba0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
32bb0 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
32bc0 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
32bd0 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  rn sqlite3PagerD
32be0 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  irname(p->pBt->p
32bf0 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
32c00 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   Return the path
32c10 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
32c20 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69  nal file for thi
32c30 73 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  s database. The 
32c40 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20  return.** value 
32c50 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
32c60 69 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 61  is the same rega
32c70 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
32c80 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
32c90 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
32ca0 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a  reated or not..*
32cb0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
32cc0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
32cd0 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a  rnalname(Btree *
32ce0 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
32cf0 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20  >pBt->pPager!=0 
32d00 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
32d10 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e  te3PagerJournaln
32d20 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
32d30 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  er);.}..#ifndef 
32d40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
32d50 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  UM./*.** Copy th
32d60 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
32d70 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e  nt of pBtFrom in
32d80 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74 72 61  to pBtTo.  A tra
32d90 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  nsaction.** must
32da0 20 62 65 20 61 63 74 69 76 65 20 66 6f 72 20 62   be active for b
32db0 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  oth files..**.**
32dc0 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c   The size of fil
32dd0 65 20 70 42 74 46 72 6f 6d 20 6d 61 79 20 62 65  e pBtFrom may be
32de0 20 72 65 64 75 63 65 64 20 62 79 20 74 68 69 73   reduced by this
32df0 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49   operation..** I
32e00 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
32e10 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73  wrong, the trans
32e20 61 63 74 69 6f 6e 20 6f 6e 20 70 42 74 46 72 6f  action on pBtFro
32e30 6d 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  m is rolled back
32e40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
32e50 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74  BtreeCopyFile(Bt
32e60 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20  ree *pTo, Btree 
32e70 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72  *pFrom){.  int r
32e80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
32e90 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67 65 2c 20   Pgno i, nPage, 
32ea0 6e 54 6f 50 61 67 65 2c 20 69 53 6b 69 70 3b 0a  nToPage, iSkip;.
32eb0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
32ec0 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20  To = pTo->pBt;. 
32ed0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 46 72   BtShared *pBtFr
32ee0 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  om = pFrom->pBt;
32ef0 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54  ..  if( pTo->inT
32f00 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
32f10 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72  E || pFrom->inTr
32f20 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
32f30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
32f40 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
32f50 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43  .  if( pBtTo->pC
32f60 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 53  ursor ) return S
32f70 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 6e 54  QLITE_BUSY;.  nT
32f80 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  oPage = sqlite3P
32f90 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
32fa0 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  tTo->pPager);.  
32fb0 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  nPage = sqlite3P
32fc0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
32fd0 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a  tFrom->pPager);.
32fe0 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e    iSkip = PENDIN
32ff0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54  G_BYTE_PAGE(pBtT
33000 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72  o);.  for(i=1; r
33010 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33020 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  i<=nPage; i++){.
33030 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
33040 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  age;.    if( i==
33050 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65  iSkip ) continue
33060 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
33070 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72  e3PagerGet(pBtFr
33080 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  om->pPager, i, &
33090 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
330a0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
330b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
330c0 67 65 72 4f 76 65 72 77 72 69 74 65 28 70 42 74  gerOverwrite(pBt
330d0 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 73  To->pPager, i, s
330e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
330f0 74 61 28 70 44 62 50 61 67 65 29 29 3b 0a 20 20  ta(pDbPage));.  
33100 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
33110 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
33120 7d 0a 20 20 66 6f 72 28 69 3d 6e 50 61 67 65 2b  }.  for(i=nPage+
33130 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1; rc==SQLITE_OK
33140 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67 65 3b 20   && i<=nToPage; 
33150 69 2b 2b 29 7b 0a 20 20 20 20 44 62 50 61 67 65  i++){.    DbPage
33160 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 69   *pDbPage;.    i
33170 66 28 20 69 3d 3d 69 53 6b 69 70 20 29 20 63 6f  f( i==iSkip ) co
33180 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d  ntinue;.    rc =
33190 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
331a0 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
331b0 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  i, &pDbPage);.  
331c0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
331d0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
331e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
331f0 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Page);.    sqlit
33200 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
33210 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Page);.    sqlit
33220 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
33230 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
33240 69 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72  i);.  }.  if( !r
33250 63 20 26 26 20 6e 50 61 67 65 3c 6e 54 6f 50 61  c && nPage<nToPa
33260 67 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ge ){.    rc = s
33270 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
33280 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  ate(pBtTo->pPage
33290 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20  r, nPage);.  }. 
332a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
332b0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
332c0 61 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 20 20  ack(pTo);.  }.  
332d0 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 23  return rc;  .}.#
332e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
332f0 4f 4d 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a  OMIT_VACUUM */..
33300 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  /*.** Return non
33310 2d 7a 65 72 6f 20 69 66 20 61 20 74 72 61 6e 73  -zero if a trans
33320 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
33330 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33340 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 42  BtreeIsInTrans(B
33350 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
33360 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54  rn (p && (p->inT
33370 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
33380 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  E));.}../*.** Re
33390 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
333a0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
333b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
333c0 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
333d0 65 33 42 74 72 65 65 49 73 49 6e 53 74 6d 74 28  e3BtreeIsInStmt(
333e0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
333f0 75 72 6e 20 28 70 2d 3e 70 42 74 20 26 26 20 70  urn (p->pBt && p
33400 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a  ->pBt->inStmt);.
33410 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
33420 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 72 65  non-zero if a re
33430 61 64 20 28 6f 72 20 77 72 69 74 65 29 20 74 72  ad (or write) tr
33440 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
33450 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
33460 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64  te3BtreeIsInRead
33470 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b  Trans(Btree *p){
33480 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20  .  return (p && 
33490 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41  (p->inTrans!=TRA
334a0 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a  NS_NONE));.}../*
334b0 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73  .** This call is
334c0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77   a no-op if no w
334d0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
334e0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63   is currently ac
334f0 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a  tive on pBt..**.
33500 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79  ** Otherwise, sy
33510 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
33520 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72  file for the btr
33530 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20  ee pBt. zMaster 
33540 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
33550 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
33560 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
33570 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
33580 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a  itten into the.*
33590 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  * individual jou
335a0 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73  rnal file, or is
335b0 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e   NULL, indicatin
335c0 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  g no master jour
335d0 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69  nal file .** (si
335e0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
335f0 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
33600 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
33610 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65  alled, the maste
33620 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64  r journal should
33630 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65   already have be
33640 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70  en.** created, p
33650 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
33660 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  is journal point
33670 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f  er and synced to
33680 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63   disk..**.** Onc
33690 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e  e this is routin
336a0 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20  e has returned, 
336b0 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72  the only thing r
336c0 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69  equired to commi
336d0 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74  t.** the write-t
336e0 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74  ransaction for t
336f0 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  his database fil
33700 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  e is to delete t
33710 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  he journal..*/.i
33720 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
33730 79 6e 63 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  ync(Btree *p, co
33740 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
33750 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
33760 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
33770 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
33780 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
33790 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
337a0 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20  ->pBt;.    Pgno 
337b0 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23 69 66 6e  nTrunc = 0;.#ifn
337c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
337d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
337e0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
337f0 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
33800 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
33810 74 28 70 42 74 2c 20 26 6e 54 72 75 6e 63 29 3b  t(pBt, &nTrunc);
33820 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d   .      if( rc!=
33830 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33840 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
33860 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
33870 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70  lite3PagerSync(p
33880 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
33890 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ter, nTrunc);.  
338a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
338b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
338c0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
338d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f  pointer to a blo
338e0 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
338f0 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  ciated with.** a
33900 20 73 69 6e 67 6c 65 20 73 68 61 72 65 64 2d 62   single shared-b
33910 74 72 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79  tree. The memory
33920 20 69 73 20 75 73 65 64 20 62 79 20 63 6c 69 65   is used by clie
33930 6e 74 20 63 6f 64 65 20 66 6f 72 20 69 74 27 73  nt code for it's
33940 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73   own.** purposes
33950 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74   (for example, t
33960 6f 20 73 74 6f 72 65 20 61 20 68 69 67 68 2d 6c  o store a high-l
33970 65 76 65 6c 20 73 63 68 65 6d 61 20 61 73 73 6f  evel schema asso
33980 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
33990 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
339a0 29 2e 20 54 68 65 20 62 74 72 65 65 20 6c 61 79  ). The btree lay
339b0 65 72 20 6d 61 6e 61 67 65 73 20 72 65 66 65 72  er manages refer
339c0 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67 20 69 73  ence counting is
339d0 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sues..**.** The 
339e0 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
339f0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73  is called on a s
33a00 68 61 72 65 64 2d 62 74 72 65 65 2c 20 6e 42 79  hared-btree, nBy
33a10 74 65 73 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  tes bytes of mem
33a20 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63  ory.** are alloc
33a30 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e  ated, zeroed, an
33a40 64 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  d returned to th
33a50 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61  e caller. For ea
33a60 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 0a 2a  ch subsequent .*
33a70 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42 79 74 65  * call the nByte
33a80 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  s parameter is i
33a90 67 6e 6f 72 65 64 20 61 6e 64 20 61 20 70 6f 69  gnored and a poi
33aa0 6e 74 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65  nter to the same
33ab0 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f   blob.** of memo
33ac0 72 79 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  ry returned. .**
33ad0 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f 72 65 20  .** Just before 
33ae0 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
33af0 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 68 65 20   is closed, the 
33b00 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65 64 20  function passed 
33b10 61 73 20 74 68 65 20 0a 2a 2a 20 78 46 72 65 65  as the .** xFree
33b20 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74   argument when t
33b30 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
33b40 74 69 6f 6e 20 77 61 73 20 6d 61 64 65 20 69 73  tion was made is
33b50 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20   invoked on the 
33b60 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f  .** blob of allo
33b70 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68  cated memory. Th
33b80 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
33b90 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69  ld not call sqli
33ba0 74 65 46 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74  teFree().** on t
33bb0 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62  he memory, the b
33bc0 74 72 65 65 20 6c 61 79 65 72 20 64 6f 65 73 20  tree layer does 
33bd0 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  that..*/.void *s
33be0 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
33bf0 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
33c00 6e 42 79 74 65 73 2c 20 76 6f 69 64 28 2a 78 46  nBytes, void(*xF
33c10 72 65 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20  ree)(void *)){. 
33c20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33c30 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 21   p->pBt;.  if( !
33c40 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
33c50 20 20 20 20 70 42 74 2d 3e 70 53 63 68 65 6d 61      pBt->pSchema
33c60 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
33c70 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 70 42 74  nBytes);.    pBt
33c80 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 3d 20  ->xFreeSchema = 
33c90 78 46 72 65 65 3b 0a 20 20 7d 0a 20 20 72 65 74  xFree;.  }.  ret
33ca0 75 72 6e 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  urn pBt->pSchema
33cb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
33cc0 6e 20 74 72 75 65 20 69 66 20 61 6e 6f 74 68 65  n true if anothe
33cd0 72 20 75 73 65 72 20 6f 66 20 74 68 65 20 73 61  r user of the sa
33ce0 6d 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  me shared btree 
33cf0 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  as the argument.
33d00 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20  ** handle holds 
33d10 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
33d20 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  k on the sqlite_
33d30 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 2a 2f  master table..*/
33d40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
33d50 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74  eSchemaLocked(Bt
33d60 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
33d70 6e 20 28 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  n (queryTableLoc
33d80 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
33d90 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21 3d 53 51  , READ_LOCK)!=SQ
33da0 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 23 69  LITE_OK);.}...#i
33db0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33dc0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
33dd0 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f  *.** Obtain a lo
33de0 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
33df0 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20  whose root page 
33e00 69 73 20 69 54 61 62 2e 20 20 54 68 65 0a 2a 2a  is iTab.  The.**
33e10 20 6c 6f 63 6b 20 69 73 20 61 20 77 72 69 74 65   lock is a write
33e20 20 6c 6f 63 6b 20 69 66 20 69 73 57 72 69 74 65   lock if isWrite
33e30 6c 6f 63 6b 20 69 73 20 74 72 75 65 20 6f 72 20  lock is true or 
33e40 61 20 72 65 61 64 20 6c 6f 63 6b 0a 2a 2a 20 69  a read lock.** i
33e50 66 20 69 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a  f it is false..*
33e60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
33e70 65 65 4c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65  eeLockTable(Btre
33e80 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 2c 20  e *p, int iTab, 
33e90 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 7b  u8 isWriteLock){
33ea0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33eb0 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 6c 6f 63 6b  TE_OK;.  u8 lock
33ec0 54 79 70 65 20 3d 20 28 69 73 57 72 69 74 65 4c  Type = (isWriteL
33ed0 6f 63 6b 3f 57 52 49 54 45 5f 4c 4f 43 4b 3a 52  ock?WRITE_LOCK:R
33ee0 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 72 63 20  EAD_LOCK);.  rc 
33ef0 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  = queryTableLock
33f00 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79  (p, iTab, lockTy
33f10 70 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  pe);.  if( rc==S
33f20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33f30 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70  rc = lockTable(p
33f40 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65  , iTab, lockType
33f50 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
33f60 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
33f70 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
33f80 67 20 64 65 62 75 67 67 69 6e 67 20 69 6e 74 65  g debugging inte
33f90 72 66 61 63 65 20 68 61 73 20 74 6f 20 62 65 20  rface has to be 
33fa0 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28 72 61  in this file (ra
33fb0 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 69 6e 2c  ther.** than in,
33fc0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 65   for example, te
33fd0 73 74 31 2e 63 29 20 73 6f 20 74 68 61 74 20 69  st1.c) so that i
33fe0 74 20 63 61 6e 20 67 65 74 20 61 63 63 65 73 73  t can get access
33ff0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 65 66 69 6e   to.** the defin
34000 69 74 69 6f 6e 20 6f 66 20 42 74 53 68 61 72 65  ition of BtShare
34010 64 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  d..*/.#if define
34020 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
34030 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 53 48  && defined(TCLSH
34040 29 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e  ).#include <tcl.
34050 68 3e 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  h>.int sqlite3_s
34060 68 61 72 65 64 5f 63 61 63 68 65 5f 72 65 70 6f  hared_cache_repo
34070 72 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  rt(.  void * cli
34080 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
34090 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
340a0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
340b0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
340c0 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
340d0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
340e0 5f 43 41 43 48 45 0a 20 20 63 6f 6e 73 74 20 54  _CACHE.  const T
340f0 68 72 65 61 64 44 61 74 61 20 2a 70 54 64 20 3d  hreadData *pTd =
34100 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
34110 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20  taReadOnly();.  
34120 69 66 28 20 70 54 64 2d 3e 75 73 65 53 68 61 72  if( pTd->useShar
34130 65 64 44 61 74 61 20 29 7b 0a 20 20 20 20 42 74  edData ){.    Bt
34140 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 20  Shared *pBt;.   
34150 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d   Tcl_Obj *pRet =
34160 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
34170 20 20 20 66 6f 72 28 70 42 74 3d 70 54 64 2d 3e     for(pBt=pTd->
34180 70 42 74 72 65 65 3b 20 70 42 74 3b 20 70 42 74  pBtree; pBt; pBt
34190 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
341a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
341b0 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  zFile = sqlite3P
341c0 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
341d0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  ->pPager);.     
341e0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
341f0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
34200 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
34210 74 72 69 6e 67 4f 62 6a 28 7a 46 69 6c 65 2c 20  tringObj(zFile, 
34220 2d 31 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  -1));.      Tcl_
34230 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
34240 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
34250 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
34260 28 70 42 74 2d 3e 6e 52 65 66 29 29 3b 0a 20 20  (pBt->nRef));.  
34270 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f    }.    Tcl_SetO
34280 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
34290 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64   pRet);.  }.#end
342a0 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
342b0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a           OK;.}.#endif.