/ Hex Artifact Content
Login

Artifact 861f6a805b55dbf37a35a0561e0cf5e99ed073ae:


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 31 38 20 32 30 30 36 2f 30  c,v 1.318 2006/0
0190: 33 2f 31 31 20 31 32 3a 30 34 3a 31 38 20 64 72  3/11 12:04:18 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 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
34a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
34b0: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
34c0: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d  is page */.  Mem
34d0: 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20  Page *pParent;  
34e0: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
34f0: 6f 66 20 74 68 69 73 20 70 61 67 65 2e 20 20 4e  of this page.  N
3500: 55 4c 4c 20 66 6f 72 20 72 6f 6f 74 20 2a 2f 0a  ULL for root */.
3510: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  };../*.** The in
3520: 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66  -memory image of
3530: 20 61 20 64 69 73 6b 20 70 61 67 65 20 68 61 73   a disk page has
3540: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
3550: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 70 70 65 6e  nformation appen
3560: 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 65 6e  ded.** to the en
3570: 64 2e 20 20 45 58 54 52 41 5f 53 49 5a 45 20 69  d.  EXTRA_SIZE i
3580: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
3590: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e  bytes of space n
35a0: 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 0a 2a 2a  eeded to hold.**
35b0: 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f   that extra info
35c0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65 66  rmation..*/.#def
35d0: 69 6e 65 20 45 58 54 52 41 5f 53 49 5a 45 20 73  ine EXTRA_SIZE s
35e0: 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 0a 0a  izeof(MemPage)..
35f0: 2f 2a 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  /* Btree handle 
3600: 2a 2f 0a 73 74 72 75 63 74 20 42 74 72 65 65 20  */.struct Btree 
3610: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 53 71  {.  sqlite3 *pSq
3620: 6c 69 74 65 3b 0a 20 20 42 74 53 68 61 72 65 64  lite;.  BtShared
3630: 20 2a 70 42 74 3b 0a 20 20 75 38 20 69 6e 54 72   *pBt;.  u8 inTr
3640: 61 6e 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ans;            
3650: 2f 2a 20 54 52 41 4e 53 5f 4e 4f 4e 45 2c 20 54  /* TRANS_NONE, T
3660: 52 41 4e 53 5f 52 45 41 44 20 6f 72 20 54 52 41  RANS_READ or TRA
3670: 4e 53 5f 57 52 49 54 45 20 2a 2f 0a 7d 3b 0a 0a  NS_WRITE */.};..
3680: 2f 2a 0a 2a 2a 20 42 74 72 65 65 2e 69 6e 54 72  /*.** Btree.inTr
3690: 61 6e 73 20 6d 61 79 20 74 61 6b 65 20 6f 6e 65  ans may take one
36a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
36b0: 67 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  g values..**.** 
36c0: 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61  If the shared-da
36d0: 74 61 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20  ta extension is 
36e0: 65 6e 61 62 6c 65 64 2c 20 74 68 65 72 65 20 6d  enabled, there m
36f0: 61 79 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 75  ay be multiple u
3700: 73 65 72 73 0a 2a 2a 20 6f 66 20 74 68 65 20 42  sers.** of the B
3710: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20  tree structure. 
3720: 41 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 66 20 74  At most one of t
3730: 68 65 73 65 20 6d 61 79 20 6f 70 65 6e 20 61 20  hese may open a 
3740: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
3750: 6e 2c 0a 2a 2a 20 62 75 74 20 61 6e 79 20 6e 75  n,.** but any nu
3760: 6d 62 65 72 20 6d 61 79 20 68 61 76 65 20 61 63  mber may have ac
3770: 74 69 76 65 20 72 65 61 64 20 74 72 61 6e 73 61  tive read transa
3780: 63 74 69 6f 6e 73 2e 20 56 61 72 69 61 62 6c 65  ctions. Variable
3790: 20 42 74 72 65 65 2e 70 44 62 20 0a 2a 2a 20 70   Btree.pDb .** p
37a0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 68 61 6e  oints to the han
37b0: 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 61 6e  dle that owns an
37c0: 79 20 63 75 72 72 65 6e 74 20 77 72 69 74 65 2d  y current write-
37d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
37e0: 23 64 65 66 69 6e 65 20 54 52 41 4e 53 5f 4e 4f  #define TRANS_NO
37f0: 4e 45 20 20 30 0a 23 64 65 66 69 6e 65 20 54 52  NE  0.#define TR
3800: 41 4e 53 5f 52 45 41 44 20 20 31 0a 23 64 65 66  ANS_READ  1.#def
3810: 69 6e 65 20 54 52 41 4e 53 5f 57 52 49 54 45 20  ine TRANS_WRITE 
3820: 32 0a 0a 2f 2a 0a 2a 2a 20 45 76 65 72 79 74 68  2../*.** Everyth
3830: 69 6e 67 20 77 65 20 6e 65 65 64 20 74 6f 20 6b  ing we need to k
3840: 6e 6f 77 20 61 62 6f 75 74 20 61 6e 20 6f 70 65  now about an ope
3850: 6e 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74  n database.*/.st
3860: 72 75 63 74 20 42 74 53 68 61 72 65 64 20 7b 0a  ruct BtShared {.
3870: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
3880: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
3890: 61 67 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 42  age cache */.  B
38a0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  tCursor *pCursor
38b0: 3b 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ;    /* A list o
38c0: 66 20 61 6c 6c 20 6f 70 65 6e 20 63 75 72 73 6f  f all open curso
38d0: 72 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  rs */.  MemPage 
38e0: 2a 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  *pPage1;      /*
38f0: 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
3900: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
3910: 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20   u8 inStmt;     
3920: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3930: 66 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74  f we are in a st
3940: 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
3950: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 72  action */.  u8 r
3960: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
3970: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3980: 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
3990: 20 69 73 20 72 65 61 64 6f 6e 6c 79 20 2a 2f 0a   is readonly */.
39a0: 20 20 75 38 20 6d 61 78 45 6d 62 65 64 46 72 61    u8 maxEmbedFra
39b0: 63 3b 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d  c;      /* Maxim
39c0: 75 6d 20 70 61 79 6c 6f 61 64 20 61 73 20 25 20  um payload as % 
39d0: 6f 66 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69  of total page si
39e0: 7a 65 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 45 6d  ze */.  u8 minEm
39f0: 62 65 64 46 72 61 63 3b 20 20 20 20 20 20 2f 2a  bedFrac;      /*
3a00: 20 4d 69 6e 69 6d 75 6d 20 70 61 79 6c 6f 61 64   Minimum payload
3a10: 20 61 73 20 25 20 6f 66 20 74 6f 74 61 6c 20 70   as % of total p
3a20: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38  age size */.  u8
3a30: 20 6d 69 6e 4c 65 61 66 46 72 61 63 3b 20 20 20   minLeafFrac;   
3a40: 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c      /* Minimum l
3a50: 65 61 66 20 70 61 79 6c 6f 61 64 20 61 73 20 25  eaf payload as %
3a60: 20 6f 66 20 74 6f 74 61 6c 20 70 61 67 65 20 73   of total page s
3a70: 69 7a 65 20 2a 2f 0a 20 20 75 38 20 70 61 67 65  ize */.  u8 page
3a80: 53 69 7a 65 46 69 78 65 64 3b 20 20 20 20 20 2f  SizeFixed;     /
3a90: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 70 61  * True if the pa
3aa0: 67 65 20 73 69 7a 65 20 63 61 6e 20 6e 6f 20 6c  ge size can no l
3ab0: 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
3ac0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
3ad0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
3ae0: 55 4d 0a 20 20 75 38 20 61 75 74 6f 56 61 63 75  UM.  u8 autoVacu
3af0: 75 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  um;        /* Tr
3b00: 75 65 20 69 66 20 64 61 74 61 62 61 73 65 20 73  ue if database s
3b10: 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
3b20: 75 75 6d 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  uum */.#endif.  
3b30: 75 31 36 20 70 61 67 65 53 69 7a 65 3b 20 20 20  u16 pageSize;   
3b40: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
3b50: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
3b60: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 31  n a page */.  u1
3b70: 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  6 usableSize;   
3b80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3b90: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
3ba0: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
3bb0: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 20  int maxLocal;   
3bc0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
3bd0: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69   local payload i
3be0: 6e 20 6e 6f 6e 2d 4c 45 41 46 44 41 54 41 20 74  n non-LEAFDATA t
3bf0: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  ables */.  int m
3c00: 69 6e 4c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20  inLocal;        
3c10: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 6f 63 61   /* Minimum loca
3c20: 6c 20 70 61 79 6c 6f 61 64 20 69 6e 20 6e 6f 6e  l payload in non
3c30: 2d 4c 45 41 46 44 41 54 41 20 74 61 62 6c 65 73  -LEAFDATA tables
3c40: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 65 61   */.  int maxLea
3c50: 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  f;          /* M
3c60: 61 78 69 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79  aximum local pay
3c70: 6c 6f 61 64 20 69 6e 20 61 20 4c 45 41 46 44 41  load in a LEAFDA
3c80: 54 41 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  TA table */.  in
3c90: 74 20 6d 69 6e 4c 65 61 66 3b 20 20 20 20 20 20  t minLeaf;      
3ca0: 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c      /* Minimum l
3cb0: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69 6e 20  ocal payload in 
3cc0: 61 20 4c 45 41 46 44 41 54 41 20 74 61 62 6c 65  a LEAFDATA table
3cd0: 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65   */.  BusyHandle
3ce0: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r *pBusyHandler;
3cf0: 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66     /* Callback f
3d00: 6f 72 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  or when there is
3d10: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
3d20: 20 2a 2f 0a 20 20 75 38 20 69 6e 54 72 61 6e 73   */.  u8 inTrans
3d30: 61 63 74 69 6f 6e 3b 20 20 20 20 20 2f 2a 20 54  action;     /* T
3d40: 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
3d50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3d70: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
3d80: 63 65 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ces to this stru
3d90: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cture */.  int n
3da0: 54 72 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20  Transaction;    
3db0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70   /* Number of op
3dc0: 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  en transactions 
3dd0: 28 72 65 61 64 20 2b 20 77 72 69 74 65 29 20 2a  (read + write) *
3de0: 2f 0a 20 20 76 6f 69 64 20 2a 70 53 63 68 65 6d  /.  void *pSchem
3df0: 61 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  a;        /* Poi
3e00: 6e 74 65 72 20 74 6f 20 73 70 61 63 65 20 61 6c  nter to space al
3e10: 6c 6f 63 61 74 65 64 20 62 79 20 73 71 6c 69 74  located by sqlit
3e20: 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 20  e3BtreeSchema() 
3e30: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 46 72 65  */.  void (*xFre
3e40: 65 53 63 68 65 6d 61 29 28 76 6f 69 64 2a 29 3b  eSchema)(void*);
3e50: 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20    /* Destructor 
3e60: 66 6f 72 20 42 74 53 68 61 72 65 64 2e 70 53 63  for BtShared.pSc
3e70: 68 65 6d 61 20 2a 2f 0a 23 69 66 6e 64 65 66 20  hema */.#ifndef 
3e80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e90: 45 44 5f 43 41 43 48 45 0a 20 20 42 74 4c 6f 63  ED_CACHE.  BtLoc
3ea0: 6b 20 2a 70 4c 6f 63 6b 3b 20 20 20 20 20 20 20  k *pLock;       
3eb0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6c 6f 63 6b   /* List of lock
3ec0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 73  s held on this s
3ed0: 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
3ee0: 63 74 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ct */.  BtShared
3ef0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a   *pNext;      /*
3f00: 20 4e 65 78 74 20 69 6e 20 54 68 72 65 61 64 44   Next in ThreadD
3f10: 61 74 61 2e 70 42 74 72 65 65 20 6c 69 6e 6b 65  ata.pBtree linke
3f20: 64 20 6c 69 73 74 20 2a 2f 0a 23 65 6e 64 69 66  d list */.#endif
3f30: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
3f40: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3f50: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3f60: 65 20 69 73 20 75 73 65 64 20 74 6f 20 68 6f 6c  e is used to hol
3f70: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
3f80: 20 61 62 6f 75 74 20 61 20 63 65 6c 6c 2e 20 20   about a cell.  
3f90: 54 68 65 20 70 61 72 73 65 43 65 6c 6c 50 74 72  The parseCellPtr
3fa0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c  () function fill
3fb0: 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  s in this struct
3fc0: 75 72 65 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ure.** based on 
3fd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 65 78 74 72  information extr
3fe0: 61 63 74 20 66 72 6f 6d 20 74 68 65 20 72 61 77  act from the raw
3ff0: 20 64 69 73 6b 20 70 61 67 65 2e 0a 2a 2f 0a 74   disk page..*/.t
4000: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 65  ypedef struct Ce
4010: 6c 6c 49 6e 66 6f 20 43 65 6c 6c 49 6e 66 6f 3b  llInfo CellInfo;
4020: 0a 73 74 72 75 63 74 20 43 65 6c 6c 49 6e 66 6f  .struct CellInfo
4030: 20 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20   {.  u8 *pCell; 
4040: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
4050: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63  o the start of c
4060: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
4070: 20 69 36 34 20 6e 4b 65 79 3b 20 20 20 20 20 20   i64 nKey;      
4080: 2f 2a 20 54 68 65 20 6b 65 79 20 66 6f 72 20 49  /* The key for I
4090: 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f 72  NTKEY tables, or
40a0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
40b0: 20 69 6e 20 6b 65 79 20 2a 2f 0a 20 20 75 33 32   in key */.  u32
40c0: 20 6e 44 61 74 61 3b 20 20 20 20 20 2f 2a 20 4e   nData;     /* N
40d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
40e0: 66 20 64 61 74 61 20 2a 2f 0a 20 20 75 31 36 20  f data */.  u16 
40f0: 6e 48 65 61 64 65 72 3b 20 20 20 2f 2a 20 53 69  nHeader;   /* Si
4100: 7a 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  ze of the cell c
4110: 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 69 6e  ontent header in
4120: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 31 36 20   bytes */.  u16 
4130: 6e 4c 6f 63 61 6c 3b 20 20 20 20 2f 2a 20 41 6d  nLocal;    /* Am
4140: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
4150: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
4160: 20 20 75 31 36 20 69 4f 76 65 72 66 6c 6f 77 3b    u16 iOverflow;
4170: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 6f 76   /* Offset to ov
4180: 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
4190: 65 72 2e 20 20 5a 65 72 6f 20 69 66 20 6e 6f 20  er.  Zero if no 
41a0: 6f 76 65 72 66 6c 6f 77 20 2a 2f 0a 20 20 75 31  overflow */.  u1
41b0: 36 20 6e 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  6 nSize;     /* 
41c0: 53 69 7a 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  Size of the cell
41d0: 20 63 6f 6e 74 65 6e 74 20 6f 6e 20 74 68 65 20   content on the 
41e0: 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
41f0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
4200: 63 75 72 73 6f 72 20 69 73 20 61 20 70 6f 69 6e  cursor is a poin
4210: 74 65 72 20 74 6f 20 61 20 70 61 72 74 69 63 75  ter to a particu
4220: 6c 61 72 20 65 6e 74 72 79 20 69 6e 20 74 68 65  lar entry in the
4230: 20 42 54 72 65 65 2e 0a 2a 2a 20 54 68 65 20 65   BTree..** The e
4240: 6e 74 72 79 20 69 73 20 69 64 65 6e 74 69 66 69  ntry is identifi
4250: 65 64 20 62 79 20 69 74 73 20 4d 65 6d 50 61 67  ed by its MemPag
4260: 65 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  e and the index 
4270: 69 6e 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 43  in.** MemPage.aC
4280: 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 65 6e 74  ell[] of the ent
4290: 72 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42 74  ry..*/.struct Bt
42a0: 43 75 72 73 6f 72 20 7b 0a 20 20 42 74 72 65 65  Cursor {.  Btree
42b0: 20 2a 70 42 74 72 65 65 3b 20 20 20 20 20 20 20   *pBtree;       
42c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 42 74 72 65       /* The Btre
42d0: 65 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20  e to which this 
42e0: 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 2a  cursor belongs *
42f0: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 4e  /.  BtCursor *pN
4300: 65 78 74 2c 20 2a 70 50 72 65 76 3b 20 20 2f 2a  ext, *pPrev;  /*
4310: 20 46 6f 72 6d 73 20 61 20 6c 69 6e 6b 65 64 20   Forms a linked 
4320: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 75 72 73  list of all curs
4330: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ors */.  int (*x
4340: 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
4350: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
4360: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 3b  nt,const void*);
4370: 20 2f 2a 20 4b 65 79 20 63 6f 6d 70 20 66 75 6e   /* Key comp fun
4380: 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  c */.  void *pAr
4390: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
43a0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
43b0: 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
43c0: 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 20   Pgno pgnoRoot; 
43d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
43e0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
43f0: 68 69 73 20 74 72 65 65 20 2a 2f 0a 20 20 4d 65  his tree */.  Me
4400: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
4410: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
4420: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
4430: 65 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  e entry */.  int
4440: 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20   idx;           
4450: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
4460: 6f 66 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20  of the entry in 
4470: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  pPage->aCell[] *
4480: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  /.  CellInfo inf
4490: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
44a0: 20 41 20 70 61 72 73 65 20 6f 66 20 74 68 65 20   A parse of the 
44b0: 63 65 6c 6c 20 77 65 20 61 72 65 20 70 6f 69 6e  cell we are poin
44c0: 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 75 38 20  ting at */.  u8 
44d0: 77 72 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  wrFlag;         
44e0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
44f0: 66 20 77 72 69 74 61 62 6c 65 20 2a 2f 0a 20 20  f writable */.  
4500: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
4510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
4520: 20 6f 66 20 74 68 65 20 43 55 52 53 4f 52 5f 58   of the CURSOR_X
4530: 58 58 20 63 6f 6e 73 74 61 6e 74 73 20 28 73 65  XX constants (se
4540: 65 20 62 65 6c 6f 77 29 20 2a 2f 0a 23 69 66 6e  e below) */.#ifn
4550: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4560: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 76  SHARED_CACHE.  v
4570: 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 69 36 34  oid *pKey;.  i64
4580: 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 73 6b 69   nKey;.  int ski
4590: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 28 73 6b  p;        /* (sk
45a0: 69 70 3c 30 29 20 2d 3e 20 50 72 65 76 28 29 20  ip<0) -> Prev() 
45b0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 28 73 6b 69  is a no-op. (ski
45c0: 70 3e 30 29 20 2d 3e 20 4e 65 78 74 28 29 20 69  p>0) -> Next() i
45d0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  s */.#endif.};..
45e0: 2f 2a 0a 2a 2a 20 50 6f 74 65 6e 74 69 61 6c 20  /*.** Potential 
45f0: 76 61 6c 75 65 73 20 66 6f 72 20 42 74 43 75 72  values for BtCur
4600: 73 6f 72 2e 65 53 74 61 74 65 2e 20 54 68 65 20  sor.eState. The 
4610: 66 69 72 73 74 20 74 77 6f 20 76 61 6c 75 65 73  first two values
4620: 20 28 56 41 4c 49 44 20 61 6e 64 20 0a 2a 2a 20   (VALID and .** 
4630: 49 4e 56 41 4c 49 44 29 20 6d 61 79 20 6f 63 63  INVALID) may occ
4640: 75 72 20 69 6e 20 61 6e 79 20 62 75 69 6c 64 2e  ur in any build.
4650: 20 54 68 65 20 74 68 69 72 64 20 28 52 45 51 55   The third (REQU
4660: 49 52 45 53 45 45 4b 29 20 6d 61 79 20 6f 6e 6c  IRESEEK) may onl
4670: 79 20 6f 63 63 75 72 20 0a 2a 2a 20 69 66 20 73  y occur .** if s
4680: 71 6c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c  qlite was compil
4690: 65 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 4f  ed without the O
46a0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
46b0: 20 73 79 6d 62 6f 6c 20 64 65 66 69 6e 65 64 2e   symbol defined.
46c0: 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 56 41  .**.** CURSOR_VA
46d0: 4c 49 44 3a 0a 2a 2a 20 20 20 43 75 72 73 6f 72  LID:.**   Cursor
46e0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
46f0: 69 64 20 65 6e 74 72 79 2e 20 67 65 74 50 61 79  id entry. getPay
4700: 6c 6f 61 64 28 29 20 65 74 63 2e 20 6d 61 79 20  load() etc. may 
4710: 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  be called..**.**
4720: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3a   CURSOR_INVALID:
4730: 0a 2a 2a 20 20 20 43 75 72 73 6f 72 20 64 6f 65  .**   Cursor doe
4740: 73 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  s not point to a
4750: 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 54 68   valid entry. Th
4760: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 28 66  is can happen (f
4770: 6f 72 20 65 78 61 6d 70 6c 65 29 20 0a 2a 2a 20  or example) .** 
4780: 20 20 62 65 63 61 75 73 65 20 74 68 65 20 74 61    because the ta
4790: 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ble is empty or 
47a0: 62 65 63 61 75 73 65 20 42 74 72 65 65 43 75 72  because BtreeCur
47b0: 73 6f 72 46 69 72 73 74 28 29 20 68 61 73 20 6e  sorFirst() has n
47c0: 6f 74 20 62 65 65 6e 0a 2a 2a 20 20 20 63 61 6c  ot been.**   cal
47d0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f  led..**.** CURSO
47e0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3a 0a 2a  R_REQUIRESEEK:.*
47f0: 2a 20 20 20 54 68 65 20 74 61 62 6c 65 20 74 68  *   The table th
4800: 61 74 20 74 68 69 73 20 63 75 72 73 6f 72 20 77  at this cursor w
4810: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 73 74 69  as opened on sti
4820: 6c 6c 20 65 78 69 73 74 73 2c 20 62 75 74 20 68  ll exists, but h
4830: 61 73 20 62 65 65 6e 20 0a 2a 2a 20 20 20 6d 6f  as been .**   mo
4840: 64 69 66 69 65 64 20 73 69 6e 63 65 20 74 68 65  dified since the
4850: 20 63 75 72 73 6f 72 20 77 61 73 20 6c 61 73 74   cursor was last
4860: 20 75 73 65 64 2e 20 54 68 65 20 63 75 72 73 6f   used. The curso
4870: 72 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 73 61  r position is sa
4880: 76 65 64 0a 2a 2a 20 20 20 69 6e 20 76 61 72 69  ved.**   in vari
4890: 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 70  ables BtCursor.p
48a0: 4b 65 79 20 61 6e 64 20 42 74 43 75 72 73 6f 72  Key and BtCursor
48b0: 2e 6e 4b 65 79 2e 20 57 68 65 6e 20 61 20 63 75  .nKey. When a cu
48c0: 72 73 6f 72 20 69 73 20 69 6e 20 0a 2a 2a 20 20  rsor is in .**  
48d0: 20 74 68 69 73 20 73 74 61 74 65 2c 20 72 65 73   this state, res
48e0: 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
48f0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6e 20  rPosition() can 
4900: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 74 74  be called to att
4910: 65 6d 70 74 20 74 6f 0a 2a 2a 20 20 20 73 65 65  empt to.**   see
4920: 6b 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  k the cursor to 
4930: 74 68 65 20 73 61 76 65 64 20 70 6f 73 69 74 69  the saved positi
4940: 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  on..*/.#define C
4950: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 20 20  URSOR_INVALID   
4960: 20 20 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e          0.#defin
4970: 65 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  e CURSOR_VALID  
4980: 20 20 20 20 20 20 20 20 20 20 20 31 0a 23 64 65             1.#de
4990: 66 69 6e 65 20 43 55 52 53 4f 52 5f 52 45 51 55  fine CURSOR_REQU
49a0: 49 52 45 53 45 45 4b 20 20 20 20 20 20 20 32 0a  IRESEEK       2.
49b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 52 41 43 45  ./*.** The TRACE
49c0: 20 6d 61 63 72 6f 20 77 69 6c 6c 20 70 72 69 6e   macro will prin
49d0: 74 20 68 69 67 68 2d 6c 65 76 65 6c 20 73 74 61  t high-level sta
49e0: 74 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tus information 
49f0: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 62 74 72  about the.** btr
4a00: 65 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 68 65  ee operation whe
4a10: 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72  n the global var
4a20: 69 61 62 6c 65 20 73 71 6c 69 74 65 33 5f 62 74  iable sqlite3_bt
4a30: 72 65 65 5f 74 72 61 63 65 20 69 73 0a 2a 2a 20  ree_trace is.** 
4a40: 65 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 23 69 66 20  enabled..*/.#if 
4a50: 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 64 65  SQLITE_TEST.# de
4a60: 66 69 6e 65 20 54 52 41 43 45 28 58 29 20 20 20  fine TRACE(X)   
4a70: 69 66 28 20 73 71 6c 69 74 65 33 5f 62 74 72 65  if( sqlite3_btre
4a80: 65 5f 74 72 61 63 65 20 29 5c 0a 20 20 20 20 20  e_trace )\.     
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 20 20 20 7b 20 73 71 6c 69 74 65 33 44 65 62 75     { sqlite3Debu
4ab0: 67 50 72 69 6e 74 66 20 58 3b 20 66 66 6c 75 73  gPrintf X; fflus
4ac0: 68 28 73 74 64 6f 75 74 29 3b 20 7d 0a 23 65 6c  h(stdout); }.#el
4ad0: 73 65 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43  se.# define TRAC
4ae0: 45 28 58 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20  E(X).#endif.int 
4af0: 73 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72  sqlite3_btree_tr
4b00: 61 63 65 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20  ace=0;  /* True 
4b10: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
4b20: 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  g */../*.** Forw
4b30: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
4b40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
4b50: 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74 53  eckReadLocks(BtS
4b60: 68 61 72 65 64 2a 2c 50 67 6e 6f 2c 42 74 43 75  hared*,Pgno,BtCu
4b70: 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52  rsor*);../*.** R
4b80: 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 74  ead or write a t
4b90: 77 6f 2d 20 61 6e 64 20 66 6f 75 72 2d 62 79 74  wo- and four-byt
4ba0: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
4bb0: 65 67 65 72 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  eger values..*/.
4bc0: 73 74 61 74 69 63 20 75 33 32 20 67 65 74 32 62  static u32 get2b
4bd0: 79 74 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61  yte(unsigned cha
4be0: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
4bf0: 28 70 5b 30 5d 3c 3c 38 29 20 7c 20 70 5b 31 5d  (p[0]<<8) | p[1]
4c00: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 67  ;.}.static u32 g
4c10: 65 74 34 62 79 74 65 28 75 6e 73 69 67 6e 65 64  et4byte(unsigned
4c20: 20 63 68 61 72 20 2a 70 29 7b 0a 20 20 72 65 74   char *p){.  ret
4c30: 75 72 6e 20 28 70 5b 30 5d 3c 3c 32 34 29 20 7c  urn (p[0]<<24) |
4c40: 20 28 70 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 70   (p[1]<<16) | (p
4c50: 5b 32 5d 3c 3c 38 29 20 7c 20 70 5b 33 5d 3b 0a  [2]<<8) | p[3];.
4c60: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  }.static void pu
4c70: 74 32 62 79 74 65 28 75 6e 73 69 67 6e 65 64 20  t2byte(unsigned 
4c80: 63 68 61 72 20 2a 70 2c 20 75 33 32 20 76 29 7b  char *p, u32 v){
4c90: 0a 20 20 70 5b 30 5d 20 3d 20 76 3e 3e 38 3b 0a  .  p[0] = v>>8;.
4ca0: 20 20 70 5b 31 5d 20 3d 20 76 3b 0a 7d 0a 73 74    p[1] = v;.}.st
4cb0: 61 74 69 63 20 76 6f 69 64 20 70 75 74 34 62 79  atic void put4by
4cc0: 74 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  te(unsigned char
4cd0: 20 2a 70 2c 20 75 33 32 20 76 29 7b 0a 20 20 70   *p, u32 v){.  p
4ce0: 5b 30 5d 20 3d 20 76 3e 3e 32 34 3b 0a 20 20 70  [0] = v>>24;.  p
4cf0: 5b 31 5d 20 3d 20 76 3e 3e 31 36 3b 0a 20 20 70  [1] = v>>16;.  p
4d00: 5b 32 5d 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b  [2] = v>>8;.  p[
4d10: 33 5d 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  3] = v;.}../*.**
4d20: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 72 65 61   Routines to rea
4d30: 64 20 61 6e 64 20 77 72 69 74 65 20 76 61 72 69  d and write vari
4d40: 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65  able-length inte
4d50: 67 65 72 73 2e 20 20 54 68 65 73 65 20 75 73 65  gers.  These use
4d60: 64 20 74 6f 0a 2a 2a 20 62 65 20 64 65 66 69 6e  d to.** be defin
4d70: 65 64 20 6c 6f 63 61 6c 6c 79 2c 20 62 75 74 20  ed locally, but 
4d80: 6e 6f 77 20 77 65 20 75 73 65 20 74 68 65 20 76  now we use the v
4d90: 61 72 69 6e 74 20 72 6f 75 74 69 6e 65 73 20 69  arint routines i
4da0: 6e 20 74 68 65 20 75 74 69 6c 2e 63 0a 2a 2a 20  n the util.c.** 
4db0: 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  file..*/.#define
4dc0: 20 67 65 74 56 61 72 69 6e 74 20 20 20 20 73 71   getVarint    sq
4dd0: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 0a 2f  lite3GetVarint./
4de0: 2a 20 23 64 65 66 69 6e 65 20 67 65 74 56 61 72  * #define getVar
4df0: 69 6e 74 33 32 20 20 73 71 6c 69 74 65 33 47 65  int32  sqlite3Ge
4e00: 74 56 61 72 69 6e 74 33 32 20 2a 2f 0a 23 64 65  tVarint32 */.#de
4e10: 66 69 6e 65 20 67 65 74 56 61 72 69 6e 74 33 32  fine getVarint32
4e20: 28 41 2c 42 29 20 20 28 28 2a 42 3d 2a 28 41 29  (A,B)  ((*B=*(A)
4e30: 29 3c 3d 30 78 37 66 3f 31 3a 73 71 6c 69 74 65  )<=0x7f?1:sqlite
4e40: 33 47 65 74 56 61 72 69 6e 74 33 32 28 41 2c 42  3GetVarint32(A,B
4e50: 29 29 0a 23 64 65 66 69 6e 65 20 70 75 74 56 61  )).#define putVa
4e60: 72 69 6e 74 20 20 20 20 73 71 6c 69 74 65 33 50  rint    sqlite3P
4e70: 75 74 56 61 72 69 6e 74 0a 0a 2f 2a 20 54 68 65  utVarint../* The
4e80: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 74   database page t
4e90: 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  he PENDING_BYTE 
4ea0: 6f 63 63 75 70 69 65 73 2e 20 54 68 69 73 20 70  occupies. This p
4eb0: 61 67 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  age is never use
4ec0: 64 2e 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73  d..** TODO: This
4ed0: 20 6d 61 63 72 6f 20 69 73 20 76 65 72 79 20 73   macro is very s
4ee0: 69 6d 69 6c 61 72 79 20 74 6f 20 50 41 47 45 52  imilary to PAGER
4ef0: 5f 4d 4a 5f 50 47 4e 4f 28 29 20 69 6e 20 70 61  _MJ_PGNO() in pa
4f00: 67 65 72 2e 63 2e 20 54 68 65 79 0a 2a 2a 20 73  ger.c. They.** s
4f10: 68 6f 75 6c 64 20 70 6f 73 73 69 62 6c 79 20 62  hould possibly b
4f20: 65 20 63 6f 6e 73 6f 6c 69 64 61 74 65 64 20 28  e consolidated (
4f30: 70 72 65 73 75 6d 61 62 6c 79 20 69 6e 20 70 61  presumably in pa
4f40: 67 65 72 2e 68 29 2e 0a 2a 2f 0a 23 64 65 66 69  ger.h)..*/.#defi
4f50: 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ne PENDING_BYTE_
4f60: 50 41 47 45 28 70 42 74 29 20 28 28 50 45 4e 44  PAGE(pBt) ((PEND
4f70: 49 4e 47 5f 42 59 54 45 2f 28 70 42 74 29 2d 3e  ING_BYTE/(pBt)->
4f80: 70 61 67 65 53 69 7a 65 29 2b 31 29 0a 0a 2f 2a  pageSize)+1)../*
4f90: 0a 2a 2a 20 41 20 6c 69 6e 6b 65 64 20 6c 69 73  .** A linked lis
4fa0: 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t of the followi
4fb0: 6e 67 20 73 74 72 75 63 74 75 72 65 73 20 69 73  ng structures is
4fc0: 20 73 74 6f 72 65 64 20 61 74 20 42 74 53 68 61   stored at BtSha
4fd0: 72 65 64 2e 70 4c 6f 63 6b 2e 0a 2a 2a 20 4c 6f  red.pLock..** Lo
4fe0: 63 6b 73 20 61 72 65 20 61 64 64 65 64 20 28 6f  cks are added (o
4ff0: 72 20 75 70 67 72 61 64 65 64 20 66 72 6f 6d 20  r upgraded from 
5000: 52 45 41 44 5f 4c 4f 43 4b 20 74 6f 20 57 52 49  READ_LOCK to WRI
5010: 54 45 5f 4c 4f 43 4b 29 20 77 68 65 6e 20 61 20  TE_LOCK) when a 
5020: 63 75 72 73 6f 72 20 0a 2a 2a 20 69 73 20 6f 70  cursor .** is op
5030: 65 6e 65 64 20 6f 6e 20 74 68 65 20 74 61 62 6c  ened on the tabl
5040: 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67 65  e with root page
5050: 20 42 74 53 68 61 72 65 64 2e 69 54 61 62 6c 65   BtShared.iTable
5060: 2e 20 4c 6f 63 6b 73 20 61 72 65 20 72 65 6d 6f  . Locks are remo
5070: 76 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 69 73  ved.** from this
5080: 20 6c 69 73 74 20 77 68 65 6e 20 61 20 74 72 61   list when a tra
5090: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
50a0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
50b0: 62 61 63 6b 2c 20 6f 72 20 77 68 65 6e 0a 2a 2a  back, or when.**
50c0: 20 61 20 62 74 72 65 65 20 68 61 6e 64 6c 65 20   a btree handle 
50d0: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  is closed..*/.st
50e0: 72 75 63 74 20 42 74 4c 6f 63 6b 20 7b 0a 20 20  ruct BtLock {.  
50f0: 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b 20 20  Btree *pBtree;  
5100: 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 68        /* Btree h
5110: 61 6e 64 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68  andle holding th
5120: 69 73 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  is lock */.  Pgn
5130: 6f 20 69 54 61 62 6c 65 3b 20 20 20 20 20 20 20  o iTable;       
5140: 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
5150: 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 38  of table */.  u8
5160: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
5170: 20 20 20 20 2f 2a 20 52 45 41 44 5f 4c 4f 43 4b      /* READ_LOCK
5180: 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 20 2a   or WRITE_LOCK *
5190: 2f 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4e 65 78  /.  BtLock *pNex
51a0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  t;        /* Nex
51b0: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 4c  t in BtShared.pL
51c0: 6f 63 6b 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a  ock list */.};..
51d0: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 76 61 6c  /* Candidate val
51e0: 75 65 73 20 66 6f 72 20 42 74 4c 6f 63 6b 2e 65  ues for BtLock.e
51f0: 4c 6f 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Lock */.#define 
5200: 52 45 41 44 5f 4c 4f 43 4b 20 20 20 20 20 31 0a  READ_LOCK     1.
5210: 23 64 65 66 69 6e 65 20 57 52 49 54 45 5f 4c 4f  #define WRITE_LO
5220: 43 4b 20 20 20 20 32 0a 0a 23 69 66 64 65 66 20  CK    2..#ifdef 
5230: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
5240: 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20  ED_CACHE.  /*.  
5250: 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 73  ** The functions
5260: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
5270: 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29 20 61  ), lockTable() a
5280: 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  nd unlockAllTabl
5290: 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  es().  ** manipu
52a0: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
52b0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
52c0: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
52d0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
52e0: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
52f0: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
5300: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
5310: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
5320: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
5330: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
5340: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
5350: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
5360: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
5370: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
5380: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
5390: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
53a0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
53b0: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
53c0: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
53d0: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
53e0: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
53f0: 65 66 69 6e 65 20 71 75 65 72 79 54 61 62 6c 65  efine queryTable
5400: 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49  Lock(a,b,c) SQLI
5410: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
5420: 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c 63 29  lockTable(a,b,c)
5430: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
5440: 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61  fine unlockAllTa
5450: 62 6c 65 73 28 61 29 0a 20 20 23 64 65 66 69 6e  bles(a).  #defin
5460: 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  e restoreOrClear
5470: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 61  CursorPosition(a
5480: 2c 62 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,b) SQLITE_OK.  
5490: 23 64 65 66 69 6e 65 20 73 61 76 65 41 6c 6c 43  #define saveAllC
54a0: 75 72 73 6f 72 73 28 61 2c 62 2c 63 29 20 53 51  ursors(a,b,c) SQ
54b0: 4c 49 54 45 5f 4f 4b 0a 0a 23 65 6c 73 65 0a 0a  LITE_OK..#else..
54c0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
54d0: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
54e0: 2a 70 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *pPage);../*.** 
54f0: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
5500: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
5510: 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65   in the variable
5520: 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20  s BtCursor.nKey 
5530: 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72  .** and BtCursor
5540: 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f  .pKey. The curso
5550: 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74  r's state is set
5560: 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49   to CURSOR_REQUI
5570: 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69  RESEEK..*/.stati
5580: 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72  c int saveCursor
5590: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
55a0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
55b0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43  rc;..  assert( C
55c0: 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
55d0: 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61  r->eState );.  a
55e0: 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e  ssert( 0==pCur->
55f0: 70 4b 65 79 20 29 3b 0a 0a 20 20 72 63 20 3d 20  pKey );..  rc = 
5600: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
5610: 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d  ize(pCur, &pCur-
5620: 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66  >nKey);..  /* If
5630: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
5640: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
5650: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
5660: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
5670: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
5680: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
5690: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
56a0: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
56b0: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
56c0: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
56d0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
56e0: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
56f0: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
5700: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
5710: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
5720: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
5730: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
5740: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
5750: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
5760: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
5770: 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
5780: 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  Key){.    void *
5790: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pKey = sqliteMal
57a0: 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  loc(pCur->nKey);
57b0: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
57c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
57d0: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
57e0: 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  , 0, pCur->nKey,
57f0: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
5800: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5810: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
5820: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
5830: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5840: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b     sqliteFree(pK
5850: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
5860: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
5870: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
5880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
5890: 65 72 74 28 20 21 70 43 75 72 2d 3e 70 50 61 67  ert( !pCur->pPag
58a0: 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  e->intKey || !pC
58b0: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
58c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
58d0: 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
58e0: 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
58f0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67  ;.    pCur->pPag
5900: 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
5910: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5920: 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20  _REQUIRESEEK;.  
5930: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
5940: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
5950: 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
5960: 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65 70  ll cursors excep
5970: 74 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20 6f  t pExcept open o
5980: 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20  n the table .** 
5990: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
59a0: 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74  Root. Usually, t
59b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  his is called ju
59c0: 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72  st before cursor
59d0: 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75  .** pExcept is u
59e0: 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  sed to modify th
59f0: 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65  e table (BtreeDe
5a00: 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49  lete() or BtreeI
5a10: 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61  nsert())..*/.sta
5a20: 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43  tic int saveAllC
5a30: 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
5a40: 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74  *pBt, Pgno iRoot
5a50: 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
5a60: 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ept){.  BtCursor
5a70: 20 2a 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   *p;.  if( sqlit
5a80: 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
5a90: 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65  Only()->useShare
5aa0: 64 44 61 74 61 20 29 7b 0a 20 20 20 20 66 6f 72  dData ){.    for
5ab0: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
5ac0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
5ad0: 0a 20 20 20 20 20 20 69 66 28 20 70 21 3d 70 45  .      if( p!=pE
5ae0: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
5af0: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
5b00: 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20  t==iRoot) && .  
5b10: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
5b20: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5b30: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5b40: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5b50: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5b60: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5b70: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
5b80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
5b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5ba0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5bb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5bc0: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
5bd0: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
5be0: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
5bf0: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
5c00: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
5c10: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
5c20: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
5c30: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
5c40: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
5c50: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
5c60: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
5c70: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
5c80: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
5c90: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
5ca0: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
5cb0: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
5cc0: 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
5cd0: 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66  sition() call af
5ce0: 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76  ter each .** sav
5cf0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5d00: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
5d10: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
5d20: 61 72 67 75 6d 65 6e 74 20 2d 20 64 6f 53 65 65  argument - doSee
5d30: 6b 20 2d 20 69 73 20 66 61 6c 73 65 2c 20 74 68  k - is false, th
5d40: 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 2a  en instead of .*
5d50: 2a 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20  * returning the 
5d60: 63 75 72 73 6f 72 20 74 6f 20 69 74 27 73 20 73  cursor to it's s
5d70: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c 20 61  aved position, a
5d80: 6e 79 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ny saved positio
5d90: 6e 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  n is deleted.** 
5da0: 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
5db0: 74 61 74 65 20 73 65 74 20 74 6f 20 43 55 52 53  tate set to CURS
5dc0: 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f 0a 73  OR_INVALID..*/.s
5dd0: 74 61 74 69 63 20 69 6e 74 20 72 65 73 74 6f 72  tatic int restor
5de0: 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
5df0: 73 69 74 69 6f 6e 58 28 42 74 43 75 72 73 6f 72  sitionX(BtCursor
5e00: 20 2a 70 43 75 72 2c 20 69 6e 74 20 64 6f 53 65   *pCur, int doSe
5e10: 65 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ek){.  int rc = 
5e20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
5e30: 65 72 74 28 20 73 71 6c 69 74 65 33 54 68 72 65  ert( sqlite3Thre
5e40: 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
5e50: 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20  ->useSharedData 
5e60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
5e70: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5e80: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
5e90: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
5ea0: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
5eb0: 3b 0a 20 20 69 66 28 20 64 6f 53 65 65 6b 20 29  ;.  if( doSeek )
5ec0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
5ed0: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  e3BtreeMoveto(pC
5ee0: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
5ef0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 26 70 43 75  pCur->nKey, &pCu
5f00: 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 7d 0a 20 20  r->skip);.  }.  
5f10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5f20: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  K ){.    sqliteF
5f30: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
5f40: 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  .    pCur->pKey 
5f50: 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
5f60: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
5f70: 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43  Cur->eState || C
5f80: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
5f90: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
5fa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5fb0: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
5fc0: 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
5fd0: 6f 73 69 74 69 6f 6e 28 70 2c 78 29 20 5c 0a 20  osition(p,x) \. 
5fe0: 20 28 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52   (p->eState==CUR
5ff0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3f  SOR_REQUIRESEEK?
6000: 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
6010: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 58 28 70 2c  rsorPositionX(p,
6020: 78 29 3a 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f  x):SQLITE_OK)../
6030: 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20 73 65  *.** Query to se
6040: 65 20 69 66 20 62 74 72 65 65 20 68 61 6e 64 6c  e if btree handl
6050: 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e 20 61  e p may obtain a
6060: 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 65 4c   lock of type eL
6070: 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f  ock .** (READ_LO
6080: 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b  CK or WRITE_LOCK
6090: 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77  ) on the table w
60a0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
60b0: 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51  ab. Return.** SQ
60c0: 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c  LITE_OK if the l
60d0: 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74 61 69  ock may be obtai
60e0: 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e 67 20  ned (by calling 
60f0: 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2c 20 6f 72  lockTable()), or
6100: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  .** SQLITE_LOCKE
6110: 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  D if not..*/.sta
6120: 74 69 63 20 69 6e 74 20 71 75 65 72 79 54 61 62  tic int queryTab
6130: 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c  leLock(Btree *p,
6140: 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65   Pgno iTab, u8 e
6150: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
6160: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
6170: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
6180: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  ;..  /* This is 
6190: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73  a no-op if the s
61a0: 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e  hared-cache is n
61b0: 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  ot enabled */.  
61c0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 54 68  if( 0==sqlite3Th
61d0: 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
61e0: 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74  ()->useSharedDat
61f0: 61 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  a ){.    return 
6200: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
6210: 20 20 2f 2a 20 54 68 69 73 20 28 61 6c 6f 6e 67    /* This (along
6220: 20 77 69 74 68 20 6c 6f 63 6b 54 61 62 6c 65 28   with lockTable(
6230: 29 29 20 69 73 20 77 68 65 72 65 20 74 68 65 20  )) is where the 
6240: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
6250: 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 64 65 61  flag is.  ** dea
6260: 6c 74 20 77 69 74 68 2e 20 49 66 20 74 68 65 20  lt with. If the 
6270: 63 61 6c 6c 65 72 20 69 73 20 71 75 65 72 79 69  caller is queryi
6280: 6e 67 20 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f  ng for a read-lo
6290: 63 6b 20 61 6e 64 20 74 68 65 20 66 6c 61 67 20  ck and the flag 
62a0: 69 73 0a 20 20 2a 2a 20 73 65 74 2c 20 69 74 20  is.  ** set, it 
62b0: 69 73 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c  is unconditional
62c0: 6c 79 20 67 72 61 6e 74 65 64 20 2d 20 65 76 65  ly granted - eve
62d0: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 77  n if there are w
62e0: 72 69 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20  rite-locks.  ** 
62f0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66  on the table. If
6300: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73   a write-lock is
6310: 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 20   requested, the 
6320: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
6330: 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  flag.  ** is not
6340: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a   considered..  *
6350: 2a 0a 20 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69  *.  ** In functi
6360: 6f 6e 20 6c 6f 63 6b 54 61 62 6c 65 28 29 2c 20  on lockTable(), 
6370: 69 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  if a read-lock i
6380: 73 20 64 65 6d 61 6e 64 65 64 20 61 6e 64 20 74  s demanded and t
6390: 68 65 20 0a 20 20 2a 2a 20 52 65 61 64 55 6e 63  he .  ** ReadUnc
63a0: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
63b0: 20 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79 20 69   set, no entry i
63c0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  s added to the l
63d0: 6f 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a 2a 20  ocks list .  ** 
63e0: 28 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 29  (BtShared.pLock)
63f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73  ..  **.  ** To s
6400: 75 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74 68 65  ummarize: If the
6410: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
6420: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
6430: 65 6e 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  en read cursors 
6440: 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 63 72 65 61  do.  ** not crea
6450: 74 65 20 6f 72 20 72 65 73 70 65 63 74 20 74 61  te or respect ta
6460: 62 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65 20 6c  ble locks. The l
6470: 6f 63 6b 69 6e 67 20 70 72 6f 63 65 64 75 72 65  ocking procedure
6480: 20 66 6f 72 20 61 20 0a 20 20 2a 2a 20 77 72 69   for a .  ** wri
6490: 74 65 2d 63 75 72 73 6f 72 20 64 6f 65 73 20 6e  te-cursor does n
64a0: 6f 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  ot change..  */.
64b0: 20 20 69 66 28 20 0a 20 20 20 20 21 70 2d 3e 70    if( .    !p->p
64c0: 53 71 6c 69 74 65 20 7c 7c 20 0a 20 20 20 20 30  Sqlite || .    0
64d0: 3d 3d 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 66  ==(p->pSqlite->f
64e0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
64f0: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
6500: 0a 20 20 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  .    eLock==WRIT
6510: 45 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54  E_LOCK ||.    iT
6520: 61 62 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a  ab==MASTER_ROOT.
6530: 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74    ){.    for(pIt
6540: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
6550: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
6560: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
6570: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
6580: 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e  ee!=p && pIter->
6590: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20  iTable==iTab && 
65a0: 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65  .          (pIte
65b0: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
65c0: 7c 7c 20 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c  || eLock!=READ_L
65d0: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  OCK) ){.        
65e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
65f0: 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CKED;.      }.  
6600: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6610: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6620: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
6630: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
6640: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
6650: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
6660: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
6670: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
6680: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
6690: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
66a0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
66b0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
66c0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
66d0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
66e0: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
66f0: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
6700: 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20  ITE_BUSY and.** 
6710: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79  SQLITE_NOMEM may
6720: 20 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e 65   also be returne
6730: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
6740: 20 6c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65 65   lockTable(Btree
6750: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
6760: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
6770: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
6780: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
6790: 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  *pLock = 0;.  Bt
67a0: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
67b0: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  /* This is a no-
67c0: 6f 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64  op if the shared
67d0: 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e  -cache is not en
67e0: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 30  abled */.  if( 0
67f0: 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  ==sqlite3ThreadD
6800: 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75  ataReadOnly()->u
6810: 73 65 53 68 61 72 65 64 44 61 74 61 20 29 7b 0a  seSharedData ){.
6820: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6830: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  E_OK;.  }..  ass
6840: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
6850: 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70  queryTableLock(p
6860: 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29  , iTable, eLock)
6870: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
6880: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
6890: 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  d flag is set an
68a0: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73  d a read-lock is
68b0: 20 72 65 71 75 65 73 74 65 64 2c 0a 20 20 2a 2a   requested,.  **
68c0: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69   return early wi
68d0: 74 68 6f 75 74 20 61 64 64 69 6e 67 20 61 6e 20  thout adding an 
68e0: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 42 74 53  entry to the BtS
68f0: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74  hared.pLock list
6900: 2e 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65  . See.  ** comme
6910: 6e 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 71  nt in function q
6920: 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20  ueryTableLock() 
6930: 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 20 6f 6e  for more info on
6940: 20 68 61 6e 64 6c 69 6e 67 20 0a 20 20 2a 2a 20   handling .  ** 
6950: 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74  the ReadUncommit
6960: 74 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20  ted flag..  */. 
6970: 20 69 66 28 20 0a 20 20 20 20 28 70 2d 3e 70 53   if( .    (p->pS
6980: 71 6c 69 74 65 29 20 26 26 20 0a 20 20 20 20 28  qlite) && .    (
6990: 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 66 6c 61 67  p->pSqlite->flag
69a0: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
69b0: 6f 6d 6d 69 74 74 65 64 29 20 26 26 20 0a 20 20  ommitted) && .  
69c0: 20 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c    (eLock==READ_L
69d0: 4f 43 4b 29 20 26 26 0a 20 20 20 20 69 54 61 62  OCK) &&.    iTab
69e0: 6c 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a  le!=MASTER_ROOT.
69f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
6a00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
6a10: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
6a20: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
6a30: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
6a40: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
6a50: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
6a60: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
6a70: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
6a80: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
6a90: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
6aa0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
6ab0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
6ac0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
6ad0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6ae0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
6af0: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
6b00: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
6b10: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
6b20: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
6b30: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
6b40: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
6b50: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
6b60: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
6b70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
6b80: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
6b90: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
6ba0: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
6bb0: 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69  (BtLock));.    i
6bc0: 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( !pLock ){.   
6bd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6be0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
6bf0: 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20    pLock->iTable 
6c00: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c  = iTable;.    pL
6c10: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  ock->pBtree = p;
6c20: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78  .    pLock->pNex
6c30: 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a  t = pBt->pLock;.
6c40: 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
6c50: 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   pLock;.  }..  /
6c60: 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63 6b  * Set the BtLock
6c70: 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20  .eLock variable 
6c80: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  to the maximum o
6c90: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  f the current lo
6ca0: 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ck.  ** and the 
6cb0: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20  requested lock. 
6cc0: 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61 20  This means if a 
6cd0: 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61  write-lock was a
6ce0: 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a  lready held.  **
6cf0: 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b   and a read-lock
6d00: 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20 64   requested, we d
6d10: 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c 79  on't incorrectly
6d20: 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20 6c   downgrade the l
6d30: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ock..  */.  asse
6d40: 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52  rt( WRITE_LOCK>R
6d50: 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  EAD_LOCK );.  if
6d60: 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65  ( eLock>pLock->e
6d70: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
6d80: 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b  k->eLock = eLock
6d90: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
6da0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6db0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20  .** Release all 
6dc0: 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20  the table locks 
6dd0: 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20  (locks obtained 
6de0: 76 69 61 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  via calls to the
6df0: 20 6c 6f 63 6b 54 61 62 6c 65 28 29 0a 2a 2a 20   lockTable().** 
6e00: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
6e10: 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  by Btree handle 
6e20: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
6e30: 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65  d unlockAllTable
6e40: 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  s(Btree *p){.  B
6e50: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
6e60: 20 26 70 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b   &p->pBt->pLock;
6e70: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
6e80: 61 72 65 64 2d 63 61 63 68 65 20 65 78 74 65 6e  ared-cache exten
6e90: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 65 6e 61 62  sion is not enab
6ea0: 6c 65 64 2c 20 74 68 65 72 65 20 73 68 6f 75 6c  led, there shoul
6eb0: 64 20 62 65 20 6e 6f 0a 20 20 2a 2a 20 6c 6f 63  d be no.  ** loc
6ec0: 6b 73 20 69 6e 20 74 68 65 20 42 74 53 68 61 72  ks in the BtShar
6ed0: 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2c 20 6d  ed.pLock list, m
6ee0: 61 6b 69 6e 67 20 74 68 69 73 20 70 72 6f 63 65  aking this proce
6ef0: 64 75 72 65 20 61 20 6e 6f 2d 6f 70 2e 20 41 73  dure a no-op. As
6f00: 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 74  sert.  ** that t
6f10: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e  his is the case.
6f20: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
6f30: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
6f40: 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65  aReadOnly()->use
6f50: 53 68 61 72 65 64 44 61 74 61 20 7c 7c 20 30 3d  SharedData || 0=
6f60: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 0a 20 20 77  =*ppIter );..  w
6f70: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
6f80: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
6f90: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
6fa0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
6fb0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
6fc0: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
6fd0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
6fe0: 6c 69 74 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b  liteFree(pLock);
6ff0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7000: 20 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63    ppIter = &pLoc
7010: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  k->pNext;.    }.
7020: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
7030: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
7040: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
7050: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7060: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
7070: 2a 20 54 68 65 73 65 20 6d 61 63 72 6f 73 20 64  * These macros d
7080: 65 66 69 6e 65 20 74 68 65 20 6c 6f 63 61 74 69  efine the locati
7090: 6f 6e 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  on of the pointe
70a0: 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r-map entry for 
70b0: 61 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 70  a .** database p
70c0: 61 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  age. The first a
70d0: 72 67 75 6d 65 6e 74 20 74 6f 20 65 61 63 68 20  rgument to each 
70e0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
70f0: 20 75 73 61 62 6c 65 0a 2a 2a 20 62 79 74 65 73   usable.** bytes
7100: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
7110: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 6f   the database (o
7120: 66 74 65 6e 20 31 30 32 34 29 2e 20 54 68 65 20  ften 1024). The 
7130: 73 65 63 6f 6e 64 20 69 73 20 74 68 65 0a 2a 2a  second is the.**
7140: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
7150: 6c 6f 6f 6b 20 75 70 20 69 6e 20 74 68 65 20 70  look up in the p
7160: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7170: 2a 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20  * PTRMAP_PAGENO 
7180: 72 65 74 75 72 6e 73 20 74 68 65 20 64 61 74 61  returns the data
7190: 62 61 73 65 20 70 61 67 65 20 6e 75 6d 62 65 72  base page number
71a0: 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
71b0: 6d 61 70 0a 2a 2a 20 70 61 67 65 20 74 68 61 74  map.** page that
71c0: 20 73 74 6f 72 65 73 20 74 68 65 20 72 65 71 75   stores the requ
71d0: 69 72 65 64 20 70 6f 69 6e 74 65 72 2e 20 50 54  ired pointer. PT
71e0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 20 72  RMAP_PTROFFSET r
71f0: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 6f 66  eturns.** the of
7200: 66 73 65 74 20 6f 66 20 74 68 65 20 72 65 71 75  fset of the requ
7210: 65 73 74 65 64 20 6d 61 70 20 65 6e 74 72 79 2e  ested map entry.
7220: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 67  .**.** If the pg
7230: 6e 6f 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  no argument pass
7240: 65 64 20 74 6f 20 50 54 52 4d 41 50 5f 50 41 47  ed to PTRMAP_PAG
7250: 45 4e 4f 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ENO is a pointer
7260: 2d 6d 61 70 20 70 61 67 65 2c 0a 2a 2a 20 74 68  -map page,.** th
7270: 65 6e 20 70 67 6e 6f 20 69 73 20 72 65 74 75 72  en pgno is retur
7280: 6e 65 64 2e 20 53 6f 20 28 70 67 6e 6f 3d 3d 50  ned. So (pgno==P
7290: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 67 73  TRMAP_PAGENO(pgs
72a0: 7a 2c 20 70 67 6e 6f 29 29 20 63 61 6e 20 62 65  z, pgno)) can be
72b0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 74 65 73 74  .** used to test
72c0: 20 69 66 20 70 67 6e 6f 20 69 73 20 61 20 70 6f   if pgno is a po
72d0: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2e 20  inter-map page. 
72e0: 50 54 52 4d 41 50 5f 49 53 50 41 47 45 20 69 6d  PTRMAP_ISPAGE im
72f0: 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 69 73  plements.** this
7300: 20 74 65 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e   test..*/.#defin
7310: 65 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  e PTRMAP_PAGENO(
7320: 70 42 74 2c 20 70 67 6e 6f 29 20 70 74 72 6d 61  pBt, pgno) ptrma
7330: 70 50 61 67 65 6e 6f 28 70 42 74 2c 20 70 67 6e  pPageno(pBt, pgn
7340: 6f 29 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41  o).#define PTRMA
7350: 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2c  P_PTROFFSET(pBt,
7360: 20 70 67 6e 6f 29 20 28 35 2a 28 70 67 6e 6f 2d   pgno) (5*(pgno-
7370: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 70 42 74  ptrmapPageno(pBt
7380: 2c 20 70 67 6e 6f 29 2d 31 29 29 0a 23 64 65 66  , pgno)-1)).#def
7390: 69 6e 65 20 50 54 52 4d 41 50 5f 49 53 50 41 47  ine PTRMAP_ISPAG
73a0: 45 28 70 42 74 2c 20 70 67 6e 6f 29 20 28 50 54  E(pBt, pgno) (PT
73b0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 28 70 42 74  RMAP_PAGENO((pBt
73c0: 29 2c 28 70 67 6e 6f 29 29 3d 3d 28 70 67 6e 6f  ),(pgno))==(pgno
73d0: 29 29 0a 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  ))..static Pgno 
73e0: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53  ptrmapPageno(BtS
73f0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
7400: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50   pgno){.  int nP
7410: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
7420: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
7430: 65 2f 35 29 2b 31 3b 0a 20 20 69 6e 74 20 69 50  e/5)+1;.  int iP
7440: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
7450: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
7460: 65 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 28  e;.  int ret = (
7470: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
7480: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
7490: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
74a0: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
74b0: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
74c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
74d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
74e0: 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 61 20  ointer map is a 
74f0: 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 74 68 61  lookup table tha
7500: 74 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  t identifies the
7510: 20 70 61 72 65 6e 74 20 70 61 67 65 20 66 6f 72   parent page for
7520: 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 70  .** each child p
7530: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
7540: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
7550: 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 74 68  arent page is th
7560: 65 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 63  e page that.** c
7570: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
7580: 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20  r to the child. 
7590: 20 45 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   Every page in t
75a0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
75b0: 61 69 6e 73 0a 2a 2a 20 30 20 6f 72 20 31 20 70  ains.** 0 or 1 p
75c0: 61 72 65 6e 74 20 70 61 67 65 73 2e 20 20 28 49  arent pages.  (I
75d0: 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20 27  n this context '
75e0: 64 61 74 61 62 61 73 65 20 70 61 67 65 27 20 72  database page' r
75f0: 65 66 65 72 73 0a 2a 2a 20 74 6f 20 61 6e 79 20  efers.** to any 
7600: 70 61 67 65 20 74 68 61 74 20 69 73 20 6e 6f 74  page that is not
7610: 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 6f 69   part of the poi
7620: 6e 74 65 72 20 6d 61 70 20 69 74 73 65 6c 66 2e  nter map itself.
7630: 29 20 20 45 61 63 68 20 70 6f 69 6e 74 65 72 20  )  Each pointer 
7640: 6d 61 70 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 6e  map.** entry con
7650: 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c  sists of a singl
7660: 65 20 62 79 74 65 20 27 74 79 70 65 27 20 61 6e  e byte 'type' an
7670: 64 20 61 20 34 20 62 79 74 65 20 70 61 72 65 6e  d a 4 byte paren
7680: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
7690: 2a 20 54 68 65 20 50 54 52 4d 41 50 5f 58 58 58  * The PTRMAP_XXX
76a0: 20 69 64 65 6e 74 69 66 69 65 72 73 20 62 65 6c   identifiers bel
76b0: 6f 77 20 61 72 65 20 74 68 65 20 76 61 6c 69 64  ow are the valid
76c0: 20 74 79 70 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   types..**.** Th
76d0: 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65  e purpose of the
76e0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
76f0: 74 6f 20 66 61 63 69 6c 69 74 79 20 6d 6f 76 69  to facility movi
7700: 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 6f 6e  ng pages from on
7710: 65 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e  e.** position in
7720: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 61 6e 6f   the file to ano
7730: 74 68 65 72 20 61 73 20 70 61 72 74 20 6f 66 20  ther as part of 
7740: 61 75 74 6f 76 61 63 75 75 6d 2e 20 20 57 68 65  autovacuum.  Whe
7750: 6e 20 61 20 70 61 67 65 0a 2a 2a 20 69 73 20 6d  n a page.** is m
7760: 6f 76 65 64 2c 20 74 68 65 20 70 6f 69 6e 74 65  oved, the pointe
7770: 72 20 69 6e 20 69 74 73 20 70 61 72 65 6e 74 20  r in its parent 
7780: 6d 75 73 74 20 62 65 20 75 70 64 61 74 65 64 20  must be updated 
7790: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  to point to the.
77a0: 2a 2a 20 6e 65 77 20 6c 6f 63 61 74 69 6f 6e 2e  ** new location.
77b0: 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61    The pointer ma
77c0: 70 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  p is used to loc
77d0: 61 74 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  ate the parent p
77e0: 61 67 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 0a  age quickly..**.
77f0: 2a 2a 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  ** PTRMAP_ROOTPA
7800: 47 45 3a 20 54 68 65 20 64 61 74 61 62 61 73 65  GE: The database
7810: 20 70 61 67 65 20 69 73 20 61 20 72 6f 6f 74 2d   page is a root-
7820: 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 2d 6e  page. The page-n
7830: 75 6d 62 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20  umber is not.** 
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7850: 20 75 73 65 64 20 69 6e 20 74 68 69 73 20 63 61   used in this ca
7860: 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  se..**.** PTRMAP
7870: 5f 46 52 45 45 50 41 47 45 3a 20 54 68 65 20 64  _FREEPAGE: The d
7880: 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73 20  atabase page is 
7890: 61 6e 20 75 6e 75 73 65 64 20 28 66 72 65 65 29  an unused (free)
78a0: 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 2d   page. The page-
78b0: 6e 75 6d 62 65 72 20 0a 2a 2a 20 20 20 20 20 20  number .**      
78c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6e              is n
78d0: 6f 74 20 75 73 65 64 20 69 6e 20 74 68 69 73 20  ot used in this 
78e0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  case..**.** PTRM
78f0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 54 68  AP_OVERFLOW1: Th
7900: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
7910: 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
7920: 65 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 0a  e in a list of .
7930: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
7940: 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
7950: 67 65 73 2e 20 54 68 65 20 70 61 67 65 20 6e 75  ges. The page nu
7960: 6d 62 65 72 20 69 64 65 6e 74 69 66 69 65 73 20  mber identifies 
7970: 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  the page that.**
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20     contains the 
79a0: 63 65 6c 6c 20 77 69 74 68 20 61 20 70 6f 69 6e  cell with a poin
79b0: 74 65 72 20 74 6f 20 74 68 69 73 20 6f 76 65 72  ter to this over
79c0: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  flow page..**.**
79d0: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
79e0: 32 3a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  2: The database 
79f0: 70 61 67 65 20 69 73 20 74 68 65 20 73 65 63 6f  page is the seco
7a00: 6e 64 20 6f 72 20 6c 61 74 65 72 20 70 61 67 65  nd or later page
7a10: 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 0a 2a 2a   in a list of.**
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a30: 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
7a40: 73 2e 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62  s. The page-numb
7a50: 65 72 20 69 64 65 6e 74 69 66 69 65 73 20 74 68  er identifies th
7a60: 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20  e previous.**   
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a80: 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
7a90: 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a  flow page list..
7aa0: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
7ab0: 45 45 3a 20 54 68 65 20 64 61 74 61 62 61 73 65  EE: The database
7ac0: 20 70 61 67 65 20 69 73 20 61 20 6e 6f 6e 2d 72   page is a non-r
7ad0: 6f 6f 74 20 62 74 72 65 65 20 70 61 67 65 2e 20  oot btree page. 
7ae0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
7af0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
7b00: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
7b10: 70 61 72 65 6e 74 20 70 61 67 65 20 69 6e 20 74  parent page in t
7b20: 68 65 20 62 74 72 65 65 2e 0a 2a 2f 0a 23 64 65  he btree..*/.#de
7b30: 66 69 6e 65 20 50 54 52 4d 41 50 5f 52 4f 4f 54  fine PTRMAP_ROOT
7b40: 50 41 47 45 20 31 0a 23 64 65 66 69 6e 65 20 50  PAGE 1.#define P
7b50: 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 32  TRMAP_FREEPAGE 2
7b60: 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f  .#define PTRMAP_
7b70: 4f 56 45 52 46 4c 4f 57 31 20 33 0a 23 64 65 66  OVERFLOW1 3.#def
7b80: 69 6e 65 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  ine PTRMAP_OVERF
7b90: 4c 4f 57 32 20 34 0a 23 64 65 66 69 6e 65 20 50  LOW2 4.#define P
7ba0: 54 52 4d 41 50 5f 42 54 52 45 45 20 35 0a 0a 2f  TRMAP_BTREE 5../
7bb0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
7bc0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
7bd0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
7be0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
7bf0: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
7c00: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
7c10: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
7c20: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
7c30: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
7c40: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
7c50: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
7c60: 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  '..** An error c
7c70: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
7c80: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
7c90: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
7ca0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
7cb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
7cc0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
7cd0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7ce0: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
7cf0: 72 65 6e 74 29 7b 0a 20 20 75 38 20 2a 70 50 74  rent){.  u8 *pPt
7d00: 72 6d 61 70 3b 20 20 20 20 2f 2a 20 54 68 65 20  rmap;    /* The 
7d10: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7d20: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d   */.  Pgno iPtrm
7d30: 61 70 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ap;   /* The poi
7d40: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
7d50: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
7d60: 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66  fset;     /* Off
7d70: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
7d80: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
7d90: 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d   rc;..  /* The m
7da0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
7db0: 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e  ge number must n
7dc0: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20  ever be used as 
7dd0: 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  a pointer map pa
7de0: 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
7df0: 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45  0==PTRMAP_ISPAGE
7e00: 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59  (pBt, PENDING_BY
7e10: 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b  TE_PAGE(pBt)) );
7e20: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
7e30: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
7e40: 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20   if( key==0 ){. 
7e50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7e60: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
7e70: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
7e80: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
7e90: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
7ea0: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
7eb0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
7ec0: 72 6d 61 70 2c 20 28 76 6f 69 64 20 2a 2a 29 26  rmap, (void **)&
7ed0: 70 50 74 72 6d 61 70 29 3b 0a 20 20 69 66 28 20  pPtrmap);.  if( 
7ee0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7ef0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
7f00: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
7f10: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
7f20: 70 42 74 2c 20 6b 65 79 29 3b 0a 0a 20 20 69 66  pBt, key);..  if
7f30: 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70  ( eType!=pPtrmap
7f40: 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34  [offset] || get4
7f50: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
7f60: 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74  fset+1])!=parent
7f70: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22   ){.    TRACE(("
7f80: 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25  PTRMAP_UPDATE: %
7f90: 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b  d->(%d,%d)\n", k
7fa0: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
7fb0: 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  t));.    rc = sq
7fc0: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
7fd0: 28 70 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 69  (pPtrmap);.    i
7fe0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7ff0: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
8000: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
8010: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
8020: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
8030: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
8040: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
8050: 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
8060: 50 74 72 6d 61 70 29 3b 0a 20 20 72 65 74 75 72  Ptrmap);.  retur
8070: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
8080: 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f  ead an entry fro
8090: 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  m the pointer ma
80a0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
80b0: 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20  utine retrieves 
80c0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
80d0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27  entry for page '
80e0: 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a  key', writing.**
80f0: 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61   the type and pa
8100: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
8110: 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20   to *pEType and 
8120: 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76  *pPgno respectiv
8130: 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72  ely..** An error
8140: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
8150: 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  d if something g
8160: 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72  oes wrong, other
8170: 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
8180: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
8190: 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64  rmapGet(BtShared
81a0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
81b0: 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e   u8 *pEType, Pgn
81c0: 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 69 6e 74  o *pPgno){.  int
81d0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   iPtrmap;       
81e0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
81f0: 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75  age index */.  u
8200: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
8210: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
8220: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
8230: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
8240: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
8250: 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72  entry in pointer
8260: 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63   map */.  int rc
8270: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
8280: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
8290: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
82a0: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
82b0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
82c0: 72 6d 61 70 2c 20 28 76 6f 69 64 20 2a 2a 29 26  rmap, (void **)&
82d0: 70 50 74 72 6d 61 70 29 3b 0a 20 20 69 66 28 20  pPtrmap);.  if( 
82e0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  rc!=0 ){.    ret
82f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 6f  urn rc;.  }..  o
8300: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
8310: 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65  TROFFSET(pBt, ke
8320: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  y);.  assert( pE
8330: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
8340: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
8350: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
8360: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
8370: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
8380: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
8390: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
83a0: 65 66 28 70 50 74 72 6d 61 70 29 3b 0a 20 20 69  ef(pPtrmap);.  i
83b0: 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20  f( *pEType<1 || 
83c0: 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75  *pEType>5 ) retu
83d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
83e0: 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e  T_BKPT;.  return
83f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
8400: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8410: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
8420: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
8430: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
8440: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
8450: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
8460: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
8470: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
8480: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
8490: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
84a0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
84b0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
84c0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tent..**.** This
84d0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
84e0: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
84f0: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
8500: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
8510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a  ..*/.static u8 *
8520: 66 69 6e 64 43 65 6c 6c 28 4d 65 6d 50 61 67 65  findCell(MemPage
8530: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
8540: 6c 6c 29 7b 0a 20 20 75 38 20 2a 64 61 74 61 20  ll){.  u8 *data 
8550: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
8560: 20 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3e    assert( iCell>
8570: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8580: 69 43 65 6c 6c 3c 67 65 74 32 62 79 74 65 28 26  iCell<get2byte(&
8590: 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
85a0: 66 66 73 65 74 2b 33 5d 29 20 29 3b 0a 20 20 72  ffset+3]) );.  r
85b0: 65 74 75 72 6e 20 64 61 74 61 20 2b 20 67 65 74  eturn data + get
85c0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
85d0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
85e0: 69 43 65 6c 6c 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCell]);.}../*.*
85f0: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
8600: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
8610: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
8620: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
8630: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
8640: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
8650: 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a  ls.  See insert.
8660: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69  */.static u8 *fi
8670: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d  ndOverflowCell(M
8680: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
8690: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74  nt iCell){.  int
86a0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   i;.  for(i=pPag
86b0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
86c0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
86d0: 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63  int k;.    struc
86e0: 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76  t _OvflCell *pOv
86f0: 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20  fl;.    pOvfl = 
8700: 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d  &pPage->aOvfl[i]
8710: 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d  ;.    k = pOvfl-
8720: 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c  >idx;.    if( k<
8730: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
8740: 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a  if( k==iCell ){.
8750: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
8760: 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20  Ovfl->pCell;.   
8770: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
8780: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
8790: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
87a0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
87b0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
87c0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
87d0: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
87e0: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
87f0: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
8800: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
8810: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
8820: 6f 6e 2e 20 20 70 61 72 73 65 43 65 6c 6c 28 29  on.  parseCell()
8830: 20 74 61 6b 65 73 20 61 20 63 65 6c 6c 20 69 6e   takes a cell in
8840: 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20 73 65  dex.** as the se
8850: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e  cond argument an
8860: 64 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 29  d parseCellPtr()
8870: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
8880: 20 74 6f 20 74 68 65 0a 2a 2a 20 62 6f 64 79 20   to the.** body 
8890: 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69  of the cell as i
88a0: 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ts second argume
88b0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
88c0: 69 64 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28  id parseCellPtr(
88d0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
88e0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
88f0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
8900: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
8910: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
8920: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8930: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
8940: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
8950: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
8960: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
8970: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
8980: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
8990: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
89a0: 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20  r bytes in cell 
89b0: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a  content header *
89c0: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
89d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
89e0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
89f0: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
8a00: 2f 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c  /..  pInfo->pCel
8a10: 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73  l = pCell;.  ass
8a20: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
8a30: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
8a40: 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70  af==1 );.  n = p
8a50: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
8a60: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d  ze;.  assert( n=
8a70: 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66  =4-4*pPage->leaf
8a80: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
8a90: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
8aa0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
8ab0: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 6e 50 61  (&pCell[n], &nPa
8ac0: 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  yload);.  }else{
8ad0: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  .    nPayload = 
8ae0: 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  0;.  }.  pInfo->
8af0: 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64  nData = nPayload
8b00: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
8b10: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 20 2b  ntKey ){.    n +
8b20: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  = getVarint(&pCe
8b30: 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20 2a 29 26 70  ll[n], (u64 *)&p
8b40: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d  Info->nKey);.  }
8b50: 65 6c 73 65 7b 0a 20 20 20 20 75 33 32 20 78 3b  else{.    u32 x;
8b60: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
8b70: 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c  int32(&pCell[n],
8b80: 20 26 78 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   &x);.    pInfo-
8b90: 3e 6e 4b 65 79 20 3d 20 78 3b 0a 20 20 20 20 6e  >nKey = x;.    n
8ba0: 50 61 79 6c 6f 61 64 20 2b 3d 20 78 3b 0a 20 20  Payload += x;.  
8bb0: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64  }.  pInfo->nHead
8bc0: 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20 6e 50  er = n;.  if( nP
8bd0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
8be0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
8bf0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
8c00: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
8c10: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
8c20: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
8c30: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
8c40: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
8c50: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
8c60: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
8c70: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
8c80: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
8c90: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
8ca0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
8cb0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
8cc0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49  nPayload;.    pI
8cd0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
8ce0: 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   0;.    nSize = 
8cf0: 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20  nPayload + n;.  
8d00: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
8d10: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
8d20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
8d30: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
8d40: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
8d50: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
8d60: 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
8d70: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
8d80: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
8d90: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
8da0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
8db0: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
8dc0: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8dd0: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8de0: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
8df0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
8e00: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
8e10: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
8e20: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
8e30: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
8e40: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
8e50: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
8e60: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8e70: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8e80: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8e90: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
8ea0: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
8eb0: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
8ec0: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
8ed0: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
8ee0: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
8ef0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
8f00: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
8f10: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
8f20: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
8f30: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
8f40: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
8f50: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
8f60: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8f70: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8f80: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
8f90: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8fa0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8fb0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8fc0: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
8fd0: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8fe0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
8ff0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
9000: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
9010: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
9020: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
9030: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
9040: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
9050: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
9060: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
9070: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
9080: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9090: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69  Size - 4);.    i
90a0: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
90b0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
90c0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
90d0: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
90e0: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
90f0: 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63  >nLocal = minLoc
9100: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
9110: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
9120: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b   pInfo->nLocal +
9130: 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   n;.    pInfo->n
9140: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
9150: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
9160: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
9170: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
9180: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9190: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
91a0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
91b0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
91d0: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
91e0: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
91f0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
9200: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
9210: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
9220: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
9230: 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  parseCellPtr(pPa
9240: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9250: 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66  ge, iCell), pInf
9260: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
9270: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
9280: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
9290: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
92a0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
92b0: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
92c0: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
92d0: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
92e0: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
92f0: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
9300: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
9310: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
9320: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
9330: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
9340: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
9350: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23  ll pointer..*/.#
9360: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
9370: 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53 69 7a  atic int cellSiz
9380: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
9390: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
93a0: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
93b0: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
93c0: 2c 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , iCell, &info);
93d0: 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e  .  return info.n
93e0: 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73  Size;.}.#endif.s
93f0: 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53 69  tatic int cellSi
9400: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
9410: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
9420: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
9430: 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74  o;.  parseCellPt
9440: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
9450: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
9460: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a   info.nSize;.}..
9470: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9480: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
9490: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
94a0: 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20   pCell, part of 
94b0: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
94c0: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
94d0: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
94e0: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
94f0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
9500: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
9510: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
9520: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
9530: 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  nt ptrmapPutOvfl
9540: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
9550: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
9560: 20 20 69 66 28 20 70 43 65 6c 6c 20 29 7b 0a 20    if( pCell ){. 
9570: 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
9580: 3b 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50  ;.    parseCellP
9590: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
95a0: 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28   &info);.    if(
95b0: 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
95c0: 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
95d0: 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e  fo.nKey))>info.n
95e0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 50  Local ){.      P
95f0: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
9600: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
9610: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
9620: 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70     return ptrmap
9630: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
9640: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
9650: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
9660: 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gno);.    }.  }.
9670: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9680: 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  OK;.}./*.** If t
9690: 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64  he cell with ind
96a0: 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65  ex iCell on page
96b0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
96c0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
96d0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
96e0: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
96f0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
9700: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
9710: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
9720: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
9730: 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d  trmapPutOvfl(Mem
9740: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
9750: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70   iCell){.  u8 *p
9760: 43 65 6c 6c 3b 0a 20 20 70 43 65 6c 6c 20 3d 20  Cell;.  pCell = 
9770: 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
9780: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
9790: 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50    return ptrmapP
97a0: 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
97b0: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69   pCell);.}.#endi
97c0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 73 61 6e  f.../*.** Do san
97d0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
97e0: 61 20 70 61 67 65 2e 20 20 54 68 72 6f 77 20 61  a page.  Throw a
97f0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 61  n exception if a
9800: 6e 79 74 68 69 6e 67 20 69 73 0a 2a 2a 20 6e 6f  nything is.** no
9810: 74 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 54  t right..**.** T
9820: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
9830: 73 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  sed for internal
9840: 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
9850: 6f 6e 6c 79 2e 20 20 49 74 20 69 73 20 6f 6d 69  only.  It is omi
9860: 74 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 6f 73  tted.** from mos
9870: 74 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  t builds..*/.#if
9880: 20 64 65 66 69 6e 65 64 28 42 54 52 45 45 5f 44   defined(BTREE_D
9890: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
98a0: 64 28 4e 44 45 42 55 47 29 20 26 26 20 30 0a 73  d(NDEBUG) && 0.s
98b0: 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65  tatic void _page
98c0: 49 6e 74 65 67 72 69 74 79 28 4d 65 6d 50 61 67  Integrity(MemPag
98d0: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
98e0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75   usableSize;.  u
98f0: 38 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 69  8 *data;.  int i
9900: 2c 20 6a 2c 20 69 64 78 2c 20 63 2c 20 70 63 2c  , j, idx, c, pc,
9910: 20 68 64 72 2c 20 6e 46 72 65 65 3b 0a 20 20 69   hdr, nFree;.  i
9920: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  nt cellOffset;. 
9930: 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 63 65 6c 6c   int nCell, cell
9940: 4c 69 6d 69 74 3b 0a 20 20 75 38 20 2a 75 73 65  Limit;.  u8 *use
9950: 64 3b 0a 0a 20 20 75 73 65 64 20 3d 20 73 71 6c  d;..  used = sql
9960: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
9970: 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
9980: 7a 65 20 29 3b 0a 20 20 69 66 28 20 75 73 65 64  ze );.  if( used
9990: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
99a0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
99b0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
99c0: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
99d0: 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 26 28 28  Page->aData==&((
99e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
99f0: 50 61 67 65 29 5b 2d 70 50 61 67 65 2d 3e 70 42  Page)[-pPage->pB
9a00: 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20 29 3b 0a  t->pageSize] );.
9a10: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
9a20: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65  drOffset;.  asse
9a30: 72 74 28 20 68 64 72 3d 3d 28 70 50 61 67 65 2d  rt( hdr==(pPage-
9a40: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
9a50: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
9a60: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
9a70: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e  lite3pager_pagen
9a80: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 61 44 61  umber(pPage->aDa
9a90: 74 61 29 20 29 3b 0a 20 20 63 20 3d 20 70 50 61  ta) );.  c = pPa
9aa0: 67 65 2d 3e 61 44 61 74 61 5b 68 64 72 5d 3b 0a  ge->aData[hdr];.
9ab0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
9ac0: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
9ad0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  t( pPage->leaf =
9ae0: 3d 20 28 28 63 20 26 20 50 54 46 5f 4c 45 41 46  = ((c & PTF_LEAF
9af0: 29 21 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73  )!=0) );.    ass
9b00: 65 72 74 28 20 70 50 61 67 65 2d 3e 7a 65 72 6f  ert( pPage->zero
9b10: 44 61 74 61 20 3d 3d 20 28 28 63 20 26 20 50 54  Data == ((c & PT
9b20: 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 29 20  F_ZERODATA)!=0) 
9b30: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9b40: 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d  Page->leafData =
9b50: 3d 20 28 28 63 20 26 20 50 54 46 5f 4c 45 41 46  = ((c & PTF_LEAF
9b60: 44 41 54 41 29 21 3d 30 29 20 29 3b 0a 20 20 20  DATA)!=0) );.   
9b70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9b80: 69 6e 74 4b 65 79 20 3d 3d 20 28 28 63 20 26 20  intKey == ((c & 
9b90: 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
9ba0: 4c 45 41 46 44 41 54 41 29 29 21 3d 30 29 20 29  LEAFDATA))!=0) )
9bb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
9bc0: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 3d 0a  age->hasData ==.
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 21 28 70               !(p
9be0: 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c  Page->zeroData |
9bf0: 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  | (!pPage->leaf 
9c00: 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  && pPage->leafDa
9c10: 74 61 29 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ta)) );.    asse
9c20: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
9c30: 66 66 73 65 74 3d 3d 70 50 61 67 65 2d 3e 68 64  ffset==pPage->hd
9c40: 72 4f 66 66 73 65 74 2b 31 32 2d 34 2a 70 50 61  rOffset+12-4*pPa
9c50: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
9c60: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9c70: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
9c80: 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 68 64  &pPage->aData[hd
9c90: 72 2b 33 5d 29 20 29 3b 0a 20 20 7d 0a 20 20 64  r+3]) );.  }.  d
9ca0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
9cb0: 74 61 3b 0a 20 20 6d 65 6d 73 65 74 28 75 73 65  ta;.  memset(use
9cc0: 64 2c 20 30 2c 20 75 73 61 62 6c 65 53 69 7a 65  d, 0, usableSize
9cd0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
9ce0: 68 64 72 2b 31 30 2d 70 50 61 67 65 2d 3e 6c 65  hdr+10-pPage->le
9cf0: 61 66 2a 34 3b 20 69 2b 2b 29 20 75 73 65 64 5b  af*4; i++) used[
9d00: 69 5d 20 3d 20 31 3b 0a 20 20 6e 46 72 65 65 20  i] = 1;.  nFree 
9d10: 3d 20 30 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  = 0;.  pc = get2
9d20: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
9d30: 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 20  ]);.  while( pc 
9d40: 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  ){.    int size;
9d50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
9d60: 30 20 26 26 20 70 63 3c 75 73 61 62 6c 65 53 69  0 && pc<usableSi
9d70: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 73 69 7a 65  ze-4 );.    size
9d80: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9d90: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 61 73  a[pc+2]);.    as
9da0: 73 65 72 74 28 20 70 63 2b 73 69 7a 65 3c 3d 75  sert( pc+size<=u
9db0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
9dc0: 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a   nFree += size;.
9dd0: 20 20 20 20 66 6f 72 28 69 3d 70 63 3b 20 69 3c      for(i=pc; i<
9de0: 70 63 2b 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20  pc+size; i++){. 
9df0: 20 20 20 20 20 61 73 73 65 72 74 28 20 75 73 65       assert( use
9e00: 64 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20  d[i]==0 );.     
9e10: 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20   used[i] = 1;.  
9e20: 20 20 7d 0a 20 20 20 20 70 63 20 3d 20 67 65 74    }.    pc = get
9e30: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
9e40: 3b 0a 20 20 7d 0a 20 20 69 64 78 20 3d 20 30 3b  ;.  }.  idx = 0;
9e50: 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  .  nCell = get2b
9e60: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
9e70: 29 3b 0a 20 20 63 65 6c 6c 4c 69 6d 69 74 20 3d  );.  cellLimit =
9e80: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9e90: 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72  hdr+5]);.  asser
9ea0: 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
9eb0: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==0 .         ||
9ec0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 6e   pPage->nFree==n
9ed0: 46 72 65 65 2b 64 61 74 61 5b 68 64 72 2b 37 5d  Free+data[hdr+7]
9ee0: 2b 63 65 6c 6c 4c 69 6d 69 74 2d 28 63 65 6c 6c  +cellLimit-(cell
9ef0: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 29 20  Offset+2*nCell) 
9f00: 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  );.  cellOffset 
9f10: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
9f20: 73 65 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  set;.  for(i=0; 
9f30: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
9f40: 20 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 20     int size;.   
9f50: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
9f60: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
9f70: 32 2a 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  2*i]);.    asser
9f80: 74 28 20 70 63 3e 30 20 26 26 20 70 63 3c 75 73  t( pc>0 && pc<us
9f90: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
9fa0: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
9fb0: 65 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  e(pPage, &data[p
9fc0: 63 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c]);.    assert(
9fd0: 20 70 63 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65   pc+size<=usable
9fe0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 66 6f 72 28  Size );.    for(
9ff0: 6a 3d 70 63 3b 20 6a 3c 70 63 2b 73 69 7a 65 3b  j=pc; j<pc+size;
a000: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   j++){.      ass
a010: 65 72 74 28 20 75 73 65 64 5b 6a 5d 3d 3d 30 20  ert( used[j]==0 
a020: 29 3b 0a 20 20 20 20 20 20 75 73 65 64 5b 6a 5d  );.      used[j]
a030: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
a040: 20 20 66 6f 72 28 69 3d 63 65 6c 6c 4f 66 66 73    for(i=cellOffs
a050: 65 74 2b 32 2a 6e 43 65 6c 6c 3b 20 69 3c 63 65  et+2*nCell; i<ce
a060: 6c 6c 69 6d 69 74 3b 20 69 2b 2b 29 7b 0a 20 20  llimit; i++){.  
a070: 20 20 61 73 73 65 72 74 28 20 75 73 65 64 5b 69    assert( used[i
a080: 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 65 64  ]==0 );.    used
a090: 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e  [i] = 1;.  }.  n
a0a0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Free = 0;.  for(
a0b0: 69 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a  i=0; i<usableSiz
a0c0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  e; i++){.    ass
a0d0: 65 72 74 28 20 75 73 65 64 5b 69 5d 3c 3d 31 20  ert( used[i]<=1 
a0e0: 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 64 5b  );.    if( used[
a0f0: 69 5d 3d 3d 30 20 29 20 6e 46 72 65 65 2b 2b 3b  i]==0 ) nFree++;
a100: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
a110: 46 72 65 65 3d 3d 64 61 74 61 5b 68 64 72 2b 37  Free==data[hdr+7
a120: 5d 20 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ] );.  sqliteFre
a130: 65 28 75 73 65 64 29 3b 0a 7d 0a 23 64 65 66 69  e(used);.}.#defi
a140: 6e 65 20 70 61 67 65 49 6e 74 65 67 72 69 74 79  ne pageIntegrity
a150: 28 58 29 20 5f 70 61 67 65 49 6e 74 65 67 72 69  (X) _pageIntegri
a160: 74 79 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ty(X).#else.# de
a170: 66 69 6e 65 20 70 61 67 65 49 6e 74 65 67 72 69  fine pageIntegri
a180: 74 79 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ty(X).#endif../*
a190: 20 41 20 62 75 6e 63 68 20 6f 66 20 61 73 73 65   A bunch of asse
a1a0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
a1b0: 74 6f 20 63 68 65 63 6b 20 74 68 65 20 74 72 61  to check the tra
a1c0: 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 76  nsaction state v
a1d0: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 68  ariables.** of h
a1e0: 61 6e 64 6c 65 20 70 20 28 74 79 70 65 20 42 74  andle p (type Bt
a1f0: 72 65 65 2a 29 20 61 72 65 20 69 6e 74 65 72 6e  ree*) are intern
a200: 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e  ally consistent.
a210: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 62 74 72 65  .*/.#define btre
a220: 65 49 6e 74 65 67 72 69 74 79 28 70 29 20 5c 0a  eIntegrity(p) \.
a230: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
a240: 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
a250: 20 7c 7c 20 70 2d 3e 70 42 74 2d 3e 6e 54 72 61   || p->pBt->nTra
a260: 6e 73 61 63 74 69 6f 6e 3c 70 2d 3e 70 42 74 2d  nsaction<p->pBt-
a270: 3e 6e 52 65 66 20 29 3b 20 5c 0a 20 20 61 73 73  >nRef ); \.  ass
a280: 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 6e 54 72  ert( p->pBt->nTr
a290: 61 6e 73 61 63 74 69 6f 6e 3c 3d 70 2d 3e 70 42  ansaction<=p->pB
a2a0: 74 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20 20 61  t->nRef ); \.  a
a2b0: 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 69  ssert( p->pBt->i
a2c0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52  nTransaction!=TR
a2d0: 41 4e 53 5f 4e 4f 4e 45 20 7c 7c 20 70 2d 3e 70  ANS_NONE || p->p
a2e0: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
a2f0: 3d 3d 30 20 29 3b 20 5c 0a 20 20 61 73 73 65 72  ==0 ); \.  asser
a300: 74 28 20 70 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  t( p->pBt->inTra
a310: 6e 73 61 63 74 69 6f 6e 3e 3d 70 2d 3e 69 6e 54  nsaction>=p->inT
a320: 72 61 6e 73 20 29 3b 20 0a 0a 2f 2a 0a 2a 2a 20  rans ); ../*.** 
a330: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
a340: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
a350: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
a360: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
a370: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
a380: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
a390: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
a3a0: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
a3b0: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
a3c0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
a3d0: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
a3e0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
a3f0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
a400: 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74  nt area..*/.stat
a410: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
a420: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
a430: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
a460: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a480: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
a490: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
a4a0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a4c0: 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
a4d0: 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c   byte after cell
a4e0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
a4f0: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a510: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
a520: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
a530: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
a540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a550: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
a560: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
a570: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
a580: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
a590: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
a5a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
a5b0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
a5c0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
a5d0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
a5e0: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  array */.  int b
a5f0: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
a600: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
a610: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
a620: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
a630: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
a640: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a650: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
a660: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
a670: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
a680: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
a690: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
a6a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
a6b0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
a6c0: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
a6d0: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
a6e0: 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65  ert( sqlite3page
a6f0: 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70 50  r_iswriteable(pP
a700: 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20  age->aData) );. 
a710: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a720: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
a730: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
a740: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
a750: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
a760: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
a770: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
a780: 3d 3d 30 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ==0 );.  temp = 
a790: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
a7a0: 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
a7b0: 7a 65 20 29 3b 0a 20 20 69 66 28 20 74 65 6d 70  ze );.  if( temp
a7c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
a7d0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64 61 74  ITE_NOMEM;.  dat
a7e0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
a7f0: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
a800: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
a810: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
a820: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
a830: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
a840: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
a850: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
a860: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
a870: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
a880: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a890: 6c 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d 20  leSize;.  brk = 
a8a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
a8b0: 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
a8c0: 28 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64 61  (&temp[brk], &da
a8d0: 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  ta[brk], usableS
a8e0: 69 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62 72  ize - brk);.  br
a8f0: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
a900: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
a910: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
a920: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
a930: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
a940: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
a950: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
a960: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
a970: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
a980: 70 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73 65  pAddr);.    asse
a990: 72 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70 42  rt( pc<pPage->pB
a9a0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
a9b0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c  .    size = cell
a9c0: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
a9d0: 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 62  temp[pc]);.    b
a9e0: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
a9f0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72 6b  memcpy(&data[brk
aa00: 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69  ], &temp[pc], si
aa10: 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  ze);.    put2byt
aa20: 65 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a 20  e(pAddr, brk);. 
aa30: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72 6b   }.  assert( brk
aa40: 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  >=cellOffset+2*n
aa50: 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79  Cell );.  put2by
aa60: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
aa70: 20 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64   brk);.  data[hd
aa80: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
aa90: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
aaa0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
aab0: 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66    addr = cellOff
aac0: 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d  set+2*nCell;.  m
aad0: 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72  emset(&data[addr
aae0: 5d 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29 3b  ], 0, brk-addr);
aaf0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 65  .  sqliteFree(te
ab00: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  mp);.  return SQ
ab10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ab20: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
ab30: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
ab40: 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  on a page..**.**
ab50: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
ab60: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
ab70: 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72  ata[] of the fir
ab80: 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
ab90: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
aba0: 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69 66  . Or return 0 if
abb0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e   there is not en
abc0: 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70 61  ough free.** spa
abd0: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ce on the page t
abe0: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 61 6c  o satisfy the al
abf0: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73 74  location request
ac00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
ac10: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79  age contains nBy
ac20: 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61 63  tes of free spac
ac30: 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  e but does not c
ac40: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73  ontain.** nBytes
ac50: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 66   of contiguous f
ac60: 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20  ree space, then 
ac70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75 74  this routine aut
ac80: 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61  omatically.** ca
ac90: 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74 50  lls defragementP
aca0: 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69  age() to consoli
acb0: 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73 70  date all free sp
acc0: 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61  ace before .** a
acd0: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e 65  llocating the ne
ace0: 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74  w chunk..*/.stat
acf0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
ad00: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
ad10: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  age, int nByte){
ad20: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63 2c  .  int addr, pc,
ad30: 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65   hdr;.  int size
ad40: 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20  ;.  int nFrag;. 
ad50: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20   int top;.  int 
ad60: 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c  nCell;.  int cel
ad70: 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67  lOffset;.  unsig
ad80: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
ad90: 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67    .  data = pPag
ada0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65  e->aData;.  asse
adb0: 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65 72  rt( sqlite3pager
adc0: 5f 69 73 77 72 69 74 65 61 62 6c 65 28 64 61 74  _iswriteable(dat
add0: 61 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  a) );.  assert( 
ade0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
adf0: 69 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e 42  if( nByte<4 ) nB
ae00: 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 70  yte = 4;.  if( p
ae10: 50 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74  Page->nFree<nByt
ae20: 65 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  e || pPage->nOve
ae30: 72 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72 6e  rflow>0 ) return
ae40: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72   0;.  pPage->nFr
ae50: 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68  ee -= nByte;.  h
ae60: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
ae70: 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20  ffset;..  nFrag 
ae80: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
ae90: 20 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b   if( nFrag<60 ){
aea0: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
aeb0: 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  he freelist look
aec0: 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62  ing for a slot b
aed0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
aee0: 69 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  isfy the.    ** 
aef0: 73 70 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a  space request. *
af00: 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64 72  /.    addr = hdr
af10: 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  +1;.    while( (
af20: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
af30: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
af40: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65  .      size = ge
af50: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
af60: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2]);.      if( s
af70: 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20  ize>=nByte ){.  
af80: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e        if( size<n
af90: 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20  Byte+4 ){.      
afa0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
afb0: 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63  [addr], &data[pc
afc0: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 2);.         
afd0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e   data[hdr+7] = n
afe0: 46 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42  Frag + size - nB
aff0: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  yte;.          r
b000: 65 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20  eturn pc;.      
b010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b020: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
b030: 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42  a[pc+2], size-nB
b040: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  yte);.          
b050: 72 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65  return pc + size
b060: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
b070: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b080: 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20    addr = pc;.   
b090: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
b0a0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
b0b0: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
b0c0: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
b0d0: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
b0e0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
b0f0: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f  ntent area..  */
b100: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
b110: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b120: 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  .  nCell = get2b
b130: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
b140: 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  );.  cellOffset 
b150: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
b160: 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  set;.  if( nFrag
b170: 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73  >=60 || cellOffs
b180: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74  et + 2*nCell > t
b190: 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20  op - nByte ){.  
b1a0: 20 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e 74    if( defragment
b1b0: 50 61 67 65 28 70 50 61 67 65 29 20 29 20 72 65  Page(pPage) ) re
b1c0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20  turn 0;.    top 
b1d0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b1e0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20  [hdr+5]);.  }.  
b1f0: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
b200: 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73  assert( cellOffs
b210: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20  et + 2*nCell <= 
b220: 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74  top );.  put2byt
b230: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b240: 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74  top);.  return t
b250: 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  op;.}../*.** Ret
b260: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
b270: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
b280: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
b290: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
b2a0: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
b2b0: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
b2c0: 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74  age->aDisk[start
b2d0: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
b2e0: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
b2f0: 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a  s "size" bytes..
b300: 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68  **.** Most of th
b310: 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73  e effort here is
b320: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61   involved in coa
b330: 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a  lesing adjacent.
b340: 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69  ** free blocks i
b350: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67  nto a single big
b360: 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a   free block..*/.
b370: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
b380: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
b390: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
b3a0: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
b3b0: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
b3c0: 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  hdr;.  unsigned 
b3d0: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
b3e0: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
b3f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b400: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b410: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
b420: 77 72 69 74 65 61 62 6c 65 28 64 61 74 61 29 20  writeable(data) 
b430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
b440: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
b450: 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
b460: 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73  eaf?0:4) );.  as
b470: 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73  sert( (start + s
b480: 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74  ize)<=pPage->pBt
b490: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
b4a0: 20 20 69 66 28 20 73 69 7a 65 3c 34 20 29 20 73    if( size<4 ) s
b4b0: 69 7a 65 20 3d 20 34 3b 0a 0a 23 69 66 64 65 66  ize = 4;..#ifdef
b4c0: 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
b4d0: 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77  ELETE.  /* Overw
b4e0: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
b4f0: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
b500: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45 43  ros when the SEC
b510: 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a  URE_DELETE .  **
b520: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
b530: 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
b540: 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  me */.  memset(&
b550: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20  data[start], 0, 
b560: 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  size);.#endif.. 
b570: 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63   /* Add the spac
b580: 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  e back into the 
b590: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66  linked list of f
b5a0: 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68  reeblocks */.  h
b5b0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
b5c0: 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20  ffset;.  addr = 
b5d0: 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  hdr + 1;.  while
b5e0: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
b5f0: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
b600: 29 29 3c 73 74 61 72 74 20 26 26 20 70 62 65 67  ))<start && pbeg
b610: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  in>0 ){.    asse
b620: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
b630: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
b640: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  ze-4 );.    asse
b650: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
b660: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62  );.    addr = pb
b670: 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  egin;.  }.  asse
b680: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
b690: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
b6a0: 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-4 );.  assert
b6b0: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c  ( pbegin>addr ||
b6c0: 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20   pbegin==0 );.  
b6d0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  put2byte(&data[a
b6e0: 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20  ddr], start);.  
b6f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
b700: 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a  tart], pbegin);.
b710: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
b720: 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29  [start+2], size)
b730: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
b740: 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20   += size;..  /* 
b750: 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e  Coalesce adjacen
b760: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f  t free blocks */
b770: 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d  .  addr = pPage-
b780: 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a  >hdrOffset + 1;.
b790: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
b7a0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b7b0: 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20  a[addr]))>0 ){. 
b7c0: 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73     int pnext, ps
b7d0: 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
b7e0: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a   pbegin>addr );.
b7f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
b800: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
b810: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
b820: 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32      pnext = get2
b830: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
b840: 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d  n]);.    psize =
b850: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b860: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
b870: 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69  if( pbegin + psi
b880: 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20  ze + 3 >= pnext 
b890: 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20  && pnext>0 ){.  
b8a0: 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70      int frag = p
b8b0: 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70  next - (pbegin+p
b8c0: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73  size);.      ass
b8d0: 65 72 74 28 20 66 72 61 67 3c 3d 64 61 74 61 5b  ert( frag<=data[
b8e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b8f0: 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20 64 61 74  +7] );.      dat
b900: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
b910: 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20  et+7] -= frag;. 
b920: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
b930: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74  ata[pbegin], get
b940: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
b950: 74 5d 29 29 3b 0a 20 20 20 20 20 20 70 75 74 32  t]));.      put2
b960: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
b970: 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32  n+2], pnext+get2
b980: 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74  byte(&data[pnext
b990: 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20  +2])-pbegin);.  
b9a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
b9b0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
b9c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
b9d0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
b9e0: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
b9f0: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
ba00: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
ba10: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
ba20: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
ba30: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
ba40: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
ba50: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
ba60: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
ba70: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
ba80: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
ba90: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
baa0: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
bab0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
bac0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
bad0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
bae0: 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74  dr+5], top + get
baf0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
bb00: 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  in+2]));.  }.}..
bb10: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
bb20: 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
bb30: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
bb40: 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
bb50: 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
bb60: 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
bb70: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
bb80: 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
bb90: 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  gly..*/.static v
bba0: 6f 69 64 20 64 65 63 6f 64 65 46 6c 61 67 73 28  oid decodeFlags(
bbb0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
bbc0: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
bbd0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
bbe0: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
bbf0: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
bc00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
bc10: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
bc20: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
bc30: 30 20 3a 20 30 29 20 29 3b 0a 20 20 70 50 61 67  0 : 0) );.  pPag
bc40: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 66 6c 61  e->intKey = (fla
bc50: 67 42 79 74 65 20 26 20 28 50 54 46 5f 49 4e 54  gByte & (PTF_INT
bc60: 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
bc70: 29 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e  ))!=0;.  pPage->
bc80: 7a 65 72 6f 44 61 74 61 20 3d 20 28 66 6c 61 67  zeroData = (flag
bc90: 42 79 74 65 20 26 20 50 54 46 5f 5a 45 52 4f 44  Byte & PTF_ZEROD
bca0: 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  ATA)!=0;.  pPage
bcb0: 2d 3e 6c 65 61 66 20 3d 20 28 66 6c 61 67 42 79  ->leaf = (flagBy
bcc0: 74 65 20 26 20 50 54 46 5f 4c 45 41 46 29 21 3d  te & PTF_LEAF)!=
bcd0: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c  0;.  pPage->chil
bce0: 64 50 74 72 53 69 7a 65 20 3d 20 34 2a 28 70 50  dPtrSize = 4*(pP
bcf0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 3b 0a 20  age->leaf==0);. 
bd00: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
bd10: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
bd20: 65 20 26 20 50 54 46 5f 4c 45 41 46 44 41 54 41  e & PTF_LEAFDATA
bd30: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c   ){.    pPage->l
bd40: 65 61 66 44 61 74 61 20 3d 20 31 3b 0a 20 20 20  eafData = 1;.   
bd50: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
bd60: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
bd70: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
bd80: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
bd90: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  eaf;.  }else{.  
bda0: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74    pPage->leafDat
bdb0: 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  a = 0;.    pPage
bdc0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
bdd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
bde0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
bdf0: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
be00: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 68 61  .  }.  pPage->ha
be10: 73 44 61 74 61 20 3d 20 21 28 70 50 61 67 65 2d  sData = !(pPage-
be20: 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20 28 21 70  >zeroData || (!p
be30: 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20 70 50  Page->leaf && pP
be40: 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 29 29 3b  age->leafData));
be50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
be60: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
be70: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
be80: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
be90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65  .**.** The pPare
bea0: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73  nt parameter mus
beb0: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
bec0: 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 77 68  o the MemPage wh
bed0: 69 63 68 0a 2a 2a 20 69 73 20 74 68 65 20 70 61  ich.** is the pa
bee0: 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  rent of the page
bef0: 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a   being initializ
bf00: 65 64 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f 66  ed.  The root of
bf10: 20 61 0a 2a 2a 20 42 54 72 65 65 20 68 61 73 20   a.** BTree has 
bf20: 6e 6f 20 70 61 72 65 6e 74 20 61 6e 64 20 73 6f  no parent and so
bf30: 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2c 20   for that page, 
bf40: 70 50 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a  pParent==NULL..*
bf50: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
bf60: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
bf70: 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
bf80: 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
bf90: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
bfa0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
bfb0: 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
bfc0: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
bfd0: 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
bfe0: 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
bff0: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
c000: 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
c010: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
c020: 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
c030: 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
c040: 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
c050: 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
c060: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
c070: 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 50 61  tatic int initPa
c080: 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
c090: 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
c0a0: 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 69  The page to be i
c0b0: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
c0c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
c0d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
c0e0: 72 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20  rent.  Might be 
c0f0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
c100: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
c110: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
c120: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
c130: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
c140: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
c150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
c160: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
c170: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
c180: 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
c190: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
c1a0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
c1b0: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
c1c0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
c1d0: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
c1e0: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75  cture */.  int u
c1f0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
c200: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
c210: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
c220: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
c230: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
c240: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
c250: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
c260: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
c270: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
c280: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c290: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
c2a0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
c2b0: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
c2c0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
c2d0: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
c2e0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
c2f0: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
c300: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pBt;.  assert( p
c310: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
c320: 74 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c  t( pParent==0 ||
c330: 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70   pParent->pBt==p
c340: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
c350: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c  pPage->pgno==sql
c360: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75  ite3pager_pagenu
c370: 6d 62 65 72 28 70 50 61 67 65 2d 3e 61 44 61 74  mber(pPage->aDat
c380: 61 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  a) );.  assert( 
c390: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
c3a0: 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  &((unsigned char
c3b0: 2a 29 70 50 61 67 65 29 5b 2d 70 42 74 2d 3e 70  *)pPage)[-pBt->p
c3c0: 61 67 65 53 69 7a 65 5d 20 29 3b 0a 20 20 69 66  ageSize] );.  if
c3d0: 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
c3e0: 21 3d 70 50 61 72 65 6e 74 20 26 26 20 28 70 50  !=pParent && (pP
c3f0: 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d 30 20  age->pParent!=0 
c400: 7c 7c 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  || pPage->isInit
c410: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
c420: 70 61 72 65 6e 74 20 70 61 67 65 20 73 68 6f 75  parent page shou
c430: 6c 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 20  ld never change 
c440: 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20  unless the file 
c450: 69 73 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  is corrupt */.  
c460: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c470: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
c480: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  }.  if( pPage->i
c490: 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
c4a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
c4b0: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
c4c0: 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20  0 && pParent!=0 
c4d0: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50  ){.    pPage->pP
c4e0: 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b  arent = pParent;
c4f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
c500: 72 5f 72 65 66 28 70 50 61 72 65 6e 74 2d 3e 61  r_ref(pParent->a
c510: 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 68 64 72  Data);.  }.  hdr
c520: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c530: 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  set;.  data = pP
c540: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 64 65  age->aData;.  de
c550: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
c560: 20 64 61 74 61 5b 68 64 72 5d 29 3b 0a 20 20 70   data[hdr]);.  p
c570: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
c580: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64  = 0;.  pPage->id
c590: 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 75 73  xShift = 0;.  us
c5a0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
c5b0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50  usableSize;.  pP
c5c0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
c5d0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
c5e0: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
c5f0: 65 2d 3e 6c 65 61 66 3b 0a 20 20 74 6f 70 20 3d  e->leaf;.  top =
c600: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c610: 68 64 72 2b 35 5d 29 3b 0a 20 20 70 50 61 67 65  hdr+5]);.  pPage
c620: 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
c630: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
c640: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
c650: 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
c660: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d  ) ){.    /* To m
c670: 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
c680: 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
c690: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
c6a0: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65  orrupt */.    re
c6b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c6c0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
c6d0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
c6e0: 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d  ==0 && pParent!=
c6f0: 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67  0 && pParent->pg
c700: 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  no!=1 ){.    /* 
c710: 41 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 20 68  All pages must h
c720: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
c730: 20 63 65 6c 6c 2c 20 65 78 63 65 70 74 20 66 6f   cell, except fo
c740: 72 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a  r root pages */.
c750: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c760: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c770: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
c780: 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
c790: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
c7a0: 67 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74  ge */.  pc = get
c7b0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
c7c0: 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64  1]);.  nFree = d
c7d0: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70  ata[hdr+7] + top
c7e0: 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b   - (cellOffset +
c7f0: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29   2*pPage->nCell)
c800: 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20  ;.  while( pc>0 
c810: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 2c  ){.    int next,
c820: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70   size;.    if( p
c830: 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  c>usableSize-4 )
c840: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  {.      /* Free 
c850: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
c860: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 72   page */.      r
c870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c880: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
c890: 7d 0a 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74  }.    next = get
c8a0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
c8b0: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74  ;.    size = get
c8c0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
c8d0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  ]);.    if( next
c8e0: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
c8f0: 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 2f  ize+3 ){.      /
c900: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75  * Free blocks mu
c910: 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69  st be in accendi
c920: 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ng order */.    
c930: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c940: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
c950: 20 20 20 7d 0a 20 20 20 20 6e 46 72 65 65 20 2b     }.    nFree +
c960: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 70 63 20 3d  = size;.    pc =
c970: 20 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 50 61   next;.  }.  pPa
c980: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65  ge->nFree = nFre
c990: 65 3b 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 3d  e;.  if( nFree>=
c9a0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
c9b0: 20 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20    /* Free space 
c9c0: 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f  cannot exceed to
c9d0: 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  tal page size */
c9e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c9f0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ca00: 20 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 2d 3e   .  }..  pPage->
ca10: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 70 61  isInit = 1;.  pa
ca20: 67 65 49 6e 74 65 67 72 69 74 79 28 70 50 61 67  geIntegrity(pPag
ca30: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
ca40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ca50: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
ca60: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
ca70: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
ca80: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
ca90: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
caa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
cab0: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
cac0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
cad0: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
cae0: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
caf0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
cb00: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
cb10: 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68 64  e->pBt;.  int hd
cb20: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
cb30: 66 73 65 74 3b 0a 20 20 69 6e 74 20 66 69 72 73  fset;.  int firs
cb40: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
cb50: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e  lite3pager_pagen
cb60: 75 6d 62 65 72 28 64 61 74 61 29 3d 3d 70 50 61  umber(data)==pPa
cb70: 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
cb80: 73 65 72 74 28 20 26 64 61 74 61 5b 70 42 74 2d  sert( &data[pBt-
cb90: 3e 70 61 67 65 53 69 7a 65 5d 20 3d 3d 20 28 75  >pageSize] == (u
cba0: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 50  nsigned char*)pP
cbb0: 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
cbc0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
cbd0: 77 72 69 74 65 61 62 6c 65 28 64 61 74 61 29 20  writeable(data) 
cbe0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
cbf0: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
cc00: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
cc10: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d  );.  data[hdr] =
cc20: 20 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20   flags;.  first 
cc30: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
cc40: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
cc50: 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  =0);.  memset(&d
cc60: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
cc70: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
cc80: 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
cc90: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
cca0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
ccb0: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
ccc0: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
ccd0: 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63  e - first;.  dec
cce0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
ccf0: 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
cd00: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72  >hdrOffset = hdr
cd10: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
cd20: 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
cd30: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
cd40: 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  w = 0;.  pPage->
cd50: 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
cd60: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
cd70: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
cd80: 74 20 3d 20 31 3b 0a 20 20 70 61 67 65 49 6e 74  t = 1;.  pageInt
cd90: 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 7d  egrity(pPage);.}
cda0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
cdb0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
cdc0: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
cdd0: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
cde0: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
cdf0: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
ce00: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
ce10: 63 20 69 6e 74 20 67 65 74 50 61 67 65 28 42 74  c int getPage(Bt
ce20: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
ce30: 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20  o pgno, MemPage 
ce40: 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  **ppPage){.  int
ce50: 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
ce60: 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 4d  char *aData;.  M
ce70: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
ce80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
ce90: 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61 67  er_get(pBt->pPag
cea0: 65 72 2c 20 70 67 6e 6f 2c 20 28 76 6f 69 64 2a  er, pgno, (void*
ceb0: 2a 29 26 61 44 61 74 61 29 3b 0a 20 20 69 66 28  *)&aData);.  if(
cec0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
ced0: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
cee0: 61 67 65 2a 29 26 61 44 61 74 61 5b 70 42 74 2d  age*)&aData[pBt-
cef0: 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 70 50  >pageSize];.  pP
cf00: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 61 44 61  age->aData = aDa
cf10: 74 61 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ta;.  pPage->pBt
cf20: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
cf30: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
cf40: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
cf50: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d   = pPage->pgno==
cf60: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a  1 ? 100 : 0;.  *
cf70: 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
cf80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cf90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  OK;.}../*.** Get
cfa0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
cfb0: 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
cfc0: 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20  alize it.  This 
cfd0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75  routine.** is ju
cfe0: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  st a convenience
cff0: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
d000: 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74  separate calls t
d010: 6f 0a 2a 2a 20 67 65 74 50 61 67 65 28 29 20 61  o.** getPage() a
d020: 6e 64 20 69 6e 69 74 50 61 67 65 28 29 2e 0a 2a  nd initPage()..*
d030: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
d040: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
d050: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
d060: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
d070: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
d080: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
d090: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d0a0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
d0b0: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
d0c0: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
d0d0: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
d0e0: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
d0f0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
d100: 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  t     /* Parent 
d110: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 29  of the page */.)
d120: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
d130: 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ( pgno==0 ){.   
d140: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d150: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
d160: 7d 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67 65  }.  rc = getPage
d170: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
d180: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
d190: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
d1a0: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
d1b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 6e 69   ){.    rc = ini
d1c0: 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c 20 70  tPage(*ppPage, p
d1d0: 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 72  Parent);.  }.  r
d1e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d1f0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
d200: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
d210: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
d220: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
d230: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 67 65 74 50  .** call to getP
d240: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
d250: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
d260: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
d270: 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
d280: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
d290: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
d2a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d2b0: 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Bt );.    assert
d2c0: 28 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  ( &pPage->aData[
d2d0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
d2e0: 53 69 7a 65 5d 3d 3d 28 75 6e 73 69 67 6e 65 64  Size]==(unsigned
d2f0: 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a   char*)pPage );.
d300: 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
d310: 5f 75 6e 72 65 66 28 70 50 61 67 65 2d 3e 61 44  _unref(pPage->aD
d320: 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ata);.  }.}../*.
d330: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d340: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
d350: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
d360: 6e 74 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  nt for a page.**
d370: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
d380: 57 65 20 6e 65 65 64 20 74 6f 20 75 6e 72 65 66  We need to unref
d390: 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69   the pParent poi
d3a0: 6e 74 65 72 20 77 68 65 6e 20 74 68 61 74 0a 2a  nter when that.*
d3b0: 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73 74  * happens..*/.st
d3c0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 44 65  atic void pageDe
d3d0: 73 74 72 75 63 74 6f 72 28 76 6f 69 64 20 2a 70  structor(void *p
d3e0: 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65 53 69  Data, int pageSi
d3f0: 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ze){.  MemPage *
d400: 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
d410: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
d420: 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
d430: 28 4d 65 6d 50 61 67 65 2a 29 26 28 28 63 68 61  (MemPage*)&((cha
d440: 72 2a 29 70 44 61 74 61 29 5b 70 61 67 65 53 69  r*)pData)[pageSi
d450: 7a 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ze];.  if( pPage
d460: 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ->pParent ){.   
d470: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
d480: 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
d490: 6e 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  nt;.    pPage->p
d4a0: 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  Parent = 0;.    
d4b0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 72  releasePage(pPar
d4c0: 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ent);.  }.  pPag
d4d0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 7d  e->isInit = 0;.}
d4e0: 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
d4f0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
d500: 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
d510: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
d520: 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
d530: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
d540: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
d550: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
d560: 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
d570: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
d580: 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
d590: 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
d5a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d5b0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d5c0: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
d5d0: 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
d5e0: 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
d5f0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
d600: 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
d610: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
d620: 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
d630: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
d640: 69 6e 69 74 28 76 6f 69 64 20 2a 70 44 61 74 61  init(void *pData
d650: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b  , int pageSize){
d660: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
d670: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61  e;.  assert( (pa
d680: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
d690: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
d6a0: 50 61 67 65 2a 29 26 28 28 63 68 61 72 2a 29 70  Page*)&((char*)p
d6b0: 44 61 74 61 29 5b 70 61 67 65 53 69 7a 65 5d 3b  Data)[pageSize];
d6c0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
d6d0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 70 50 61 67  Init ){.    pPag
d6e0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
d6f0: 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61 67     initPage(pPag
d700: 65 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  e, pPage->pParen
d710: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
d720: 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
d730: 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
d740: 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
d750: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
d760: 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
d770: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
d780: 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  ** a new databas
d790: 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20  e with a random 
d7a0: 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e  name is created.
d7b0: 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20    This randomly 
d7c0: 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73  named.** databas
d7d0: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
d7e0: 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69  eleted when sqli
d7f0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
d800: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e  is called..*/.in
d810: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
d820: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
d830: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
d840: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
d850: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
d860: 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
d870: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 53  */.  sqlite3 *pS
d880: 71 6c 69 74 65 2c 20 20 20 20 20 20 20 2f 2a 20  qlite,       /* 
d890: 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
d8a0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
d8b0: 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
d8c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
d8d0: 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
d8e0: 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
d8f0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
d900: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
d910: 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 29   /* Options */.)
d920: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
d930: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
d940: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
d950: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
d960: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
d970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
d980: 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
d990: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  /.  int rc;.  in
d9a0: 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 75 6e  t nReserve;.  un
d9b0: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
d9c0: 65 61 64 65 72 5b 31 30 30 5d 3b 0a 23 69 66 20  eader[100];.#if 
d9d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d9e0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
d9f0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
da00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
da10: 4f 29 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61  O).  const Threa
da20: 64 44 61 74 61 20 2a 70 54 73 64 72 6f 3b 0a 23  dData *pTsdro;.#
da30: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
da40: 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
da50: 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
da60: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
da70: 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
da80: 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
da90: 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
daa0: 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73  . This symbol is
dab0: 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69   only required i
dac0: 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66  f.  ** either of
dad0: 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74 61   the shared-data
dae0: 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66   or autovacuum f
daf0: 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70  eatures are comp
db00: 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20  iled .  ** into 
db10: 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a  the library..  *
db20: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
db30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
db40: 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66  D_CACHE) || !def
db50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
db60: 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23  _AUTOVACUUM).  #
db70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
db80: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e  T_MEMORYDB.  con
db90: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
dba0: 20 21 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 23   !zFilename;.  #
dbb0: 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
dbc0: 20 69 73 4d 65 6d 64 62 20 3d 20 21 7a 46 69 6c   isMemdb = !zFil
dbd0: 65 6e 61 6d 65 20 7c 7c 20 28 73 74 72 63 6d 70  ename || (strcmp
dbe0: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65  (zFilename, ":me
dbf0: 6d 6f 72 79 3a 22 29 3f 30 3a 31 29 3b 0a 20 20  mory:")?0:1);.  
dc00: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
dc10: 20 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f   p = sqliteMallo
dc20: 63 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  c(sizeof(Btree))
dc30: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
dc40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
dc50: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
dc60: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
dc70: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 70 53 71 6c 69  NONE;.  p->pSqli
dc80: 74 65 20 3d 20 70 53 71 6c 69 74 65 3b 0a 0a 20  te = pSqlite;.. 
dc90: 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
dca0: 61 6e 20 65 78 69 73 74 69 6e 67 20 42 74 72 65  an existing Btre
dcb0: 65 20 73 74 72 75 63 74 75 72 65 20 6f 70 65 6e  e structure open
dcc0: 65 64 20 6f 6e 20 7a 46 69 6c 65 6e 61 6d 65 2e  ed on zFilename.
dcd0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
dce0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
dcf0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
dd00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
dd10: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 70 54 73  IT_DISKIO).  pTs
dd20: 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72  dro = sqlite3Thr
dd30: 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
dd40: 29 3b 0a 20 20 69 66 28 20 70 54 73 64 72 6f 2d  );.  if( pTsdro-
dd50: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 26  >useSharedData &
dd60: 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  & zFilename && !
dd70: 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 63  isMemdb ){.    c
dd80: 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
dd90: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  me = sqlite3OsFu
dda0: 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65  llPathname(zFile
ddb0: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  name);.    if( !
ddc0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
ddd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
dde0: 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
ddf0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
de00: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
de10: 42 74 3d 70 54 73 64 72 6f 2d 3e 70 42 74 72 65  Bt=pTsdro->pBtre
de20: 65 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  e; pBt; pBt=pBt-
de30: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
de40: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
de50: 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
de60: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
de70: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
de80: 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 70  pager_filename(p
de90: 42 74 2d 3e 70 50 61 67 65 72 29 29 20 29 7b 0a  Bt->pPager)) ){.
dea0: 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
deb0: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 2a 70   pBt;.        *p
dec0: 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20  pBtree = p;.    
ded0: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
dee0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
def0: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
df00: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
df10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
df20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
df30: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
df40: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Pathname);.  }.#
df50: 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
df60: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
df70: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
df80: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
df90: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
dfa0: 65 65 20 61 72 65 0a 20 20 2a 2a 20 74 68 65 20  ee are.  ** the 
dfb0: 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
dfc0: 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
dfd0: 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
dfe0: 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
dff0: 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
e000: 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
e010: 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
e020: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
e030: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b  izeof(i64)==8 );
e040: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
e050: 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 61  f(u64)==8 );.  a
e060: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
e070: 32 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72  2)==4 );.  asser
e080: 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d  t( sizeof(u16)==
e090: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  2 );.  assert( s
e0a0: 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29  izeof(Pgno)==4 )
e0b0: 3b 0a 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74  ;..  pBt = sqlit
e0c0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
e0d0: 2a 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 70  *pBt) );.  if( p
e0e0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70  Bt==0 ){.    *pp
e0f0: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 73  Btree = 0;.    s
e100: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20 20  qliteFree(p);.  
e110: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e120: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20  NOMEM;.  }.  rc 
e130: 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  = sqlite3pager_o
e140: 70 65 6e 28 26 70 42 74 2d 3e 70 50 61 67 65 72  pen(&pBt->pPager
e150: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 45 58 54  , zFilename, EXT
e160: 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 29 3b  RA_SIZE, flags);
e170: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e180: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
e190: 70 42 74 2d 3e 70 50 61 67 65 72 20 29 20 73 71  pBt->pPager ) sq
e1a0: 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65  lite3pager_close
e1b0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
e1c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42     sqliteFree(pB
e1d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  t);.    sqliteFr
e1e0: 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
e1f0: 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ree = 0;.    ret
e200: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 2d  urn rc;.  }.  p-
e210: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 0a 20 20 73  >pBt = pBt;..  s
e220: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
e230: 64 65 73 74 72 75 63 74 6f 72 28 70 42 74 2d 3e  destructor(pBt->
e240: 70 50 61 67 65 72 2c 20 70 61 67 65 44 65 73 74  pPager, pageDest
e250: 72 75 63 74 6f 72 29 3b 0a 20 20 73 71 6c 69 74  ructor);.  sqlit
e260: 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e  e3pager_set_rein
e270: 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  iter(pBt->pPager
e280: 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
e290: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
e2a0: 30 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  0;.  pBt->pPage1
e2b0: 20 3d 20 30 3b 0a 20 20 70 42 74 2d 3e 72 65 61   = 0;.  pBt->rea
e2c0: 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 70  dOnly = sqlite3p
e2d0: 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28  ager_isreadonly(
e2e0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
e2f0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 61  sqlite3pager_rea
e300: 64 5f 66 69 6c 65 68 65 61 64 65 72 28 70 42 74  d_fileheader(pBt
e310: 2d 3e 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  ->pPager, sizeof
e320: 28 7a 44 62 48 65 61 64 65 72 29 2c 20 7a 44 62  (zDbHeader), zDb
e330: 48 65 61 64 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Header);.  pBt->
e340: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
e350: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31  yte(&zDbHeader[1
e360: 36 5d 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  6]);.  if( pBt->
e370: 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
e380: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
e390: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
e3a0: 5a 45 0a 20 20 20 20 20 20 20 7c 7c 20 28 28 70  ZE.       || ((p
e3b0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
e3c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
e3d0: 30 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 61  0 ){.    pBt->pa
e3e0: 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  geSize = SQLITE_
e3f0: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
e400: 45 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45  E;.    pBt->maxE
e410: 6d 62 65 64 46 72 61 63 20 3d 20 36 34 3b 20 20  mbedFrac = 64;  
e420: 20 2f 2a 20 32 35 25 20 2a 2f 0a 20 20 20 20 70   /* 25% */.    p
e430: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
e440: 20 3d 20 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35   = 32;   /* 12.5
e450: 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6d 69  % */.    pBt->mi
e460: 6e 4c 65 61 66 46 72 61 63 20 3d 20 33 32 3b 20  nLeafFrac = 32; 
e470: 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23     /* 12.5% */.#
e480: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e490: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
e4a0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
e4b0: 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
e4c0: 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
e4d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
e4e0: 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ase, then.    **
e4f0: 20 64 6f 20 6e 6f 74 20 73 65 74 20 74 68 65 20   do not set the 
e500: 61 75 74 6f 2d 76 61 63 75 75 6d 20 66 6c 61 67  auto-vacuum flag
e510: 2c 20 65 76 65 6e 20 69 66 20 53 51 4c 49 54 45  , even if SQLITE
e520: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
e530: 55 55 4d 0a 20 20 20 20 2a 2a 20 69 73 20 74 72  UUM.    ** is tr
e540: 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
e550: 20 68 61 6e 64 2c 20 69 66 20 53 51 4c 49 54 45   hand, if SQLITE
e560: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
e570: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
e580: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 22 3a 6d  .    ** then ":m
e590: 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
e5a0: 61 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  a regular file-n
e5b0: 61 6d 65 2e 20 52 65 73 70 65 63 74 20 74 68 65  ame. Respect the
e5c0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 20 20 20   auto-vacuum.   
e5d0: 20 2a 2a 20 64 65 66 61 75 6c 74 20 69 6e 20 74   ** default in t
e5e0: 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  his case..    */
e5f0: 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  .    if( zFilena
e600: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
e610: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  {.      pBt->aut
e620: 6f 56 61 63 75 75 6d 20 3d 20 53 51 4c 49 54 45  oVacuum = SQLITE
e630: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
e640: 55 55 4d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  UUM;.    }.#endi
e650: 66 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  f.    nReserve =
e660: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
e670: 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
e680: 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 70  eader[20];.    p
e690: 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63  Bt->maxEmbedFrac
e6a0: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 31 5d   = zDbHeader[21]
e6b0: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d  ;.    pBt->minEm
e6c0: 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65 61  bedFrac = zDbHea
e6d0: 64 65 72 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74  der[22];.    pBt
e6e0: 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20  ->minLeafFrac = 
e6f0: 7a 44 62 48 65 61 64 65 72 5b 32 33 5d 3b 0a 20  zDbHeader[23];. 
e700: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
e710: 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
e720: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e730: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
e740: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
e750: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
e760: 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
e770: 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
e780: 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
e790: 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
e7a0: 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
e7b0: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
e7c0: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
e7d0: 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
e7e0: 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
e7f0: 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ize */.  sqlite3
e800: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69  pager_set_pagesi
e810: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
e820: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
e830: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e840: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
e850: 45 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e  E.  /* Add the n
e860: 65 77 20 62 74 72 65 65 20 74 6f 20 74 68 65 20  ew btree to the 
e870: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
e880: 74 69 6e 67 20 61 74 20 54 68 72 65 61 64 44 61  ting at ThreadDa
e890: 74 61 2e 70 42 74 72 65 65 2e 0a 20 20 2a 2a 20  ta.pBtree..  ** 
e8a0: 54 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  There is no chan
e8b0: 63 65 20 74 68 61 74 20 61 20 6d 61 6c 6c 6f 63  ce that a malloc
e8c0: 28 29 20 6d 61 79 20 66 61 69 6c 20 69 6e 73 69  () may fail insi
e8d0: 64 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  de of the .  ** 
e8e0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
e8f0: 61 28 29 20 63 61 6c 6c 2c 20 61 73 20 74 68 65  a() call, as the
e900: 20 54 68 72 65 61 64 44 61 74 61 20 73 74 72 75   ThreadData stru
e910: 63 74 75 72 65 20 6d 75 73 74 20 68 61 76 65 20  cture must have 
e920: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
e930: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  n allocated for 
e940: 70 54 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65  pTsdro->useShare
e950: 64 44 61 74 61 20 74 6f 20 62 65 20 6e 6f 6e 2d  dData to be non-
e960: 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  zero..  */.  if(
e970: 20 70 54 73 64 72 6f 2d 3e 75 73 65 53 68 61 72   pTsdro->useShar
e980: 65 64 44 61 74 61 20 26 26 20 7a 46 69 6c 65 6e  edData && zFilen
e990: 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
e9a0: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  ){.    pBt->pNex
e9b0: 74 20 3d 20 70 54 73 64 72 6f 2d 3e 70 42 74 72  t = pTsdro->pBtr
e9c0: 65 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ee;.    sqlite3T
e9d0: 68 72 65 61 64 44 61 74 61 28 29 2d 3e 70 42 74  hreadData()->pBt
e9e0: 72 65 65 20 3d 20 70 42 74 3b 0a 20 20 7d 0a 23  ree = pBt;.  }.#
e9f0: 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 52 65  endif.  pBt->nRe
ea00: 66 20 3d 20 31 3b 0a 20 20 2a 70 70 42 74 72 65  f = 1;.  *ppBtre
ea10: 65 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20  e = p;.  return 
ea20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ea30: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
ea40: 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
ea50: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
ea60: 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
ea70: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
ea80: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
ea90: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
eaa0: 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
eab0: 2a 70 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20  *pCur;..#ifndef 
eac0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
ead0: 45 44 5f 43 41 43 48 45 0a 20 20 54 68 72 65 61  ED_CACHE.  Threa
eae0: 64 44 61 74 61 20 2a 70 54 73 64 3b 0a 23 65 6e  dData *pTsd;.#en
eaf0: 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  dif..  /* Close 
eb00: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
eb10: 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
eb20: 6c 65 2e 20 20 2a 2f 0a 20 20 70 43 75 72 20 3d  le.  */.  pCur =
eb30: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
eb40: 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
eb50: 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
eb60: 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
eb70: 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
eb80: 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
eb90: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
eba0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
ebb0: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
ebc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
ebd0: 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
ebe0: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
ebf0: 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
ec00: 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
ec10: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
ec20: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
ec30: 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
ec40: 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
ec50: 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
ec60: 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
ec70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
ec80: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69  lback(p);.  sqli
ec90: 74 65 46 72 65 65 28 70 29 3b 0a 0a 23 69 66 6e  teFree(p);..#ifn
eca0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ecb0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
ecc0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
ecd0: 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
ece0: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
ecf0: 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
ed00: 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
ed10: 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
ed20: 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
ed30: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
ed40: 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
ed50: 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
ed60: 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
ed70: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
ed80: 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
ed90: 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
eda0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
edb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
edc0: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
edd0: 68 61 72 65 64 2d 62 74 72 65 65 20 66 72 6f 6d  hared-btree from
ede0: 20 74 68 65 20 74 68 72 65 61 64 20 77 69 64 65   the thread wide
edf0: 20 6c 69 73 74 2e 20 43 61 6c 6c 20 0a 20 20 2a   list. Call .  *
ee00: 2a 20 54 68 72 65 61 64 44 61 74 61 52 65 61 64  * ThreadDataRead
ee10: 4f 6e 6c 79 28 29 20 61 6e 64 20 74 68 65 6e 20  Only() and then 
ee20: 63 61 73 74 20 61 77 61 79 20 74 68 65 20 63 6f  cast away the co
ee30: 6e 73 74 20 70 72 6f 70 65 72 74 79 20 6f 66 20  nst property of 
ee40: 74 68 65 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  the .  ** pointe
ee50: 72 20 74 6f 20 61 76 6f 69 64 20 61 6c 6c 6f 63  r to avoid alloc
ee60: 61 74 69 6e 67 20 74 68 72 65 61 64 20 64 61 74  ating thread dat
ee70: 61 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 72  a if it is not r
ee80: 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a  eally required..
ee90: 20 20 2a 2f 0a 20 20 70 54 73 64 20 3d 20 28 54    */.  pTsd = (T
eea0: 68 72 65 61 64 44 61 74 61 20 2a 29 73 71 6c 69  hreadData *)sqli
eeb0: 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
eec0: 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70  dOnly();.  if( p
eed0: 54 73 64 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74  Tsd->pBtree==pBt
eee0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
eef0: 70 54 73 64 3d 3d 73 71 6c 69 74 65 33 54 68 72  pTsd==sqlite3Thr
ef00: 65 61 64 44 61 74 61 28 29 20 29 3b 0a 20 20 20  eadData() );.   
ef10: 20 70 54 73 64 2d 3e 70 42 74 72 65 65 20 3d 20   pTsd->pBtree = 
ef20: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  pBt->pNext;.  }e
ef30: 6c 73 65 7b 0a 20 20 20 20 42 74 53 68 61 72 65  lse{.    BtShare
ef40: 64 20 2a 70 50 72 65 76 3b 0a 20 20 20 20 66 6f  d *pPrev;.    fo
ef50: 72 28 70 50 72 65 76 3d 70 54 73 64 2d 3e 70 42  r(pPrev=pTsd->pB
ef60: 74 72 65 65 3b 20 70 50 72 65 76 20 26 26 20 70  tree; pPrev && p
ef70: 50 72 65 76 2d 3e 70 4e 65 78 74 21 3d 70 42 74  Prev->pNext!=pBt
ef80: 3b 20 70 50 72 65 76 3d 70 50 72 65 76 2d 3e 70  ; pPrev=pPrev->p
ef90: 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20  Next){}.    if( 
efa0: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 61  pPrev ){.      a
efb0: 73 73 65 72 74 28 20 70 54 73 64 3d 3d 73 71 6c  ssert( pTsd==sql
efc0: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
efd0: 20 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 2d   );.      pPrev-
efe0: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
eff0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ext;.    }.  }.#
f000: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73  endif..  /* Clos
f010: 65 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  e the pager and 
f020: 66 72 65 65 20 74 68 65 20 73 68 61 72 65 64 2d  free the shared-
f030: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
f040: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 42  */.  assert( !pB
f050: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
f060: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f  sqlite3pager_clo
f070: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
f080: 0a 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65  .  if( pBt->xFre
f090: 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
f0a0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70  pSchema ){.    p
f0b0: 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
f0c0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
f0d0: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
f0e0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
f0f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 42 74 29   sqliteFree(pBt)
f100: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f110: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
f120: 68 61 6e 67 65 20 74 68 65 20 62 75 73 79 20 68  hange the busy h
f130: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
f140: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
f150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
f160: 42 75 73 79 48 61 6e 64 6c 65 72 28 42 74 72 65  BusyHandler(Btre
f170: 65 20 2a 70 2c 20 42 75 73 79 48 61 6e 64 6c 65  e *p, BusyHandle
f180: 72 20 2a 70 48 61 6e 64 6c 65 72 29 7b 0a 20 20  r *pHandler){.  
f190: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
f1a0: 70 2d 3e 70 42 74 3b 0a 20 20 70 42 74 2d 3e 70  p->pBt;.  pBt->p
f1b0: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 48  BusyHandler = pH
f1c0: 61 6e 64 6c 65 72 3b 0a 20 20 73 71 6c 69 74 65  andler;.  sqlite
f1d0: 33 70 61 67 65 72 5f 73 65 74 5f 62 75 73 79 68  3pager_set_busyh
f1e0: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
f1f0: 65 72 2c 20 70 48 61 6e 64 6c 65 72 29 3b 0a 20  er, pHandler);. 
f200: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f210: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
f220: 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
f230: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
f240: 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
f250: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
f260: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
f270: 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
f280: 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
f290: 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
f2a0: 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
f2b0: 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
f2c0: 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
f2d0: 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
f2e0: 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
f2f0: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
f300: 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
f310: 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
f320: 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
f330: 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
f340: 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
f350: 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
f360: 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
f370: 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
f380: 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
f390: 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
f3a0: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
f3b0: 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
f3c0: 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
f3d0: 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
f3e0: 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
f3f0: 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
f400: 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
f410: 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
f420: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
f430: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
f440: 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
f450: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
f460: 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
f470: 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
f480: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
f490: 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
f4a0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
f4b0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
f4c0: 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
f4d0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f4e0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
f4f0: 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
f500: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
f510: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
f520: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
f530: 5f 63 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e  _cachesize(pBt->
f540: 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
f550: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f560: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
f570: 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74  ange the way dat
f580: 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64  a is synced to d
f590: 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  isk in order to 
f5a0: 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72  increase or decr
f5b0: 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c  ease.** how well
f5c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
f5d0: 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65  sists damage due
f5e0: 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61   to OS crashes a
f5f0: 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c  nd power.** fail
f600: 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69  ures.  Level 1 i
f610: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73  s the same as as
f620: 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73  ynchronous (no s
f630: 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64  yncs() occur and
f640: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
f650: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  igh probability 
f660: 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65  of damage)  Leve
f670: 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75  l 2 is the defau
f680: 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73  lt.  There.** is
f690: 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20   a very low but 
f6a0: 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69  non-zero probabi
f6b0: 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20  lity of damage. 
f6c0: 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73   Level 3 reduces
f6d0: 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c   the.** probabil
f6e0: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f  ity of damage to
f6f0: 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77   near zero but w
f700: 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66  ith a write perf
f710: 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
f720: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  n..*/.#ifndef SQ
f730: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
f740: 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69  PRAGMAS.int sqli
f750: 74 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74  te3BtreeSetSafet
f760: 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c  yLevel(Btree *p,
f770: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
f780: 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53  fullSync){.  BtS
f790: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
f7a0: 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 70 61  pBt;.  sqlite3pa
f7b0: 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c  ger_set_safety_l
f7c0: 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  evel(pBt->pPager
f7d0: 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e  , level, fullSyn
f7e0: 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  c);.  return SQL
f7f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
f800: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
f810: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
f820: 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
f830: 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
f840: 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
f850: 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
f860: 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
f870: 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
f880: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
f890: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
f8a0: 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
f8b0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
f8c0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
f8d0: 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42  ssert( pBt && pB
f8e0: 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72  t->pPager );.  r
f8f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 70 61 67  eturn sqlite3pag
f900: 65 72 5f 6e 6f 73 79 6e 63 28 70 42 74 2d 3e 70  er_nosync(pBt->p
f910: 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 21  Pager);.}..#if !
f920: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f930: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
f940: 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
f950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
f960: 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  M)./*.** Change 
f970: 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
f980: 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  s size and the n
f990: 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
f9a0: 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  d bytes per page
f9b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
f9c0: 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
f9d0: 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65  power of 2 betwe
f9e0: 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
f9f0: 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a  .  If the page.*
fa00: 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20  * size supplied 
fa10: 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68  does not meet th
fa20: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  is constraint th
fa30: 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  en the page size
fa40: 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67   is not.** chang
fa50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73  ed..**.** Page s
fa60: 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61  izes are constra
fa70: 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  ined to be a pow
fa80: 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61  er of two so tha
fa90: 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20  t the region.** 
faa0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
fab0: 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  file used for lo
fac0: 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67  cking (beginning
fad0: 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   at PENDING_BYTE
fae0: 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62  ,.** the first b
faf0: 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42  yte past the 1GB
fb00: 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30   boundary, 0x400
fb10: 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20  00000) needs to 
fb20: 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20  occur.** at the 
fb30: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70  beginning of a p
fb40: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  age..**.** If pa
fb50: 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65  rameter nReserve
fb60: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
fb70: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ro, then the num
fb80: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a  ber of reserved.
fb90: 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ** bytes per pag
fba0: 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
fbb0: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
fbc0: 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
fbd0: 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
fbe0: 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
fbf0: 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 42 74 53  nReserve){.  BtS
fc00: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
fc10: 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  pBt;.  if( pBt->
fc20: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b  pageSizeFixed ){
fc30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fc40: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
fc50: 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
fc60: 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
fc70: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
fc80: 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
fc90: 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ize;.  }.  if( p
fca0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
fcb0: 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
fcc0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
fcd0: 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
fce0: 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
fcf0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
fd00: 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
fd10: 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
fd20: 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65  ert( !pBt->pPage
fd30: 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73  1 && !pBt->pCurs
fd40: 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
fd50: 61 67 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ageSize = sqlite
fd60: 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73  3pager_set_pages
fd70: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
fd80: 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a   pageSize);.  }.
fd90: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
fda0: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
fdb0: 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
fdc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
fdd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
fde0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
fdf0: 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
fe00: 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
fe10: 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
fe20: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
fe30: 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
fe40: 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c  eSize;.}.int sql
fe50: 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
fe60: 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
fe70: 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
fe80: 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
fe90: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d  t->usableSize;.}
fea0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
feb0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fec0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
fed0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
fee0: 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a  E_OMIT_VACUUM) *
fef0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
ff00: 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
ff10: 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
ff20: 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
ff30: 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
ff40: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
ff50: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
ff60: 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
ff70: 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
ff80: 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
ff90: 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
ffa0: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
ffb0: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
ffc0: 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
ffd0: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
ffe0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
fff0: 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
10000 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
10010 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
10020 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
10030 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 20 20 42  autoVacuum){.  B
10040 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10050 2d 3e 70 42 74 3b 3b 0a 23 69 66 64 65 66 20 53  ->pBt;;.#ifdef S
10060 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
10070 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
10080 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
10090 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d  #else.  if( pBt-
100a0 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29  >pageSizeFixed )
100b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
100c0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
100d0 7d 0a 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  }.  pBt->autoVac
100e0 75 75 6d 20 3d 20 28 61 75 74 6f 56 61 63 75 75  uum = (autoVacuu
100f0 6d 3f 31 3a 30 29 3b 0a 20 20 72 65 74 75 72 6e  m?1:0);.  return
10100 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
10110 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
10120 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
10130 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
10140 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
10150 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
10160 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
10170 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
10180 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
10190 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
101a0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
101b0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
101c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
101d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73    return 0;.#els
101e0 65 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  e.  return p->pB
101f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3b 0a 23  t->autoVacuum;.#
10200 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
10210 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
10220 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
10230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
10240 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
10250 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
10260 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
10270 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
10280 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
10290 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
102a0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
102b0 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
102c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
102d0 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
102e0 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
102f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
10300 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
10310 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
10320 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
10330 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
10340 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
10350 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 53 51  t of memory.  SQ
10360 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 69 73  LITE_PROTOCOL is
10370 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 66 20   returned.** if 
10380 74 68 65 72 65 20 69 73 20 61 20 6c 6f 63 6b 69  there is a locki
10390 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 76 69 6f 6c  ng protocol viol
103a0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
103b0 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42   int lockBtree(B
103c0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
103d0 20 69 6e 74 20 72 63 2c 20 70 61 67 65 53 69 7a   int rc, pageSiz
103e0 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e;.  MemPage *pP
103f0 61 67 65 31 3b 0a 20 20 69 66 28 20 70 42 74 2d  age1;.  if( pBt-
10400 3e 70 50 61 67 65 31 20 29 20 72 65 74 75 72 6e  >pPage1 ) return
10410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63   SQLITE_OK;.  rc
10420 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
10430 31 2c 20 26 70 50 61 67 65 31 29 3b 0a 20 20 69  1, &pPage1);.  i
10440 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10450 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
10460 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
10470 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
10480 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
10490 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
104a0 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
104b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
104c0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 53 51 4c  .  */.  rc = SQL
104d0 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 69 66  ITE_NOTADB;.  if
104e0 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  ( sqlite3pager_p
104f0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
10500 61 67 65 72 29 3e 30 20 29 7b 0a 20 20 20 20 75  ager)>0 ){.    u
10510 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
10520 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66  1->aData;.    if
10530 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
10540 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
10550 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
10560 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
10570 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
10580 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
10590 7c 7c 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  || page1[19]>1 )
105a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
105b0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
105c0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69      }.    pageSi
105d0 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  ze = get2byte(&p
105e0 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69  age1[16]);.    i
105f0 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
10600 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  &pageSize)!=0 ){
10610 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
10620 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
10630 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
10640 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
10650 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  =0 );.    pBt->p
10660 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
10670 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
10680 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
10690 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
106a0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 75 73 61      if( pBt->usa
106b0 62 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20  bleSize<500 ){. 
106c0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
106d0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
106e0 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45   }.    pBt->maxE
106f0 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67 65 31  mbedFrac = page1
10700 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d  [21];.    pBt->m
10710 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61  inEmbedFrac = pa
10720 67 65 31 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74  ge1[22];.    pBt
10730 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20  ->minLeafFrac = 
10740 70 61 67 65 31 5b 32 33 5d 3b 0a 23 69 66 6e 64  page1[23];.#ifnd
10750 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10760 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
10770 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
10780 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
10790 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
107a0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
107b0 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
107c0 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
107d0 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
107e0 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
107f0 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
10800 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
10810 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
10820 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
10830 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
10840 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
10850 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
10860 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
10870 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
10880 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
10890 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
108a0 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
108b0 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
108c0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
108d0 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
108e0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
108f0 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
10900 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
10910 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
10920 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
10930 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
10940 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
10950 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
10960 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
10970 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65   poiner, a heade
10980 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
10990 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
109a0 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
109b0 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
109c0 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
109d0 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
109e0 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
109f0 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
10a00 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42  ->maxLocal = (pB
10a10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
10a20 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46  )*pBt->maxEmbedF
10a30 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  rac/255 - 23;.  
10a40 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
10a50 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
10a60 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45 6d 62  -12)*pBt->minEmb
10a70 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b  edFrac/255 - 23;
10a80 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
10a90 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
10aa0 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d  e - 35;.  pBt->m
10ab0 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75  inLeaf = (pBt->u
10ac0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42  sableSize-12)*pB
10ad0 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 2f 32  t->minLeafFrac/2
10ae0 35 35 20 2d 20 32 33 3b 0a 20 20 69 66 28 20 70  55 - 23;.  if( p
10af0 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74  Bt->minLocal>pBt
10b00 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20 70 42  ->maxLocal || pB
10b10 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20 29 7b  t->maxLocal<0 ){
10b20 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f  .    goto page1_
10b30 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d  init_failed;.  }
10b40 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
10b50 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20  maxLeaf + 23 <= 
10b60 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
10b70 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  ) );.  pBt->pPag
10b80 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72  e1 = pPage1;.  r
10b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10ba0 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
10bb0 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
10bc0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
10bd0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
10be0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10bf0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10c00 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63  e works like loc
10c10 6b 42 74 72 65 65 28 29 20 65 78 63 65 70 74 20  kBtree() except 
10c20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76  that it also inv
10c30 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79  okes the.** busy
10c40 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
10c50 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65  re is lock conte
10c60 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ntion..*/.static
10c70 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69   int lockBtreeWi
10c80 74 68 52 65 74 72 79 28 42 74 72 65 65 20 2a 70  thRetry(Btree *p
10c90 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Ref){.  int rc =
10ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
10cb0 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d  ( pRef->inTrans=
10cc0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
10cd0 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74     u8 inTransact
10ce0 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d  ion = pRef->pBt-
10cf0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a  >inTransaction;.
10d00 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69      btreeIntegri
10d10 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63  ty(pRef);.    rc
10d20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
10d30 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20  eginTrans(pRef, 
10d40 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42  0);.    pRef->pB
10d50 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
10d60 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e   = inTransaction
10d70 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72  ;.    pRef->inTr
10d80 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
10d90 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
10da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10db0 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61   pRef->pBt->nTra
10dc0 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
10dd0 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67  }.    btreeInteg
10de0 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a  rity(pRef);.  }.
10df0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20    return rc;.}. 
10e00 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66        ../*.** If
10e10 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
10e20 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
10e30 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
10e40 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
10e50 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
10e60 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
10e70 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
10e80 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
10e90 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
10ea0 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
10eb0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
10ec0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
10ed0 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
10ee0 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
10ef0 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
10f00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
10f10 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e   are any outstan
10f20 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68  ding cursors, th
10f30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10f40 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
10f50 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
10f60 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
10f70 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
10f80 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
10f90 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
10fa0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
10fb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10fc0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
10fd0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
10fe0 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75  NONE && pBt->pCu
10ff0 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e  rsor==0 && pBt->
11000 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
11010 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
11020 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20  ->aData==0 ){.  
11030 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
11040 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  ge = pBt->pPage1
11050 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61  ;.      pPage->a
11060 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70 50  Data = &((u8*)pP
11070 61 67 65 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53  age)[-pBt->pageS
11080 69 7a 65 5d 3b 0a 20 20 20 20 20 20 70 50 61 67  ize];.      pPag
11090 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
110a0 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20      pPage->pgno 
110b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 1;.    }.    r
110c0 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e  eleasePage(pBt->
110d0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74  pPage1);.    pBt
110e0 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
110f0 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
11100 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
11110 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74  Create a new dat
11120 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
11130 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
11140 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  page of the.** f
11150 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
11160 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
11170 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
11180 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
11190 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
111a0 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
111b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67    if( sqlite3pag
111c0 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74  er_pagecount(pBt
111d0 2d 3e 70 50 61 67 65 72 29 3e 30 20 29 20 72 65  ->pPager)>0 ) re
111e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
111f0 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
11200 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge1;.  assert( p
11210 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20  P1!=0 );.  data 
11220 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20  = pP1->aData;.  
11230 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
11240 72 5f 77 72 69 74 65 28 64 61 74 61 29 3b 0a 20  r_write(data);. 
11250 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
11260 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
11270 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
11280 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
11290 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
112a0 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
112b0 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
112c0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
112d0 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  16], pBt->pageSi
112e0 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ze);.  data[18] 
112f0 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
11300 3d 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20  = 1;.  data[20] 
11310 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
11320 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
11330 65 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  e;.  data[21] = 
11340 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61  pBt->maxEmbedFra
11350 63 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20  c;.  data[22] = 
11360 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61  pBt->minEmbedFra
11370 63 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  c;.  data[23] = 
11380 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
11390 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
113a0 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
113b0 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
113c0 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
113d0 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
113e0 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67  TA );.  pBt->pag
113f0 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
11400 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11410 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
11420 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
11430 63 75 75 6d 20 29 7b 0a 20 20 20 20 70 75 74 34  cuum ){.    put4
11440 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
11450 34 2a 34 5d 2c 20 31 29 3b 0a 20 20 7d 0a 23 65  4*4], 1);.  }.#e
11460 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
11470 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11480 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
11490 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
114a0 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
114b0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
114c0 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
114d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
114e0 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
114f0 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
11500 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
11510 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
11520 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
11530 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
11540 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
11550 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
11560 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
11570 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
11580 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
11590 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
115a0 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
115b0 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
115c0 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
115d0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
115e0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
115f0 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
11600 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
11610 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
11620 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
11630 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
11640 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
11650 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
11660 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
11670 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
11680 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
11690 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
116a0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
116b0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
116c0 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
116d0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
116e0 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
116f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
11700 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
11710 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
11720 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
11730 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
11740 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
11750 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
11760 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
11770 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
11780 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
11790 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
117a0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
117b0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
117c0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
117d0 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
117e0 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
117f0 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
11800 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
11810 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
11820 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
11830 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
11840 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
11850 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
11860 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
11870 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
11880 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
11890 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
118a0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
118b0 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
118c0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
118d0 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
118e0 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
118f0 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
11900 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
11910 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
11920 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
11930 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
11940 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
11950 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
11960 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
11970 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
11980 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
11990 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
119a0 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
119b0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
119c0 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
119d0 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
119e0 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
119f0 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
11a00 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
11a10 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
11a20 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
11a30 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
11a40 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
11a50 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
11a60 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
11a70 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
11a80 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
11a90 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
11aa0 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
11ab0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
11ac0 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
11ad0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
11ae0 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
11af0 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
11b00 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
11b10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11b20 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
11b30 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
11b40 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  lag){.  BtShared
11b50 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11b60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11b70 45 5f 4f 4b 3b 0a 0a 20 20 62 74 72 65 65 49 6e  E_OK;..  btreeIn
11b80 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
11b90 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
11ba0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
11bb0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
11bc0 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
11bd0 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
11be0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
11bf0 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
11c00 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
11c10 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
11c20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
11c30 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
11c40 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
11c50 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
11c60 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
11c70 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
11c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11c90 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
11ca0 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
11cb0 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
11cc0 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
11cd0 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e  e */.  if( pBt->
11ce0 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c  readOnly && wrfl
11cf0 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
11d00 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
11d10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
11d20 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
11d30 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
11d40 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
11d50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
11d60 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
11d70 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
11d80 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
11d90 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
11da0 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73  n is.  ** reques
11db0 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
11dc0 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  TE_BUSY..  */.  
11dd0 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
11de0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
11df0 49 54 45 20 26 26 20 77 72 66 6c 61 67 20 29 7b  ITE && wrflag ){
11e00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11e10 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20  TE_BUSY;.  }..  
11e20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 42 74  do {.    if( pBt
11e30 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20  ->pPage1==0 ){. 
11e40 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74       rc = lockBt
11e50 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ree(pBt);.    }.
11e60 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53    .    if( rc==S
11e70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
11e80 61 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ag ){.      rc =
11e90 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65   sqlite3pager_be
11ea0 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  gin(pBt->pPage1-
11eb0 3e 61 44 61 74 61 2c 20 77 72 66 6c 61 67 3e 31  >aData, wrflag>1
11ec0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
11ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11ee0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
11ef0 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
11f00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
11f10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11f20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
11f30 20 77 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69   wrflag ) pBt->i
11f40 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
11f50 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  else{.      unlo
11f60 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
11f70 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
11f80 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
11f90 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
11fa0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
11fb0 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
11fc0 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e 76 6f       sqlite3Invo
11fd0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
11fe0 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29  t->pBusyHandler)
11ff0 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
12000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12010 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
12020 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
12030 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
12040 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ction++;.    }. 
12050 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
12060 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
12070 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
12080 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
12090 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
120a0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
120b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
120c0 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
120d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74  .    }.  }..  bt
120e0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
120f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12100 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12110 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
12120 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
12130 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
12140 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
12150 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
12160 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
12170 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
12180 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
12190 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
121a0 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
121b0 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
121c0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
121d0 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
121e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
121f0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
12200 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
12210 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
12240 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
12250 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12270 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
12280 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
12290 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
122a0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
122b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
122c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
122d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
122e0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  age->pBt;.  int 
122f0 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
12300 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67  ge->isInit;.  Pg
12310 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
12320 3e 70 67 6e 6f 3b 0a 0a 20 20 69 6e 69 74 50 61  >pgno;..  initPa
12330 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ge(pPage, 0);.  
12340 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
12350 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
12360 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
12370 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
12380 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
12390 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70   i);..    rc = p
123a0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
123b0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
123c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
123d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
123e0 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
123f0 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  maps_out;.    }.
12400 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
12410 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
12420 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
12430 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
12440 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
12450 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
12460 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
12470 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  EE, pgno);.     
12480 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12490 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68  OK ) goto set_ch
124a0 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
124b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
124c0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
124d0 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
124e0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
124f0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
12500 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
12510 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72  ]);.    rc = ptr
12520 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
12530 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
12540 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  REE, pgno);.  }.
12550 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
12560 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
12570 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
12580 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
12590 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
125a0 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20  where on pPage, 
125b0 77 68 69 63 68 20 69 73 20 67 75 61 72 65 6e 74  which is guarent
125c0 65 65 64 20 74 6f 20 62 65 20 61 20 62 74 72 65  eed to be a btre
125d0 65 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f  e page, not an o
125e0 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c  verflow.** page,
125f0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
12600 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64   page iFrom. Mod
12610 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
12620 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
12630 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61  ts to.** iTo. Pa
12640 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
12650 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
12660 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62   of pointer to b
12670 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a  e modified, as .
12680 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  ** follows:.**.*
12690 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
126a0 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
126b0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
126c0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
126d0 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
126f0 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
12700 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
12710 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
12720 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
12730 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
12740 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
12750 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12760 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
12770 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
12780 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
12790 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
127a0 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
127b0 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
127c0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
127d0 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
127e0 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
127f0 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
12800 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
12810 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
12820 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
12830 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
12840 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
12850 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
12860 70 65 29 7b 0a 20 20 69 66 28 20 65 54 79 70 65  pe){.  if( eType
12870 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
12880 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
12890 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
128a0 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
128b0 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
128c0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
128d0 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
128e0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
128f0 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
12900 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12910 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
12920 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
12930 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
12940 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
12950 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67    int isInitOrig
12960 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
12970 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
12980 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20   int nCell;..   
12990 20 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c   initPage(pPage,
129a0 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d   0);.    nCell =
129b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
129c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
129d0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
129e0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
129f0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
12a00 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
12a10 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
12a20 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
12a30 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
12a40 20 20 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50        parseCellP
12a50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
12a60 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
12a70 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
12a80 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
12a90 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34   if( iFrom==get4
12aa0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
12ab0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a  .iOverflow]) ){.
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
12ad0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
12ae0 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
12af0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
12b00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
12b10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
12b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12b30 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
12b40 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
12b50 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
12b60 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
12b70 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
12b80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12b90 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
12ba0 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
12bb0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
12bc0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
12bd0 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
12be0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
12bf0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
12c00 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
12c10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12c20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
12c30 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
12c40 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
12c50 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
12c60 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
12c70 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
12c80 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
12c90 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
12ca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12cb0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
12cc0 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
12cd0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
12ce0 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
12cf0 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
12d00 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
12d10 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
12d20 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
12d30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12d40 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
12d50 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
12d60 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
12d70 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
12d80 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
12d90 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
12da0 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
12db0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
12dc0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
12dd0 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
12de0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
12df0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
12e00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12e10 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
12e20 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
12e30 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
12e40 72 65 65 50 61 67 65 20 20 20 20 20 20 20 20 20  reePage         
12e50 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
12e60 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
12e70 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  e to */.){.  Mem
12e80 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
12e90 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
12ea0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
12eb0 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
12ec0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
12ed0 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
12ee0 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
12ef0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
12f00 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
12f10 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
12f20 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
12f30 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
12f40 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
12f50 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
12f60 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
12f70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
12f80 47 45 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  GE );..  /* Move
12f90 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
12fa0 6f 6d 20 69 74 27 73 20 63 75 72 72 65 6e 74 20  om it's current 
12fb0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
12fc0 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
12fd0 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
12fe0 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
12ff0 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
13000 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
13010 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
13020 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
13030 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
13040 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
13050 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
13060 5f 6d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  _movepage(pPager
13070 2c 20 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  , pDbPage->aData
13080 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
13090 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
130a0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
130b0 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
130c0 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
130d0 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
130e0 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
130f0 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
13100 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
13110 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
13120 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
13130 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
13140 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
13150 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
13160 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
13170 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
13180 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
13190 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
131a0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
131b0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
131c0 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
131d0 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
131e0 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
131f0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
13200 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
13210 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
13220 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
13230 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
13240 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
13250 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
13260 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
13270 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
13280 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
13290 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
132a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
132b0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
132c0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
132d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
132e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
132f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
13300 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
13310 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
13320 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
13330 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
13340 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
13350 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
13360 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
13370 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
13380 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
13390 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
133a0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
133b0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
133c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
133d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
133e0 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
133f0 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
13400 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
13410 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
13420 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
13430 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
13440 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
13450 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
13460 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
13470 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
13480 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
13490 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
134a0 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
134b0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
134c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
134d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
134e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
134f0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
13500 74 65 28 70 50 74 72 50 61 67 65 2d 3e 61 44 61  te(pPtrPage->aDa
13510 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ta);.    if( rc!
13520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13530 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13540 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
13550 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13560 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
13570 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
13580 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
13590 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
135a0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
135b0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
135c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
135d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
135e0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
135f0 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
13600 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a 20 20  e, iPtrPage);.  
13610 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
13620 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
13630 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
13640 65 71 75 69 72 65 64 20 62 79 20 61 75 74 6f 56  equired by autoV
13650 61 63 75 75 6d 43 6f 6d 6d 69 74 28 29 2e 20 2a  acuumCommit(). *
13660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
13670 6f 63 61 74 65 50 61 67 65 28 42 74 53 68 61 72  ocatePage(BtShar
13680 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
13690 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
136a0 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  u8);../*.** This
136b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
136c0 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69  ed prior to sqli
136d0 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 20  te3pager_commit 
136e0 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
136f0 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65  on.** is commite
13700 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
13710 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
13720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
13730 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
13740 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
13750 6f 20 2a 6e 54 72 75 6e 63 29 7b 0a 20 20 50 61  o *nTrunc){.  Pa
13760 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
13770 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  t->pPager;.  Pgn
13780 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
13790 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
137a0 72 20 6f 66 20 70 61 67 65 73 20 72 65 6d 61 69  r of pages remai
137b0 6e 69 6e 67 20 6f 6e 20 74 68 65 20 66 72 65 65  ning on the free
137c0 2d 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  -list. */.  int 
137d0 6e 50 74 72 4d 61 70 3b 20 20 20 20 20 20 20 20  nPtrMap;        
137e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
137f0 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20   of pointer-map 
13800 70 61 67 65 73 20 64 65 61 6c 6c 6f 63 61 74 65  pages deallocate
13810 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67  d */.  Pgno orig
13820 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
13830 20 20 2f 2a 20 50 61 67 65 73 20 69 6e 20 74 68    /* Pages in th
13840 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13850 2a 2f 0a 20 20 50 67 6e 6f 20 66 69 6e 53 69 7a  */.  Pgno finSiz
13860 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
13870 2f 2a 20 50 61 67 65 73 20 69 6e 20 74 68 65 20  /* Pages in the 
13880 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 66  database file af
13890 74 65 72 20 74 72 75 6e 63 61 74 69 6f 6e 20 2a  ter truncation *
138a0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
138c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
138d0 0a 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 69  .  u8 eType;.  i
138e0 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70  nt pgsz = pBt->p
138f0 61 67 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67  ageSize;  /* Pag
13900 65 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  e size for this 
13910 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
13920 6e 6f 20 69 44 62 50 61 67 65 3b 20 20 20 20 20  no iDbPage;     
13930 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13940 64 61 74 61 62 61 73 65 20 70 61 67 65 20 74 6f  database page to
13950 20 6d 6f 76 65 20 2a 2f 0a 20 20 4d 65 6d 50 61   move */.  MemPa
13960 67 65 20 2a 70 44 62 4d 65 6d 50 61 67 65 20 3d  ge *pDbMemPage =
13970 20 30 3b 20 20 20 2f 2a 20 22 22 20 2a 2f 0a 20   0;   /* "" */. 
13980 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 20   Pgno iPtrPage; 
13990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
139a0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
139b0 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
139c0 74 6f 20 69 44 62 50 61 67 65 20 2a 2f 0a 20 20  to iDbPage */.  
139d0 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 3b 20  Pgno iFreePage; 
139e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
139f0 65 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65  e free-list page
13a00 20 74 6f 20 6d 6f 76 65 20 69 44 62 50 61 67 65   to move iDbPage
13a10 20 74 6f 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65   to */.  MemPage
13a20 20 2a 70 46 72 65 65 4d 65 6d 50 61 67 65 20 3d   *pFreeMemPage =
13a30 20 30 3b 20 2f 2a 20 22 22 20 2a 2f 0a 0a 23 69   0; /* "" */..#i
13a40 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
13a50 6e 74 20 6e 52 65 66 20 3d 20 2a 73 71 6c 69 74  nt nRef = *sqlit
13a60 65 33 70 61 67 65 72 5f 73 74 61 74 73 28 70 50  e3pager_stats(pP
13a70 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ager);.#endif.. 
13a80 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
13a90 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66  toVacuum );.  if
13aa0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
13ab0 70 42 74 2c 20 73 71 6c 69 74 65 33 70 61 67 65  pBt, sqlite3page
13ac0 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
13ad0 65 72 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  er)) ){.    retu
13ae0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
13af0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
13b00 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
13b10 20 6d 61 6e 79 20 66 72 65 65 2d 70 61 67 65 73   many free-pages
13b20 20 61 72 65 20 69 6e 20 74 68 65 20 64 61 74 61   are in the data
13b30 62 61 73 65 2e 20 49 66 20 74 68 65 72 65 20 61  base. If there a
13b40 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 20  re no.  ** free 
13b50 70 61 67 65 73 2c 20 74 68 65 6e 20 61 75 74 6f  pages, then auto
13b60 2d 76 61 63 75 75 6d 20 69 73 20 61 20 6e 6f 2d  -vacuum is a no-
13b70 6f 70 2e 0a 20 20 2a 2f 0a 20 20 6e 46 72 65 65  op..  */.  nFree
13b80 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
13b90 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
13ba0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20  ata[36]);.  if( 
13bb0 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a  nFreeList==0 ){.
13bc0 20 20 20 20 2a 6e 54 72 75 6e 63 20 3d 20 30 3b      *nTrunc = 0;
13bd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13be0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
13bf0 20 54 68 69 73 20 62 6c 6f 63 6b 20 66 69 67 75   This block figu
13c00 72 65 73 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  res out how many
13c10 20 70 61 67 65 73 20 74 68 65 72 65 20 61 72 65   pages there are
13c20 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
13c30 0a 20 20 2a 2a 20 6e 6f 77 20 28 76 61 72 69 61  .  ** now (varia
13c40 62 6c 65 20 6f 72 69 67 53 69 7a 65 29 2c 20 61  ble origSize), a
13c50 6e 64 20 68 6f 77 20 6d 61 6e 79 20 74 68 65 72  nd how many ther
13c60 65 20 77 69 6c 6c 20 62 65 20 61 66 74 65 72 20  e will be after 
13c70 74 68 65 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74  the.  ** truncat
13c80 69 6f 6e 20 28 76 61 72 69 61 62 6c 65 20 66 69  ion (variable fi
13c90 6e 53 69 7a 65 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nSize)..  **.  *
13ca0 2a 20 54 68 65 20 66 69 6e 61 6c 20 73 69 7a 65  * The final size
13cb0 20 69 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   is the original
13cc0 20 73 69 7a 65 2c 20 6c 65 73 73 20 74 68 65 20   size, less the 
13cd0 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70  number of free p
13ce0 61 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ages.  ** in the
13cf0 20 64 61 74 61 62 61 73 65 2c 20 6c 65 73 73 20   database, less 
13d00 61 6e 79 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  any pointer-map 
13d10 70 61 67 65 73 20 74 68 61 74 20 77 69 6c 6c 20  pages that will 
13d20 6e 6f 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 62  no longer.  ** b
13d30 65 20 72 65 71 75 69 72 65 64 2c 20 6c 65 73 73  e required, less
13d40 20 31 20 69 66 20 74 68 65 20 70 65 6e 64 69 6e   1 if the pendin
13d50 67 2d 62 79 74 65 20 70 61 67 65 20 77 61 73 20  g-byte page was 
13d60 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
13d70 62 61 73 65 0a 20 20 2a 2a 20 62 75 74 20 69 73  base.  ** but is
13d80 20 6e 6f 74 20 61 66 74 65 72 20 74 68 65 20 74   not after the t
13d90 72 75 6e 63 61 74 69 6f 6e 2e 0a 20 20 2a 2a 2f  runcation..  **/
13da0 0a 20 20 6f 72 69 67 53 69 7a 65 20 3d 20 73 71  .  origSize = sq
13db0 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
13dc0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
13dd0 69 66 28 20 6f 72 69 67 53 69 7a 65 3d 3d 50 45  if( origSize==PE
13de0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
13df0 70 42 74 29 20 29 7b 0a 20 20 20 20 6f 72 69 67  pBt) ){.    orig
13e00 53 69 7a 65 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 50  Size--;.  }.  nP
13e10 74 72 4d 61 70 20 3d 20 28 6e 46 72 65 65 4c 69  trMap = (nFreeLi
13e20 73 74 2d 6f 72 69 67 53 69 7a 65 2b 50 54 52 4d  st-origSize+PTRM
13e30 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6f  AP_PAGENO(pBt, o
13e40 72 69 67 53 69 7a 65 29 2b 70 67 73 7a 2f 35 29  rigSize)+pgsz/5)
13e50 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 66 69 6e  /(pgsz/5);.  fin
13e60 53 69 7a 65 20 3d 20 6f 72 69 67 53 69 7a 65 20  Size = origSize 
13e70 2d 20 6e 46 72 65 65 4c 69 73 74 20 2d 20 6e 50  - nFreeList - nP
13e80 74 72 4d 61 70 3b 0a 20 20 69 66 28 20 6f 72 69  trMap;.  if( ori
13e90 67 53 69 7a 65 3e 50 45 4e 44 49 4e 47 5f 42 59  gSize>PENDING_BY
13ea0 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
13eb0 66 69 6e 53 69 7a 65 3c 3d 50 45 4e 44 49 4e 47  finSize<=PENDING
13ec0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
13ed0 29 7b 0a 20 20 20 20 66 69 6e 53 69 7a 65 2d 2d  ){.    finSize--
13ee0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
13ef0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
13f00 2c 20 66 69 6e 53 69 7a 65 29 20 7c 7c 20 66 69  , finSize) || fi
13f10 6e 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nSize==PENDING_B
13f20 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
13f30 0a 20 20 20 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a  .    finSize--;.
13f40 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 41 55    }.  TRACE(("AU
13f50 54 4f 56 41 43 55 55 4d 3a 20 42 65 67 69 6e 20  TOVACUUM: Begin 
13f60 28 64 62 20 73 69 7a 65 20 25 64 2d 3e 25 64 29  (db size %d->%d)
13f70 5c 6e 22 2c 20 6f 72 69 67 53 69 7a 65 2c 20 66  \n", origSize, f
13f80 69 6e 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20  inSize));..  /* 
13f90 56 61 72 69 61 62 6c 65 20 27 66 69 6e 53 69 7a  Variable 'finSiz
13fa0 65 27 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73  e' will be the s
13fb0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
13fc0 69 6e 20 70 61 67 65 73 20 61 66 74 65 72 0a 20  in pages after. 
13fd0 20 2a 2a 20 74 68 65 20 61 75 74 6f 2d 76 61 63   ** the auto-vac
13fe0 75 75 6d 20 68 61 73 20 63 6f 6d 70 6c 65 74 65  uum has complete
13ff0 64 20 28 74 68 65 20 63 75 72 72 65 6e 74 20 66  d (the current f
14000 69 6c 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74  ile size minus t
14010 68 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f  he number.  ** o
14020 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
14030 72 65 65 20 6c 69 73 74 29 2e 20 4c 6f 6f 70 20  ree list). Loop 
14040 74 68 72 6f 75 67 68 20 74 68 65 20 70 61 67 65  through the page
14050 73 20 74 68 61 74 20 6c 69 65 20 62 65 79 6f 6e  s that lie beyon
14060 64 0a 20 20 2a 2a 20 74 68 69 73 20 6d 61 72 6b  d.  ** this mark
14070 2c 20 61 6e 64 20 69 66 20 74 68 65 79 20 61 72  , and if they ar
14080 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 6e  e not already on
14090 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2c 20   the free list, 
140a0 6d 6f 76 65 20 74 68 65 6d 0a 20 20 2a 2a 20 74  move them.  ** t
140b0 6f 20 61 20 66 72 65 65 20 70 61 67 65 20 65 61  o a free page ea
140c0 72 6c 69 65 72 20 69 6e 20 74 68 65 20 66 69 6c  rlier in the fil
140d0 65 20 28 73 6f 6d 65 77 68 65 72 65 20 62 65 66  e (somewhere bef
140e0 6f 72 65 20 66 69 6e 53 69 7a 65 29 2e 0a 20 20  ore finSize)..  
140f0 2a 2f 0a 20 20 66 6f 72 28 20 69 44 62 50 61 67  */.  for( iDbPag
14100 65 3d 66 69 6e 53 69 7a 65 2b 31 3b 20 69 44 62  e=finSize+1; iDb
14110 50 61 67 65 3c 3d 6f 72 69 67 53 69 7a 65 3b 20  Page<=origSize; 
14120 69 44 62 50 61 67 65 2b 2b 20 29 7b 0a 20 20 20  iDbPage++ ){.   
14130 20 2f 2a 20 49 66 20 69 44 62 50 61 67 65 20 69   /* If iDbPage i
14140 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
14150 70 61 67 65 2c 20 6f 72 20 74 68 65 20 70 65 6e  page, or the pen
14160 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2c 20  ding-byte page, 
14170 73 6b 69 70 20 69 74 2e 20 2a 2f 0a 20 20 20 20  skip it. */.    
14180 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
14190 45 28 70 42 74 2c 20 69 44 62 50 61 67 65 29 20  E(pBt, iDbPage) 
141a0 7c 7c 20 69 44 62 50 61 67 65 3d 3d 50 45 4e 44  || iDbPage==PEND
141b0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
141c0 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  t) ){.      cont
141d0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
141e0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
141f0 70 42 74 2c 20 69 44 62 50 61 67 65 2c 20 26 65  pBt, iDbPage, &e
14200 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
14210 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
14220 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
14230 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20  utovacuum_out;. 
14240 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
14250 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
14260 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
14270 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
14280 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 75 74 6f  .      goto auto
14290 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20  vacuum_out;.    
142a0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 44 62  }..    /* If iDb
142b0 50 61 67 65 20 69 73 20 66 72 65 65 2c 20 64 6f  Page is free, do
142c0 20 6e 6f 74 20 73 77 61 70 20 69 74 2e 20 20 2a   not swap it.  *
142d0 2f 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  /.    if( eType=
142e0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
142f0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
14300 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ue;.    }.    rc
14310 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
14320 69 44 62 50 61 67 65 2c 20 26 70 44 62 4d 65 6d  iDbPage, &pDbMem
14330 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
14340 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
14350 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f  oto autovacuum_o
14360 75 74 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64  ut;..    /* Find
14370 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
14380 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
14390 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  that is not alre
143a0 61 64 79 20 61 74 20 74 68 65 20 65 6e 64 20 0a  ady at the end .
143b0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
143c0 6c 65 2e 20 41 20 70 61 67 65 20 63 61 6e 20 62  le. A page can b
143d0 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
143e0 20 66 72 65 65 20 6c 69 73 74 20 75 73 69 6e 67   free list using
143f0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 61 6c 6c   the .    ** all
14400 6f 63 61 74 65 50 61 67 65 28 29 20 72 6f 75 74  ocatePage() rout
14410 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
14420 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46  do{.      if( pF
14430 72 65 65 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  reeMemPage ){.  
14440 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
14450 65 28 70 46 72 65 65 4d 65 6d 50 61 67 65 29 3b  e(pFreeMemPage);
14460 0a 20 20 20 20 20 20 20 20 70 46 72 65 65 4d 65  .        pFreeMe
14470 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  mPage = 0;.     
14480 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c   }.      rc = al
14490 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
144a0 26 70 46 72 65 65 4d 65 6d 50 61 67 65 2c 20 26  &pFreeMemPage, &
144b0 69 46 72 65 65 50 61 67 65 2c 20 30 2c 20 30 29  iFreePage, 0, 0)
144c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
144d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
144e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
144f0 28 70 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20 20  (pDbMemPage);.  
14500 20 20 20 20 20 20 67 6f 74 6f 20 61 75 74 6f 76        goto autov
14510 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 20  acuum_out;.     
14520 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
14530 20 69 46 72 65 65 50 61 67 65 3c 3d 6f 72 69 67   iFreePage<=orig
14540 53 69 7a 65 20 29 3b 0a 20 20 20 20 7d 77 68 69  Size );.    }whi
14550 6c 65 28 20 69 46 72 65 65 50 61 67 65 3e 66 69  le( iFreePage>fi
14560 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 65 6c  nSize );.    rel
14570 65 61 73 65 50 61 67 65 28 70 46 72 65 65 4d 65  easePage(pFreeMe
14580 6d 50 61 67 65 29 3b 0a 20 20 20 20 70 46 72 65  mPage);.    pFre
14590 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b 0a 0a 20  eMemPage = 0;.. 
145a0 20 20 20 2f 2a 20 52 65 6c 6f 63 61 74 65 20 74     /* Relocate t
145b0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
145c0 20 62 6f 64 79 20 6f 66 20 74 68 65 20 66 69 6c   body of the fil
145d0 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 6c 74  e. Note that alt
145e0 68 6f 75 67 68 20 74 68 65 20 0a 20 20 20 20 2a  hough the .    *
145f0 2a 20 70 61 67 65 20 68 61 73 20 6d 6f 76 65 64  * page has moved
14600 20 77 69 74 68 69 6e 20 74 68 65 20 64 61 74 61   within the data
14610 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 20 70  base file, the p
14620 44 62 4d 65 6d 50 61 67 65 20 70 6f 69 6e 74 65  DbMemPage pointe
14630 72 20 0a 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e  r .    ** remain
14640 73 20 76 61 6c 69 64 2e 20 54 68 69 73 20 6d 65  s valid. This me
14650 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 66 75  ans that this fu
14660 6e 63 74 69 6f 6e 20 63 61 6e 20 72 75 6e 20 77  nction can run w
14670 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 69 6e  ithout.    ** in
14680 76 61 6c 69 64 61 74 69 6e 67 20 63 75 72 73 6f  validating curso
14690 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  rs open on the b
146a0 74 72 65 65 2e 20 54 68 69 73 20 69 73 20 69 6d  tree. This is im
146b0 70 6f 72 74 61 6e 74 20 69 6e 20 0a 20 20 20 20  portant in .    
146c0 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
146d0 6d 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mode..    */.   
146e0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
146f0 67 65 28 70 42 74 2c 20 70 44 62 4d 65 6d 50 61  ge(pBt, pDbMemPa
14700 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
14710 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 29 3b  age, iFreePage);
14720 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
14730 28 70 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20 20  (pDbMemPage);.  
14740 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14750 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76  _OK ) goto autov
14760 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  acuum_out;.  }..
14770 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
14780 66 72 65 65 2d 6c 69 73 74 20 68 61 73 20 62 65  free-list has be
14790 65 6e 20 73 77 61 70 70 65 64 20 74 6f 20 74 68  en swapped to th
147a0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
147b0 65 2e 20 53 6f 0a 20 20 2a 2a 20 74 72 75 6e 63  e. So.  ** trunc
147c0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
147d0 20 66 69 6c 65 20 74 6f 20 66 69 6e 53 69 7a 65   file to finSize
147e0 20 70 61 67 65 73 20 61 6e 64 20 63 6f 6e 73 69   pages and consi
147f0 64 65 72 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  der the.  ** fre
14800 65 2d 6c 69 73 74 20 65 6d 70 74 79 2e 0a 20 20  e-list empty..  
14810 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
14820 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 42 74  3pager_write(pBt
14830 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
14840 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
14850 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74  TE_OK ) goto aut
14860 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 70  ovacuum_out;.  p
14870 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
14880 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
14890 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
148a0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
148b0 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 2a  ata[36], 0);.  *
148c0 6e 54 72 75 6e 63 20 3d 20 66 69 6e 53 69 7a 65  nTrunc = finSize
148d0 3b 0a 20 20 61 73 73 65 72 74 28 20 66 69 6e 53  ;.  assert( finS
148e0 69 7a 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ize!=PENDING_BYT
148f0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
14900 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3a 0a  autovacuum_out:.
14910 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
14920 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74  *sqlite3pager_st
14930 61 74 73 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ats(pPager) );. 
14940 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14950 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
14960 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
14970 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
14980 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
14990 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  if../*.** Commit
149a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
149b0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72   currently in pr
149c0 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ogress..**.** Th
149d0 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
149e0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
149f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
14a00 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
14a10 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
14a20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
14a30 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
14a40 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
14a50 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
14a60 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
14a70 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
14a80 70 2d 3e 70 42 74 3b 0a 0a 20 20 62 74 72 65 65  p->pBt;..  btree
14a90 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
14aa0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
14ab0 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
14ac0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
14ad0 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
14ae0 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
14af0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
14b00 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
14b10 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
14b20 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
14b30 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
14b40 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
14b50 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
14b60 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14b70 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
14b80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14b90 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
14ba0 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
14bb0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
14bc0 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  mit(pBt->pPager)
14bd0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
14be0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14bf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14c00 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  }.    pBt->inTra
14c10 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
14c20 5f 52 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e  _READ;.    pBt->
14c30 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  inStmt = 0;.  }.
14c40 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65    unlockAllTable
14c50 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  s(p);..  /* If t
14c60 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e  he handle has an
14c70 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
14c80 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
14c90 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61  ement the transa
14ca0 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74  ction.  ** count
14cb0 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
14cc0 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
14cd0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72  nsaction count r
14ce0 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20  eaches 0, set.  
14cf0 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20 73 74  ** the shared st
14d00 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
14d10 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72  E. The unlockBtr
14d20 65 65 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c  eeIfUnused() cal
14d30 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c  l below.  ** wil
14d40 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
14d50 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
14d60 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
14d70 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74  _NONE ){.    pBt
14d80 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
14d90 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74  ;.    if( 0==pBt
14da0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
14db0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
14dc0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
14dd0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  NS_NONE;.    }. 
14de0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
14df0 20 68 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74   handles current
14e00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
14e10 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
14e20 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a   and unlock.  **
14e30 20 74 68 65 20 70 61 67 65 72 20 69 66 20 74 68   the pager if th
14e40 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74  is call closed t
14e50 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20  he only read or 
14e60 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
14e70 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54  n..  */.  p->inT
14e80 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
14e90 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  E;.  unlockBtree
14ea0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a  IfUnused(pBt);..
14eb0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
14ec0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
14ed0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
14ee0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
14ef0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
14f00 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
14f10 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
14f20 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
14f30 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
14f40 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
14f50 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
14f60 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
14f70 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
14f80 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
14f90 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74  ic int countWrit
14fa0 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  eCursors(BtShare
14fb0 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
14fc0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
14fd0 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
14fe0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
14ff0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
15000 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
15010 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29  ( pCur->wrFlag )
15020 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
15030 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
15040 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
15050 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66  ITE_TEST) && def
15060 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
15070 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 64  G)./*.** Print d
15080 65 62 75 67 67 69 6e 67 20 69 6e 66 6f 72 6d 61  ebugging informa
15090 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 63  tion about all c
150a0 75 72 73 6f 72 73 20 74 6f 20 73 74 61 6e 64 61  ursors to standa
150b0 72 64 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 76 6f  rd output..*/.vo
150c0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
150d0 75 72 73 6f 72 4c 69 73 74 28 42 74 72 65 65 20  ursorList(Btree 
150e0 2a 70 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  *p){.  BtCursor 
150f0 2a 70 43 75 72 3b 0a 20 20 42 74 53 68 61 72 65  *pCur;.  BtShare
15100 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
15110 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
15120 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
15130 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
15140 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
15150 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
15160 61 67 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  age;.    char *z
15170 4d 6f 64 65 20 3d 20 70 43 75 72 2d 3e 77 72 46  Mode = pCur->wrF
15180 6c 61 67 20 3f 20 22 72 77 22 20 3a 20 22 72 6f  lag ? "rw" : "ro
15190 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ";.    sqlite3De
151a0 62 75 67 50 72 69 6e 74 66 28 22 43 55 52 53 4f  bugPrintf("CURSO
151b0 52 20 25 70 20 72 6f 6f 74 65 64 20 61 74 20 25  R %p rooted at %
151c0 34 64 28 25 73 29 20 63 75 72 72 65 6e 74 6c 79  4d(%s) currently
151d0 20 61 74 20 25 64 2e 25 64 25 73 5c 6e 22 2c 0a   at %d.%d%s\n",.
151e0 20 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75         pCur, pCu
151f0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 7a 4d 6f  r->pgnoRoot, zMo
15200 64 65 2c 0a 20 20 20 20 20 20 20 70 50 61 67 65  de,.       pPage
15210 20 3f 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3a   ? pPage->pgno :
15220 20 30 2c 20 70 43 75 72 2d 3e 69 64 78 2c 0a 20   0, pCur->idx,. 
15230 20 20 20 20 20 20 28 70 43 75 72 2d 3e 65 53 74        (pCur->eSt
15240 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
15250 44 29 20 3f 20 22 22 20 3a 20 22 20 65 6f 66 22  D) ? "" : " eof"
15260 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
15270 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  ndif../*.** Roll
15280 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
15290 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
152a0 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  .  All cursors w
152b0 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ill be.** invali
152c0 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ded by this oper
152d0 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65  ation.  Any atte
152e0 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72  mpt to use a cur
152f0 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20  sor.** that was 
15300 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  open at the begi
15310 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70  nning of this op
15320 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  eration will res
15330 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72  ult.** in an err
15340 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
15350 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
15360 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
15370 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15380 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
15390 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
153a0 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
153b0 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
153c0 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
153d0 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
153e0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
153f0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
15400 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15410 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
15420 31 3b 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 41  1;..  rc = saveA
15430 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
15440 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
15450 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
15460 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21  _CACHE.  if( rc!
15470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15480 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68    /* This is a h
15490 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f  orrible situatio
154a0 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c  n. An IO or mall
154b0 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
154c0 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a  ed whilst.    **
154d0 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20   trying to save 
154e0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73  cursor positions
154f0 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
15500 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61  automatic rollba
15510 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68  ck (as.    ** th
15520 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f  e result of a co
15530 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63  nstraint, malloc
15540 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f  () failure or IO
15550 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20   error) then .  
15560 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d    ** the cache m
15570 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79  ay be internally
15580 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e   inconsistent (n
15590 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64  ot contain valid
155a0 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a   trees) so.    *
155b0 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70  * we cannot simp
155c0 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  ly return the er
155d0 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ror to the calle
155e0 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72  r. Instead, abor
155f0 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75  t .    ** all qu
15600 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62  eries that may b
15610 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74  e using any of t
15620 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
15630 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a  failed to save..
15640 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
15650 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29  ( pBt->pCursor )
15660 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
15670 2a 64 62 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  *db = pBt->pCurs
15680 6f 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c  or->pBtree->pSql
15690 69 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ite;.      if( d
156a0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
156b0 69 74 65 33 41 62 6f 72 74 4f 74 68 65 72 41 63  ite3AbortOtherAc
156c0 74 69 76 65 56 64 62 65 73 28 64 62 2c 20 30 29  tiveVdbes(db, 0)
156d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
156e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72    }.#endif.  btr
156f0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
15700 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65    unlockAllTable
15710 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  s(p);..  if( p->
15720 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
15730 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
15740 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
15750 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
15760 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
15770 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
15780 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
15790 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
157a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
157b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
157c0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
157d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
157e0 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
157f0 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70   destroyed the p
15800 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c  Page1->aData val
15810 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63  ue.  So.    ** c
15820 61 6c 6c 20 67 65 74 50 61 67 65 28 29 20 6f 6e  all getPage() on
15830 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
15840 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
15850 31 2d 3e 61 44 61 74 61 20 69 73 0a 20 20 20 20  1->aData is.    
15860 2a 2a 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  ** set correctly
15870 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74  . */.    if( get
15880 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
15890 61 67 65 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  age1)==SQLITE_OK
158a0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
158b0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
158c0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
158d0 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
158e0 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20  rs(pBt)==0 );.  
158f0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
15900 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
15910 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  D;.  }..  if( p-
15920 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
15930 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65  NONE ){.    asse
15940 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
15950 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70  ction>0 );.    p
15960 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
15970 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70  --;.    if( 0==p
15980 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
15990 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
159a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
159b0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  RANS_NONE;.    }
159c0 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61  .  }..  p->inTra
159d0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
159e0 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d  .  pBt->inStmt =
159f0 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65   0;.  unlockBtre
15a00 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
15a10 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
15a20 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  y(p);.  return r
15a30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
15a40 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
15a50 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54  btransaction.  T
15a60 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
15a70 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  n can.** can be 
15a80 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65  rolled back inde
15a90 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
15aa0 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
15ab0 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73  n..** You must s
15ac0 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
15ad0 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  on before starti
15ae0 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
15af0 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74  ion..** The subt
15b00 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
15b10 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
15b20 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y if the main tr
15b30 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d  ansaction.** com
15b40 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
15b50 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f  ck..**.** Only o
15b60 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ne subtransactio
15b70 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65 20  n may be active 
15b80 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69  at a time.  It i
15b90 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72  s an error to tr
15ba0 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20  y.** to start a 
15bb0 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63 74 69  new subtransacti
15bc0 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75  on if another su
15bd0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
15be0 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a  already active..
15bf0 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
15c00 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
15c10 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
15c20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
15c30 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
15c40 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
15c50 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
15c60 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
15c70 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
15c80 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
15c90 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
15ca0 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
15cb0 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
15cc0 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
15cd0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
15ce0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
15cf0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
15d00 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
15d10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15d20 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
15d30 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
15d40 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
15d50 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
15d60 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  ( (p->inTrans!=T
15d70 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
15d80 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20  Bt->inStmt ){.  
15d90 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
15da0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
15db0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
15dc0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  E_ERROR;.  }.  a
15dd0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
15de0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
15df0 5f 57 52 49 54 45 20 29 3b 0a 20 20 72 63 20 3d  _WRITE );.  rc =
15e00 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
15e10 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
15e20 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62  ite3pager_stmt_b
15e30 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
15e40 29 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  );.  pBt->inStmt
15e50 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 1;.  return r
15e60 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
15e70 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74  mit the statment
15e80 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
15e90 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
15ea0 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a  gress.  If no.**
15eb0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
15ec0 69 73 20 61 63 74 69 76 65 2c 20 74 68 69 73 20  is active, this 
15ed0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
15ee0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
15ef0 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20  ommitStmt(Btree 
15f00 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
15f10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15f20 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70   p->pBt;.  if( p
15f30 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70  Bt->inStmt && !p
15f40 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
15f50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15f60 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69  pager_stmt_commi
15f70 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
15f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
15f90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
15fa0 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d  .  pBt->inStmt =
15fb0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
15fc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
15fd0 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 73 74  ck the active st
15fe0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
15ff0 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73  action.  If no s
16000 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  ubtransaction.**
16010 20 69 73 20 61 63 74 69 76 65 20 74 68 69 73 20   is active this 
16020 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
16030 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75  op..**.** All cu
16040 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e  rsors will be in
16050 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69  validated by thi
16060 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e  s operation.  An
16070 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  y attempt.** to 
16080 75 73 65 20 61 20 63 75 72 73 6f 72 20 74 68 61  use a cursor tha
16090 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68  t was open at th
160a0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
160b0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  his operation.**
160c0 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
160d0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74  an error..*/.int
160e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
160f0 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65 20  lbackStmt(Btree 
16100 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
16110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
16120 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16130 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61  pBt;.  sqlite3Ma
16140 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28 29 3b 0a  llocDisallow();.
16150 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d    if( pBt->inStm
16160 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f  t && !pBt->readO
16170 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nly ){.    rc = 
16180 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
16190 74 5f 72 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  t_rollback(pBt->
161a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
161b0 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43  ert( countWriteC
161c0 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29  ursors(pBt)==0 )
161d0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
161e0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = 0;.  }.  sql
161f0 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28  ite3MallocAllow(
16200 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16210 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  }../*.** Default
16220 20 6b 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20   key comparison 
16230 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 75  function to be u
16240 73 65 64 20 69 66 20 6e 6f 20 63 6f 6d 70 61 72  sed if no compar
16250 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ison function.**
16260 20 69 73 20 73 70 65 63 69 66 69 65 64 20 6f 6e   is specified on
16270 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
16280 65 43 75 72 73 6f 72 28 29 20 63 61 6c 6c 2e 0a  eCursor() call..
16290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 66  */.static int df
162a0 6c 74 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69  ltCompare(.  voi
162b0 64 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  d *NotUsed,     
162c0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20          /* User 
162d0 64 61 74 61 20 69 73 20 6e 6f 74 20 75 73 65 64  data is not used
162e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 63 6f   */.  int n1, co
162f0 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 20 20  nst void *p1,   
16300 20 2f 2a 20 46 69 72 73 74 20 6b 65 79 20 74 6f   /* First key to
16310 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e   compare */.  in
16320 74 20 6e 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  t n2, const void
16330 20 2a 70 32 20 20 20 20 20 2f 2a 20 53 65 63 6f   *p2     /* Seco
16340 6e 64 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72  nd key to compar
16350 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 3b  e */.){.  int c;
16360 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 31  .  c = memcmp(p1
16370 2c 20 70 32 2c 20 6e 31 3c 6e 32 20 3f 20 6e 31  , p2, n1<n2 ? n1
16380 20 3a 20 6e 32 29 3b 0a 20 20 69 66 28 20 63 3d   : n2);.  if( c=
16390 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 6e 31  =0 ){.    c = n1
163a0 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20 72 65 74   - n2;.  }.  ret
163b0 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
163c0 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
163d0 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
163e0 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
163f0 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
16400 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20  Table.  The act 
16410 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61 20 63  of acquiring a c
16420 75 72 73 6f 72 20 67 65 74 73 20 61 20 72 65 61  ursor gets a rea
16430 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68  d lock on .** th
16440 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16450 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
16460 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
16470 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
16480 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
16490 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
164a0 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
164b0 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
164c0 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
164d0 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
164e0 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
164f0 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
16500 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
16510 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
16520 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
16530 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
16540 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
16550 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
16560 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
16570 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
16580 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
16590 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
165a0 20 32 3a 20 20 4e 6f 20 6f 74 68 65 72 20 63 75   2:  No other cu
165b0 72 73 6f 72 73 20 6d 61 79 20 62 65 20 6f 70 65  rsors may be ope
165c0 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
165d0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
165e0 6c 65 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  le.**.** 3:  The
165f0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
16600 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
16610 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
16620 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
16630 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
16640 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
16650 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 64 69 74 69  n..**.** Conditi
16660 6f 6e 20 32 20 77 61 72 72 61 6e 74 73 20 66 75  on 2 warrants fu
16670 72 74 68 65 72 20 64 69 73 63 75 73 73 69 6f 6e  rther discussion
16680 2e 20 20 49 66 20 61 6e 79 20 63 75 72 73 6f 72  .  If any cursor
16690 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
166a0 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 77 72   a table with wr
166b0 46 6c 61 67 3d 3d 30 2c 20 74 68 61 74 20 70 72  Flag==0, that pr
166c0 65 76 65 6e 74 73 20 61 6c 6c 20 6f 74 68 65 72  events all other
166d0 20 63 75 72 73 6f 72 73 20 66 72 6f 6d 0a 2a 2a   cursors from.**
166e0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 61 74   writing to that
166f0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
16700 20 61 20 6b 69 6e 64 20 6f 66 20 22 72 65 61 64   a kind of "read
16710 2d 6c 6f 63 6b 22 2e 20 20 57 68 65 6e 20 61 20  -lock".  When a 
16720 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6f 70 65  cursor.** is ope
16730 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
16740 3d 30 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  =0 it is guarant
16750 65 65 64 20 74 68 61 74 20 74 68 65 20 74 61 62  eed that the tab
16760 6c 65 20 77 69 6c 6c 20 6e 6f 74 0a 2a 2a 20 63  le will not.** c
16770 68 61 6e 67 65 20 61 73 20 6c 6f 6e 67 20 61 73  hange as long as
16780 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
16790 70 65 6e 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77  pen.  This allow
167a0 73 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 0a  s the cursor to.
167b0 2a 2a 20 64 6f 20 61 20 73 65 71 75 65 6e 74 69  ** do a sequenti
167c0 61 6c 20 73 63 61 6e 20 6f 66 20 74 68 65 20 74  al scan of the t
167d0 61 62 6c 65 20 77 69 74 68 6f 75 74 20 68 61 76  able without hav
167e0 69 6e 67 20 74 6f 20 77 6f 72 72 79 20 61 62 6f  ing to worry abo
167f0 75 74 0a 2a 2a 20 65 6e 74 72 69 65 73 20 62 65  ut.** entries be
16800 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 72 20  ing inserted or 
16810 64 65 6c 65 74 65 64 20 64 75 72 69 6e 67 20 74  deleted during t
16820 68 65 20 73 63 61 6e 2e 20 20 43 75 72 73 6f 72  he scan.  Cursor
16830 73 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 6f  s should.** be o
16840 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
16850 67 3d 3d 30 20 6f 6e 6c 79 20 69 66 20 74 68 69  g==0 only if thi
16860 73 20 72 65 61 64 2d 6c 6f 63 6b 20 70 72 6f 70  s read-lock prop
16870 65 72 74 79 20 69 73 20 6e 65 65 64 65 64 2e 0a  erty is needed..
16880 2a 2a 20 54 68 61 74 20 69 73 20 74 6f 20 73 61  ** That is to sa
16890 79 2c 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c  y, cursors shoul
168a0 64 20 62 65 20 6f 70 65 6e 65 64 20 77 69 74 68  d be opened with
168b0 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 6c 79 20   wrFlag==0 only 
168c0 69 66 20 74 68 65 79 0a 2a 2a 20 69 6e 74 65 6e  if they.** inten
168d0 64 20 74 6f 20 75 73 65 20 74 68 65 20 73 71 6c  d to use the sql
168e0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
168f0 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 41 6c  system call.  Al
16900 6c 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 0a  l other cursors.
16910 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 6f 70 65  ** should be ope
16920 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
16930 3d 31 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  =1 even if they 
16940 6e 65 76 65 72 20 72 65 61 6c 6c 79 20 69 6e 74  never really int
16950 65 6e 64 0a 2a 2a 20 74 6f 20 77 72 69 74 65 2e  end.** to write.
16960 0a 2a 2a 20 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  .** .** No check
16970 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
16980 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
16990 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
169a0 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
169b0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
169c0 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
169d0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
169e0 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
169f0 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
16a00 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ctly..**.** The 
16a10 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
16a20 69 6f 6e 20 6d 75 73 74 20 62 65 20 6c 6f 67 69  ion must be logi
16a30 63 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  cally the same f
16a40 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 0a  or every cursor.
16a50 2a 2a 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ** on a particul
16a60 61 72 20 74 61 62 6c 65 2e 20 20 43 68 61 6e 67  ar table.  Chang
16a70 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ing the comparis
16a80 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  on function will
16a90 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 69 6e   result.** in in
16aa0 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
16ab0 6e 73 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 70  ns.  If the comp
16ac0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
16ad0 69 73 20 4e 55 4c 4c 2c 20 61 0a 2a 2a 20 64 65  is NULL, a.** de
16ae0 66 61 75 6c 74 20 63 6f 6d 70 61 72 69 73 6f 6e  fault comparison
16af0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
16b00 64 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69 73  d.  The comparis
16b10 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  on function is.*
16b20 2a 20 61 6c 77 61 79 73 20 69 67 6e 6f 72 65 64  * always ignored
16b30 20 66 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   for INTKEY tabl
16b40 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
16b50 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
16b60 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
16b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b90 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
16ba0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
16bd0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
16be0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
16bf0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
16c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
16c20 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
16c30 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  only */.  int (*
16c40 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  xCmp)(void*,int,
16c50 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
16c60 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a  const void*), /*
16c70 20 4b 65 79 20 43 6f 6d 70 61 72 69 73 6f 6e 20   Key Comparison 
16c80 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  func */.  void *
16c90 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  pArg,           
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cb0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
16cc0 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
16cd0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
16ce0 2a 70 70 43 75 72 20 20 20 20 20 20 20 20 20 20  *ppCur          
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d00 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
16d10 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
16d20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
16d30 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 42  ursor *pCur;.  B
16d40 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
16d50 2d 3e 70 42 74 3b 0a 0a 20 20 2a 70 70 43 75 72  ->pBt;..  *ppCur
16d60 20 3d 20 30 3b 0a 20 20 69 66 28 20 77 72 46 6c   = 0;.  if( wrFl
16d70 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  ag ){.    if( pB
16d80 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
16d90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16da0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
16db0 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b   }.    if( check
16dc0 52 65 61 64 4c 6f 63 6b 73 28 70 42 74 2c 20 69  ReadLocks(pBt, i
16dd0 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20  Table, 0) ){.   
16de0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16df0 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20  _LOCKED;.    }. 
16e00 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   }..  if( pBt->p
16e10 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
16e20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69  rc = lockBtreeWi
16e30 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20  thRetry(p);.    
16e40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16e50 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
16e60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
16e70 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 4d    pCur = sqliteM
16e80 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
16e90 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
16ea0 75 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ur==0 ){.    rc 
16eb0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
16ec0 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
16ed0 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
16ee0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67  ;.  }.  pCur->pg
16ef0 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69  noRoot = (Pgno)i
16f00 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61  Table;.  if( iTa
16f10 62 6c 65 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  ble==1 && sqlite
16f20 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
16f30 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30  (pBt->pPager)==0
16f40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
16f50 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67  ITE_EMPTY;.    g
16f60 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f  oto create_curso
16f70 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d  r_exception;.  }
16f80 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
16f90 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72  itPage(pBt, pCur
16fa0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
16fb0 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  r->pPage, 0);.  
16fc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16fd0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72  K ){.    goto cr
16fe0 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
16ff0 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
17000 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
17010 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
17020 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
17030 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
17040 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
17050 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  es, link the cur
17060 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
17070 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73  hared list and s
17080 65 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20  et *ppCur (the. 
17090 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d   ** output argum
170a0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
170b0 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43  tion)..  */.  pC
170c0 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78  ur->xCompare = x
170d0 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c  Cmp ? xCmp : dfl
170e0 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72  tCompare;.  pCur
170f0 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ->pArg = pArg;. 
17100 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
17110 70 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61  p;.  pCur->wrFla
17120 67 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43  g = wrFlag;.  pC
17130 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
17140 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  >pCursor;.  if( 
17150 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
17160 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
17170 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20  pPrev = pCur;.  
17180 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  }.  pBt->pCursor
17190 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
171a0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
171b0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43  _INVALID;.  *ppC
171c0 75 72 20 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65  ur = pCur;..  re
171d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
171e0 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
171f0 63 65 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70  ception:.  if( p
17200 43 75 72 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Cur ){.    relea
17210 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61  sePage(pCur->pPa
17220 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  ge);.    sqliteF
17230 72 65 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  ree(pCur);.  }. 
17240 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
17250 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74  used(pBt);.  ret
17260 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 30  urn rc;.}..#if 0
17270 20 20 2f 2a 20 4e 6f 74 20 55 73 65 64 20 2a 2f    /* Not Used */
17280 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
17290 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
172a0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
172b0 6f 6e 20 75 73 65 64 20 62 79 20 61 20 63 75 72  on used by a cur
172c0 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sor..*/.void sql
172d0 69 74 65 33 42 74 72 65 65 53 65 74 43 6f 6d 70  ite3BtreeSetComp
172e0 61 72 65 28 0a 20 20 42 74 43 75 72 73 6f 72 20  are(.  BtCursor 
172f0 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 54 68  *pCur,     /* Th
17300 65 20 63 75 72 73 6f 72 20 74 6f 20 77 68 6f 73  e cursor to whos
17310 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  e comparison fun
17320 63 74 69 6f 6e 20 69 73 20 63 68 61 6e 67 65 64  ction is changed
17330 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 6d 70 29   */.  int(*xCmp)
17340 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
17350 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
17360 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4e 65 77 20   void*), /* New 
17370 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 20  comparison func 
17380 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
17390 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
173a0 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
173b0 6d 70 28 29 20 2a 2f 0a 29 7b 0a 20 20 70 43 75  mp() */.){.  pCu
173c0 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43  r->xCompare = xC
173d0 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74  mp ? xCmp : dflt
173e0 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d  Compare;.  pCur-
173f0 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 7d 0a  >pArg = pArg;.}.
17400 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c  #endif../*.** Cl
17410 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
17420 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
17430 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17440 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
17450 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
17460 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
17470 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17480 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
17490 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
174a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
174b0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d   = pCur->pBtree-
174c0 3e 70 42 74 3b 0a 20 20 72 65 73 74 6f 72 65 4f  >pBt;.  restoreO
174d0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
174e0 74 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20  tion(pCur, 0);. 
174f0 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
17500 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50   ){.    pCur->pP
17510 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
17520 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  r->pNext;.  }els
17530 65 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72  e{.    pBt->pCur
17540 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
17550 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  t;.  }.  if( pCu
17560 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
17570 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
17580 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
17590 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
175a0 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
175b0 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
175c0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
175d0 73 71 6c 69 74 65 46 72 65 65 28 70 43 75 72 29  sqliteFree(pCur)
175e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
175f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
17600 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ake a temporary 
17610 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e  cursor by fillin
17620 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20  g in the fields 
17630 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20  of pTempCur..** 
17640 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75  The temporary cu
17650 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74  rsor is not on t
17660 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66  he cursor list f
17670 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f  or the Btree..*/
17680 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74  .static void get
17690 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
176a0 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72  sor *pCur, BtCur
176b0 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a  sor *pTempCur){.
176c0 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75    memcpy(pTempCu
176d0 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28  r, pCur, sizeof(
176e0 2a 70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70  *pCur));.  pTemp
176f0 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Cur->pNext = 0;.
17700 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65    pTempCur->pPre
17710 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65  v = 0;.  if( pTe
17720 6d 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a  mpCur->pPage ){.
17730 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
17740 5f 72 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70  _ref(pTempCur->p
17750 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
17760 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
17770 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
17780 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73  rsor such as was
17790 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65   made by the Cre
177a0 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73  ateTemporaryCurs
177b0 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  or().** function
177c0 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
177d0 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 54 65  c void releaseTe
177e0 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
177f0 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
17800 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20  pCur->pPage ){. 
17810 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
17820 75 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67  unref(pCur->pPag
17830 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d 0a 7d  e->aData);.  }.}
17840 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
17850 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  e the BtCursor.i
17860 6e 66 6f 20 66 69 65 6c 64 20 6f 66 20 74 68 65  nfo field of the
17870 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 69 73   given cursor is
17880 20 76 61 6c 69 64 2e 0a 2a 2a 20 49 66 20 69 74   valid..** If it
17890 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
178a0 76 61 6c 69 64 2c 20 63 61 6c 6c 20 70 61 72 73  valid, call pars
178b0 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
178c0 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
178d0 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
178e0 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
178f0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
17900 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
17910 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
17920 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
17930 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
17940 20 70 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f   parseCell()..*/
17950 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74  .static void get
17960 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
17970 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
17980 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
17990 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 72 73 65  ==0 ){.    parse
179a0 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
179b0 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43  , pCur->idx, &pC
179c0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c  ur->info);.  }el
179d0 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  se{.#ifndef NDEB
179e0 55 47 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  UG.    CellInfo 
179f0 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  info;.    memset
17a00 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
17a10 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 70 61  f(info));.    pa
17a20 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
17a30 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
17a40 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
17a50 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f  rt( memcmp(&info
17a60 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
17a70 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
17a80 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
17a90 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
17aa0 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
17ab0 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
17ac0 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
17ad0 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
17ae0 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
17af0 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
17b00 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
17b10 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
17b20 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
17b30 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
17b40 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
17b50 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
17b60 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
17b70 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
17b80 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
17b90 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
17ba0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
17bb0 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  n the key..*/.in
17bc0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
17bd0 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
17be0 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
17bf0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ){.  int rc = re
17c00 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
17c10 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c  orPosition(pCur,
17c20 20 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   1);.  if( rc==S
17c30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17c40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
17c50 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
17c60 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
17c70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
17c80 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ID );.    if( pC
17c90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
17ca0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
17cb0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
17cc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17cd0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
17ce0 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65  r);.      *pSize
17cf0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
17d00 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ey;.    }.  }.  
17d10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17d20 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
17d30 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
17d40 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
17d50 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
17d60 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
17d70 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ly points to.  A
17d80 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c  lways return SQL
17d90 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75  ITE_OK..** Failu
17da0 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
17db0 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  le.  If the curs
17dc0 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
17dd0 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  tly.** pointing 
17de0 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69  to an entry (whi
17df0 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66  ch can happen, f
17e00 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
17e10 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
17e20 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70  s empty) then *p
17e30 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
17e40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17e50 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
17e60 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
17e70 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  2 *pSize){.  int
17e80 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
17e90 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
17ea0 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69  on(pCur, 1);.  i
17eb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17ec0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17ed0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
17ee0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
17ef0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
17f00 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
17f10 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
17f20 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
17f30 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  ID ){.      /* N
17f40 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
17f50 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73   valid entry - s
17f60 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20  et *pSize to 0. 
17f70 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  */.      *pSize 
17f80 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
17f90 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
17fa0 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  o(pCur);.      *
17fb0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
17fc0 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a  fo.nData;.    }.
17fd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17fe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
17ff0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
18000 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
18010 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
18020 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 70 6f 69  cursor is.** poi
18030 6e 74 69 6e 67 20 74 6f 2e 20 20 42 65 67 69 6e  nting to.  Begin
18040 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61 79   reading the pay
18050 6c 6f 61 64 20 61 74 20 22 6f 66 66 73 65 74 22  load at "offset"
18060 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 61 20 74   and read.** a t
18070 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
18080 74 65 73 2e 20 20 50 75 74 20 74 68 65 20 72 65  tes.  Put the re
18090 73 75 6c 74 20 69 6e 20 7a 42 75 66 2e 0a 2a 2a  sult in zBuf..**
180a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
180b0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61   does not make a
180c0 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74   distinction bet
180d0 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74  ween key and dat
180e0 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65  a..** It just re
180f0 61 64 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74  ads bytes from t
18100 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e  he payload area.
18110 20 20 44 61 74 61 20 6d 69 67 68 74 20 61 70 70    Data might app
18120 65 61 72 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 61  ear.** on the ma
18130 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73 63  in page or be sc
18140 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
18150 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
18160 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   pages..*/.stati
18170 63 20 69 6e 74 20 67 65 74 50 61 79 6c 6f 61 64  c int getPayload
18180 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
18190 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
181a0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
181b0 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
181c0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  m */.  int offse
181d0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
181e0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
181f0 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
18200 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  ad */.  int amt,
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18220 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
18230 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
18240 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
18250 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
18260 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
18270 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69  er */ .  int ski
18280 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
18290 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20 61   offset begins a
182a0 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
182b0 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  s true */.){.  u
182c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
182d0 61 79 6c 6f 61 64 3b 0a 20 20 50 67 6e 6f 20 6e  ayload;.  Pgno n
182e0 65 78 74 50 61 67 65 3b 0a 20 20 69 6e 74 20 72  extPage;.  int r
182f0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
18300 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
18310 2a 70 42 74 3b 0a 20 20 69 6e 74 20 6f 76 66 6c  *pBt;.  int ovfl
18320 53 69 7a 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79  Size;.  u32 nKey
18330 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
18340 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50  r!=0 && pCur->pP
18350 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
18360 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
18370 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
18380 3b 0a 20 20 70 42 74 20 3d 20 70 43 75 72 2d 3e  ;.  pBt = pCur->
18390 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 70  pBtree->pBt;.  p
183a0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
183b0 67 65 3b 0a 20 20 70 61 67 65 49 6e 74 65 67 72  ge;.  pageIntegr
183c0 69 74 79 28 70 50 61 67 65 29 3b 0a 20 20 61 73  ity(pPage);.  as
183d0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
183e0 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
183f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
18400 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
18410 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
18420 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
18430 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ll + pCur->info.
18440 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70  nHeader;.  if( p
18450 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
18460 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20      nKey = 0;.  
18470 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20  }else{.    nKey 
18480 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
18490 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  y;.  }.  assert(
184a0 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20   offset>=0 );.  
184b0 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
184c0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65     offset += nKe
184d0 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66  y;.  }.  if( off
184e0 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
184f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20  Cur->info.nData 
18500 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18510 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
18520 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75    if( offset<pCu
18530 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
18540 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d  {.    int a = am
18550 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66  t;.    if( a+off
18560 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set>pCur->info.n
18570 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61  Local ){.      a
18580 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
18590 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20  ocal - offset;. 
185a0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
185b0 70 42 75 66 2c 20 26 61 50 61 79 6c 6f 61 64 5b  pBuf, &aPayload[
185c0 6f 66 66 73 65 74 5d 2c 20 61 29 3b 0a 20 20 20  offset], a);.   
185d0 20 69 66 28 20 61 3d 3d 61 6d 74 20 29 7b 0a 20   if( a==amt ){. 
185e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
185f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
18600 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
18610 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
18620 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
18630 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
18640 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
18650 61 6c 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c 53 69  al;.  }.  ovflSi
18660 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
18670 53 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66 28 20  Size - 4;.  if( 
18680 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 6e 65 78  amt>0 ){.    nex
18690 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
186a0 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
186b0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
186c0 20 20 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30      while( amt>0
186d0 20 26 26 20 6e 65 78 74 50 61 67 65 20 29 7b 0a   && nextPage ){.
186e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
186f0 65 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d  e3pager_get(pBt-
18700 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
18710 65 2c 20 28 76 6f 69 64 2a 2a 29 26 61 50 61 79  e, (void**)&aPay
18720 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 69 66 28  load);.      if(
18730 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
18740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18750 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 50     }.      nextP
18760 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
18770 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
18780 69 66 28 20 6f 66 66 73 65 74 3c 6f 76 66 6c 53  if( offset<ovflS
18790 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
187a0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
187b0 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
187c0 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
187d0 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f  .          a = o
187e0 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
187f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18800 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
18810 20 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65   &aPayload[offse
18820 74 2b 34 5d 2c 20 61 29 3b 0a 20 20 20 20 20 20  t+4], a);.      
18830 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
18840 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
18850 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
18860 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  a;.      }else{.
18870 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
18880 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
18890 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
188a0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 61 50 61  3pager_unref(aPa
188b0 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 0a 20 20  yload);.    }.  
188c0 7d 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29  }..  if( amt>0 )
188d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
188e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
188f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
18900 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
18910 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
18920 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  the key associat
18930 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
18940 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
18950 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
18960 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
18970 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
18980 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
18990 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
189a0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
189b0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
189c0 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
189d0 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
189e0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
189f0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
18a00 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
18a10 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
18a20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
18a30 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
18a40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18a50 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
18a60 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
18a70 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
18a80 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
18a90 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
18aa0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
18ab0 70 43 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20  pCur, 1);.  if( 
18ac0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18ad0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
18ae0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
18af0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
18b00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
18b10 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge!=0 );.    if(
18b20 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e   pCur->pPage->in
18b30 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
18b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18b50 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
18b60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
18b70 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d  ->pPage->intKey=
18b80 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
18b90 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
18ba0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72  & pCur->idx<pCur
18bb0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
18bc0 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  ;.    rc = getPa
18bd0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
18be0 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
18bf0 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
18c00 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18c10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
18c20 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
18c30 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
18c40 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
18c50 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
18c60 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
18c70 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
18c80 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
18c90 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
18ca0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
18cb0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
18cc0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
18cd0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
18ce0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
18cf0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
18d00 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
18d10 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
18d20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
18d30 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
18d40 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
18d50 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
18d60 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
18d70 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
18d80 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
18d90 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72  f){.  int rc = r
18da0 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
18db0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
18dc0 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 1);.  if( rc==
18dd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18de0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
18df0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
18e00 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
18e10 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  t( pCur->pPage!=
18e20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18e30 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
18e40 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
18e50 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
18e60 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 79  .    rc = getPay
18e70 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
18e80 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 29  t, amt, pBuf, 1)
18e90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18ea0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
18eb0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
18ec0 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
18ed0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
18ee0 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
18ef0 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
18f00 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
18f10 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
18f20 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
18f30 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b  ** the key if sk
18f40 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20  ipKey==0 and it 
18f50 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65  points to the be
18f60 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
18f70 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31  if.** skipKey==1
18f80 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
18f90 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
18fa0 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20  ble key/data is 
18fb0 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
18fc0 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
18fd0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
18fe0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  lue returned wil
18ff0 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61  l not be.** a va
19000 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
19010 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19020 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
19030 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
19040 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
19050 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
19060 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
19070 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
19080 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
19090 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
190a0 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
190b0 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
190c0 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
190d0 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
190e0 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
190f0 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
19100 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
19110 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
19120 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
19130 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
19140 67 65 74 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  getPayload() mus
19150 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
19160 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b  ssembly.** the k
19170 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
19180 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
19190 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
191a0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
191b0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
191c0 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
191d0 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
191e0 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
191f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
19200 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
19210 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
19220 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
19230 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
19240 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
19250 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
19260 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66  unsigned char *f
19270 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
19280 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
19290 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
192a0 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
192b0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
192c0 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20    int *pAmt,    
192d0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
192e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
192f0 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
19300 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70  re */.  int skip
19310 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Key          /* 
19320 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61  read beginning a
19330 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
19340 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  s true */.){.  u
19350 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
19360 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67  ayload;.  MemPag
19370 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20  e *pPage;.  u32 
19380 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63  nKey;.  int nLoc
19390 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  al;..  assert( p
193a0 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
193b0 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  pPage!=0 );.  as
193c0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
193d0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
193e0 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
193f0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 61 67  ur->pPage;.  pag
19400 65 49 6e 74 65 67 72 69 74 79 28 70 50 61 67 65  eIntegrity(pPage
19410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
19420 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
19430 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
19440 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ell );.  getCell
19450 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
19460 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
19470 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61  nfo.pCell;.  aPa
19480 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69  yload += pCur->i
19490 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69  nfo.nHeader;.  i
194a0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
194b0 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30   ){.    nKey = 0
194c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
194d0 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  Key = pCur->info
194e0 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  .nKey;.  }.  if(
194f0 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
19500 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  aPayload += nKey
19510 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  ;.    nLocal = p
19520 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
19530 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65   - nKey;.  }else
19540 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  {.    nLocal = p
19550 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
19560 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c  ;.    if( nLocal
19570 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e  >nKey ){.      n
19580 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20  Local = nKey;.  
19590 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20    }.  }.  *pAmt 
195a0 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75  = nLocal;.  retu
195b0 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  rn aPayload;.}..
195c0 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
195d0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
195e0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
195f0 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
19600 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
19610 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
19620 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
19630 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
19640 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
19650 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
19660 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
19670 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
19680 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
19690 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
196a0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
196b0 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
196c0 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
196d0 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
196e0 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
196f0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
19700 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
19710 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
19720 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
19730 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
19740 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
19750 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
19760 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
19770 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
19780 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
19790 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
197a0 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
197b0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
197c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
197d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
197e0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
197f0 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
19800 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 0);.  }.  r
19810 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74  eturn 0;.}.const
19820 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
19830 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
19840 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
19850 20 2a 70 41 6d 74 29 7b 0a 20 20 69 66 28 20 70   *pAmt){.  if( p
19860 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19870 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
19880 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76   return (const v
19890 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
198a0 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29  d(pCur, pAmt, 1)
198b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
198c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
198d0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
198e0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
198f0 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
19900 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
19910 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
19920 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
19930 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
19940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
19950 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
19960 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
19970 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
19980 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
19990 77 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65  wPage;.  MemPage
199a0 20 2a 70 4f 6c 64 50 61 67 65 3b 0a 20 20 42 74   *pOldPage;.  Bt
199b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
199c0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b  ur->pBtree->pBt;
199d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
199e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
199f0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d  _VALID );.  rc =
19a00 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
19a10 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
19a20 4e 65 77 50 61 67 65 2c 20 70 43 75 72 2d 3e 70  NewPage, pCur->p
19a30 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
19a40 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
19a50 61 67 65 49 6e 74 65 67 72 69 74 79 28 70 4e 65  ageIntegrity(pNe
19a60 77 50 61 67 65 29 3b 0a 20 20 70 4e 65 77 50 61  wPage);.  pNewPa
19a70 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20  ge->idxParent = 
19a80 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c  pCur->idx;.  pOl
19a90 64 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  dPage = pCur->pP
19aa0 61 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d  age;.  pOldPage-
19ab0 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20  >idxShift = 0;. 
19ac0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c   releasePage(pOl
19ad0 64 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  dPage);.  pCur->
19ae0 70 50 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65  pPage = pNewPage
19af0 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20  ;.  pCur->idx = 
19b00 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
19b10 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
19b20 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c   pNewPage->nCell
19b30 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <1 ){.    return
19b40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
19b50 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
19b60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19b70 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
19b80 75 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ue if the page i
19b90 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  s the virtual ro
19ba0 6f 74 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e  ot of its table.
19bb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75  .**.** The virtu
19bc0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
19bd0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f  the root page fo
19be0 72 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20  r most tables.  
19bf0 42 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74  But.** for the t
19c00 61 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70  able rooted on p
19c10 61 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20  age 1, sometime 
19c20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61  the real root pa
19c30 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65  ge.** is empty e
19c40 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 72 69  xcept for the ri
19c50 67 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e  ght-pointer.  In
19c60 20 73 75 63 68 20 63 61 73 65 73 20 74 68 65 0a   such cases the.
19c70 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  ** virtual root 
19c80 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
19c90 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d   that the right-
19ca0 70 6f 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a  pointer of page.
19cb0 2a 2a 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67  ** 1 is pointing
19cc0 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   to..*/.static i
19cd0 6e 74 20 69 73 52 6f 6f 74 50 61 67 65 28 4d 65  nt isRootPage(Me
19ce0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
19cf0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
19d00 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
19d10 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e  nt;.  if( pParen
19d20 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  t==0 ) return 1;
19d30 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  .  if( pParent->
19d40 70 67 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20  pgno>1 ) return 
19d50 30 3b 0a 20 20 69 66 28 20 67 65 74 32 62 79 74  0;.  if( get2byt
19d60 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
19d70 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
19d80 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65  fset+3])==0 ) re
19d90 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
19da0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76   0;.}../*.** Mov
19db0 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
19dc0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
19dd0 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
19de0 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
19df0 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
19e00 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
19e10 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
19e20 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
19e30 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
19e40 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
19e50 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
19e60 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
19e70 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
19e80 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
19e90 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
19ea0 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
19eb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
19ec0 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
19ed0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
19ee0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b  emPage *pParent;
19ef0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
19f00 65 3b 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65  e;.  int idxPare
19f10 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  nt;..  assert( p
19f20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19f30 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70  SOR_VALID );.  p
19f40 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
19f50 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
19f60 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
19f70 72 74 28 20 21 69 73 52 6f 6f 74 50 61 67 65 28  rt( !isRootPage(
19f80 70 50 61 67 65 29 20 29 3b 0a 20 20 70 61 67 65  pPage) );.  page
19f90 49 6e 74 65 67 72 69 74 79 28 70 50 61 67 65 29  Integrity(pPage)
19fa0 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
19fb0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
19fc0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
19fd0 3d 30 20 29 3b 0a 20 20 70 61 67 65 49 6e 74 65  =0 );.  pageInte
19fe0 67 72 69 74 79 28 70 50 61 72 65 6e 74 29 3b 0a  grity(pParent);.
19ff0 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20 70 50    idxParent = pP
1a000 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a  age->idxParent;.
1a010 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
1a020 65 66 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  ef(pParent->aDat
1a030 61 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  a);.  releasePag
1a040 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72  e(pPage);.  pCur
1a050 2d 3e 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e  ->pPage = pParen
1a060 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t;.  pCur->info.
1a070 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73  nSize = 0;.  ass
1a080 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 64  ert( pParent->id
1a090 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70  xShift==0 );.  p
1a0a0 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78 50 61  Cur->idx = idxPa
1a0b0 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  rent;.}../*.** M
1a0c0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
1a0d0 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a  o the root page.
1a0e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1a0f0 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
1a100 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
1a110 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
1a120 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a130 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1a140 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  t = pCur->pBtree
1a150 2d 3e 70 42 74 3b 0a 0a 20 20 72 65 73 74 6f 72  ->pBt;..  restor
1a160 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
1a170 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b  sition(pCur, 0);
1a180 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
1a190 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52  >pPage;.  if( pR
1a1a0 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70 67  oot && pRoot->pg
1a1b0 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
1a1c0 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ot ){.    assert
1a1d0 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20  ( pRoot->isInit 
1a1e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a1f0 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54  if( .      SQLIT
1a200 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41  E_OK!=(rc = getA
1a210 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
1a220 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
1a230 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20 20  &pRoot, 0)).    
1a240 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
1a250 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1a260 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
1a270 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1a280 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1a290 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20  Cur->pPage);.   
1a2a0 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70   pageIntegrity(p
1a2b0 52 6f 6f 74 29 3b 0a 20 20 20 20 70 43 75 72 2d  Root);.    pCur-
1a2c0 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f 74 3b 0a  >pPage = pRoot;.
1a2d0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78 20    }.  pCur->idx 
1a2e0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
1a2f0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
1a300 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d  f( pRoot->nCell=
1a310 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65  =0 && !pRoot->le
1a320 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
1a330 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73 65  ubpage;.    asse
1a340 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
1a350 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67  =1 );.    subpag
1a360 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
1a370 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
1a380 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1a390 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 75 62  .    assert( sub
1a3a0 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43  page>0 );.    pC
1a3b0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1a3c0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
1a3d0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1a3e0 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
1a3f0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61    }.  pCur->eSta
1a400 74 65 20 3d 20 28 28 70 43 75 72 2d 3e 70 50 61  te = ((pCur->pPa
1a410 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52  ge->nCell>0)?CUR
1a420 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52  SOR_VALID:CURSOR
1a430 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 72 65 74  _INVALID);.  ret
1a440 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a450 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1a460 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
1a470 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
1a480 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
1a490 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
1a4a0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
1a4b0 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
1a4c0 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
1a4d0 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
1a4e0 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
1a4f0 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
1a500 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
1a510 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
1a520 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
1a530 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
1a540 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
1a550 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  ;.  int rc;.  Me
1a560 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1a570 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1a580 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1a590 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
1a5a0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
1a5b0 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
1a5c0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1a5d0 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
1a5e0 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
1a5f0 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
1a600 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
1a610 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
1a620 69 64 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  idx));.    rc = 
1a630 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1a640 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
1a650 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1a660 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1a670 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1a680 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1a690 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
1a6a0 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
1a6b0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
1a6c0 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
1a6d0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
1a6e0 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
1a6f0 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
1a700 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
1a710 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
1a720 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
1a730 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
1a740 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
1a750 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
1a760 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
1a770 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
1a780 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1a790 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
1a7a0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
1a7b0 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
1a7c0 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
1a7d0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
1a7e0 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
1a7f0 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
1a800 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
1a810 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
1a820 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1a830 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
1a840 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1a850 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
1a860 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
1a870 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1a880 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1a890 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1a8a0 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  ID );.  while( !
1a8b0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  (pPage = pCur->p
1a8c0 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  Page)->leaf ){. 
1a8d0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
1a8e0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1a8f0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1a900 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
1a910 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43  >idx = pPage->nC
1a920 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
1a930 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1a940 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
1a950 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1a960 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d   }.  pCur->idx =
1a970 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20   pPage->nCell - 
1a980 31 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  1;.  pCur->info.
1a990 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 72 65 74  nSize = 0;.  ret
1a9a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a9b0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
1a9c0 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
1a9d0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1a9e0 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
1a9f0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
1aa00 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
1aa10 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
1aa20 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
1aa30 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
1aa40 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
1aa50 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
1aa60 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1aa70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1aa80 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
1aa90 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1aaa0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  ){.  int rc;.  r
1aab0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1aac0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
1aad0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
1aae0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1aaf0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1ab00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1ab10 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1ab20 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ==0 );.    *pRes
1ab30 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1ab40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ab50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ab60 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
1ab70 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  ;.  *pRes = 0;. 
1ab80 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
1ab90 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65  most(pCur);.  re
1aba0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1abb0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
1abc0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
1abd0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
1abe0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1abf0 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
1ac00 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
1ac10 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
1ac20 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
1ac30 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
1ac40 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
1ac50 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1ac60 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
1ac70 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
1ac80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1ac90 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1aca0 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65   rc;.  rc = move
1acb0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1acc0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1acd0 72 63 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52  rc;.  if( CURSOR
1ace0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1acf0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 61 73  eState ){.    as
1ad00 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1ad10 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
1ad20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1ad30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ad40 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
1ad50 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1ad60 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1ad70 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
1ad80 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
1ad90 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
1ada0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
1adb0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  ve the cursor so
1adc0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1add0 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72  to an entry near
1ade0 20 70 4b 65 79 2f 6e 4b 65 79 2e 0a 2a 2a 20 52   pKey/nKey..** R
1adf0 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
1ae00 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
1ae10 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f  INTKEY tables, o
1ae20 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 70 61 72  nly the nKey par
1ae30 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
1ae40 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f   pKey is.** igno
1ae50 72 65 64 2e 20 20 46 6f 72 20 6f 74 68 65 72 20  red.  For other 
1ae60 74 61 62 6c 65 73 2c 20 6e 4b 65 79 20 69 73 20  tables, nKey is 
1ae70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1ae80 74 65 73 20 6f 66 20 64 61 74 61 0a 2a 2a 20 69  tes of data.** i
1ae90 6e 20 70 4b 65 79 2e 20 20 54 68 65 20 63 6f 6d  n pKey.  The com
1aea0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
1aeb0 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e 20   specified when 
1aec0 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a  the cursor was.*
1aed0 2a 20 63 72 65 61 74 65 64 20 69 73 20 75 73 65  * created is use
1aee0 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 6b 65 79  d to compare key
1aef0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
1af00 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
1af10 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
1af20 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
1af30 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
1af40 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
1af50 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
1af60 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
1af70 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
1af80 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
1af90 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
1afa0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
1afb0 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
1afc0 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
1afd0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
1afe0 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68   of comparing th
1aff0 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
1b000 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
1b010 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 77  e.** cursor is w
1b020 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73 20  ritten to *pRes 
1b030 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20  if pRes!=NULL.  
1b040 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a  The meaning of.*
1b050 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  * this value is 
1b060 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1b070 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
1b080 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1b090 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1b0a0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1b0b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1b0c0 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
1b0d0 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20 74  han pKey or if t
1b0e0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1b0f0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
1b100 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
1b110 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
1b120 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
1b130 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
1b140 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
1b150 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1b160 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1b170 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b190 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
1b1a0 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   pKey..**.**    
1b1b0 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
1b1c0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1b1d0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1b1e0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1b200 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 4b  s larger than pK
1b210 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
1b220 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 42 74  e3BtreeMoveto(Bt
1b230 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 63 6f  Cursor *pCur, co
1b240 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1b250 69 36 34 20 6e 4b 65 79 2c 20 69 6e 74 20 2a 70  i64 nKey, int *p
1b260 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1b270 20 20 69 6e 74 20 74 72 79 52 69 67 68 74 6d 6f    int tryRightmo
1b280 73 74 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54  st;.  rc = moveT
1b290 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1b2a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1b2b0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  c;.  assert( pCu
1b2c0 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r->pPage );.  as
1b2d0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1b2e0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 74  e->isInit );.  t
1b2f0 72 79 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 43  ryRightmost = pC
1b300 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
1b310 79 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  y;.  if( pCur->e
1b320 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1b330 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
1b340 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
1b350 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1b360 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1b370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b380 4f 4b 3b 0a 20 20 7d 0a 20 20 20 66 6f 72 28 3b  OK;.  }.   for(;
1b390 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
1b3a0 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63   upr;.    Pgno c
1b3b0 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
1b3c0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1b3d0 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 6e 74  ->pPage;.    int
1b3e0 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65   c = -1;  /* pRe
1b3f0 73 20 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c  s return if tabl
1b400 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20  e is empty must 
1b410 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72  be -1 */.    lwr
1b420 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
1b430 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
1b440 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1b450 69 6e 74 4b 65 79 20 26 26 20 70 4b 65 79 3d 3d  intKey && pKey==
1b460 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1b470 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1b480 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
1b490 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70   pageIntegrity(p
1b4a0 50 61 67 65 29 3b 0a 20 20 20 20 77 68 69 6c 65  Page);.    while
1b4b0 28 20 6c 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20  ( lwr<=upr ){.  
1b4c0 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
1b4d0 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 43  ey;.      i64 nC
1b4e0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 70 43  ellKey;.      pC
1b4f0 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75  ur->idx = (lwr+u
1b500 70 72 29 2f 32 3b 0a 20 20 20 20 20 20 70 43 75  pr)/2;.      pCu
1b510 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1b520 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  0;.      if( pPa
1b530 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
1b540 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
1b550 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 72 79  .        if( try
1b560 52 69 67 68 74 6d 6f 73 74 20 29 7b 0a 20 20 20  Rightmost ){.   
1b570 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78         pCur->idx
1b580 20 3d 20 75 70 72 3b 0a 20 20 20 20 20 20 20 20   = upr;.        
1b590 7d 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  }.        pCell 
1b5a0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1b5b0 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 2b 20 70  , pCur->idx) + p
1b5c0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
1b5d0 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
1b5e0 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
1b5f0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
1b600 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20  dummy;.         
1b610 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72   pCell += getVar
1b620 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 26 64 75  int32(pCell, &du
1b630 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mmy);.        }.
1b640 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
1b650 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 20 2a 29  t(pCell, (u64 *)
1b660 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
1b670 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
1b680 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  <nKey ){.       
1b690 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20     c = -1;.     
1b6a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
1b6b0 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b 0a 20 20  llKey>nKey ){.  
1b6c0 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a          c = +1;.
1b6d0 20 20 20 20 20 20 20 20 20 20 74 72 79 52 69 67            tryRig
1b6e0 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20  htmost = 0;.    
1b6f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b700 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
1b710 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1b720 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  e{.        int a
1b730 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20  vailable;.      
1b740 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f    pCellKey = (vo
1b750 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  id *)fetchPayloa
1b760 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62  d(pCur, &availab
1b770 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  le, 0);.        
1b780 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d  nCellKey = pCur-
1b790 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
1b7a0 20 20 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c      if( availabl
1b7b0 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20  e>=nCellKey ){. 
1b7c0 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 75           c = pCu
1b7d0 72 2d 3e 78 43 6f 6d 70 61 72 65 28 70 43 75 72  r->xCompare(pCur
1b7e0 2d 3e 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79  ->pArg, nCellKey
1b7f0 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79  , pCellKey, nKey
1b800 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , pKey);.       
1b810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b820 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
1b830 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 43  iteMallocRaw( nC
1b840 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ellKey );.      
1b850 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
1b860 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1b870 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1b880 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b890 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
1b8a0 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f  0, nCellKey, (vo
1b8b0 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a  id *)pCellKey);.
1b8c0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43            c = pC
1b8d0 75 72 2d 3e 78 43 6f 6d 70 61 72 65 28 70 43 75  ur->xCompare(pCu
1b8e0 72 2d 3e 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65  r->pArg, nCellKe
1b8f0 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65  y, pCellKey, nKe
1b900 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
1b910 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1b920 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
1b930 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1b940 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1b950 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1b960 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
1b970 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
1b980 65 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67  eafData && !pPag
1b990 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1b9a0 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d       lwr = pCur-
1b9b0 3e 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  >idx;.          
1b9c0 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20  upr = lwr - 1;. 
1b9d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1b9e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1b9f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
1ba00 73 20 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  s ) *pRes = 0;. 
1ba10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1ba20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1ba30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1ba40 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
1ba50 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72        lwr = pCur
1ba60 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d  ->idx+1;.      }
1ba70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70  else{.        up
1ba80 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b  r = pCur->idx-1;
1ba90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1baa0 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
1bab0 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  upr+1 );.    ass
1bac0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
1bad0 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
1bae0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1baf0 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20     chldPg = 0;. 
1bb00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72     }else if( lwr
1bb10 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1bb20 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
1bb30 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1bb40 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1bb50 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1bb60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
1bb70 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
1bb80 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1bb90 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
1bba0 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20    if( chldPg==0 
1bbb0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1bbc0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
1bbd0 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
1bbe0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
1bbf0 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20  .      if( pRes 
1bc00 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20  ) *pRes = c;.   
1bc10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bc20 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
1bc30 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a  Cur->idx = lwr;.
1bc40 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1bc50 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 72 63  Size = 0;.    rc
1bc60 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1bc70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
1bc80 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1bc90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1bca0 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20   }.  }.  /* NOT 
1bcb0 52 45 41 43 48 45 44 20 2a 2f 0a 7d 0a 0a 2f 2a  REACHED */.}../*
1bcc0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1bcd0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
1bce0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
1bcf0 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
1bd00 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
1bd10 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
1bd20 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
1bd30 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
1bd40 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
1bd50 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
1bd60 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1bd70 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
1bd80 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
1bd90 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
1bda0 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
1bdb0 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
1bdc0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1bdd0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
1bde0 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
1bdf0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
1be00 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
1be10 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
1be20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1be30 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
1be40 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
1be50 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
1be60 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
1be70 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
1be80 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
1be90 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
1bea0 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
1beb0 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
1bec0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
1bed0 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
1bee0 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
1bef0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
1bf00 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
1bf10 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
1bf20 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
1bf30 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
1bf40 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
1bf50 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
1bf60 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
1bf70 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
1bf80 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1bf90 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1bfa0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1bfb0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1bfc0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1bfd0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1bfe0 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
1bff0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1c000 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
1c010 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 23 69  Page *pPage;..#i
1c020 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c030 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1c040 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
1c050 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
1c060 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69  on(pCur, 1);.  i
1c070 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c080 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1c090 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
1c0a0 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20  r->skip>0 ){.   
1c0b0 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1c0c0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
1c0d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c0e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
1c0f0 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 23 65 6e 64  ->skip = 0;.#end
1c100 69 66 20 0a 0a 20 20 61 73 73 65 72 74 28 20 70  if ..  assert( p
1c110 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61 67  Res!=0 );.  pPag
1c120 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1c130 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
1c140 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1c150 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
1c160 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1c170 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1c180 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1c190 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
1c1a0 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3c 70  ert( pCur->idx<p
1c1b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
1c1c0 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20    pCur->idx++;. 
1c1d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1c1e0 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
1c1f0 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  r->idx>=pPage->n
1c200 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
1c210 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1c220 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1c230 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
1c240 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1c250 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1c260 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
1c270 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1c280 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
1c290 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
1c2a0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  Cur);.      *pRe
1c2b0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1c2c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1c2d0 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
1c2e0 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  isRootPage(pPage
1c2f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  ) ){.        *pR
1c300 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
1c310 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1c320 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1c330 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1c340 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1c350 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
1c360 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
1c370 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1c380 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Page;.    }while
1c390 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
1c3a0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1c3b0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1c3c0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  if( pPage->leafD
1c3d0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ata ){.      rc 
1c3e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
1c3f0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
1c400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c410 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c420 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1c430 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
1c440 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
1c450 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1c460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c470 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
1c480 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1c490 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c4a0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
1c4b0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1c4c0 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
1c4d0 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
1c4e0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
1c4f0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
1c500 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
1c510 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
1c520 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
1c530 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
1c540 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1c550 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1c560 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1c570 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1c580 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1c590 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1c5a0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
1c5b0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1c5c0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1c5d0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1c5e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1c5f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c600 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1c610 45 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  E.  rc = restore
1c620 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
1c630 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a  ition(pCur, 1);.
1c640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c650 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1c660 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
1c670 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a  pCur->skip<0 ){.
1c680 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
1c690 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
1c6a0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
1c6b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1c6c0 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 23  Cur->skip = 0;.#
1c6d0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 43 55 52  endif..  if( CUR
1c6e0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
1c6f0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
1c700 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1c710 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c720 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  ;.  }..  pPage =
1c730 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1c740 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1c750 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
1c760 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1c770 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
1c780 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
1c790 6f 20 3d 20 67 65 74 34 62 79 74 65 28 20 66 69  o = get4byte( fi
1c7a0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
1c7b0 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20 20 20  ur->idx) );.    
1c7c0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1c7d0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1c7e0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1c7f0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
1c800 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
1c810 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
1c820 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
1c830 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  idx==0 ){.      
1c840 69 66 28 20 69 73 52 6f 6f 74 50 61 67 65 28 70  if( isRootPage(p
1c850 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Page) ){.       
1c860 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1c870 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1c880 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
1c890 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
1c8a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1c8b0 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
1c8c0 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
1c8d0 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
1c8e0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a  r->pPage;.    }.
1c8f0 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b      pCur->idx--;
1c900 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
1c910 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 69  nSize = 0;.    i
1c920 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  f( pPage->leafDa
1c930 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ta && !pPage->le
1c940 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
1c950 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1c960 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
1c970 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c980 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c990 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
1c9a0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74  *pRes = 0;.  ret
1c9b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c9c0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1c9d0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
1c9e0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1c9f0 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
1ca00 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
1ca10 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
1ca20 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 70 61 67  ords, sqlite3pag
1ca30 65 72 5f 77 72 69 74 65 28 29 0a 2a 2a 20 68 61  er_write().** ha
1ca40 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1ca50 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
1ca60 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
1ca70 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
1ca80 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
1ca90 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
1caa0 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
1cab0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
1cac0 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 70  ling.** sqlite3p
1cad0 61 67 65 72 5f 75 6e 72 65 66 28 29 20 6f 6e 20  ager_unref() on 
1cae0 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
1caf0 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
1cb00 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1cb10 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1cb20 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
1cb30 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
1cb40 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
1cb50 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
1cb60 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
1cb70 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
1cb80 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
1cb90 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
1cba0 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  e sqlite3pager_u
1cbb0 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67  nref() on *ppPag
1cbc0 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
1cbd0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1cbe0 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
1cbf0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
1cc00 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65  t 0, then a (fee
1cc10 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d  ble) effort is m
1cc20 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
1cc30 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
1cc40 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
1cc50 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
1cc60 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
1cc70 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
1cc80 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
1cc90 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
1cca0 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
1ccb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
1ccc0 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
1ccd0 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
1cce0 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
1ccf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65  .**.** If the "e
1cd00 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20  xact" parameter 
1cd10 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68  is not 0, and th
1cd20 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65  e page-number ne
1cd30 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20  arby exists .** 
1cd40 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
1cd50 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
1cd60 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64  it is guarenteed
1cd70 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
1cd80 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
1cd90 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
1cda0 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77  cuum databases w
1cdb0 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61  hen allocating a
1cdc0 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   new table..*/.s
1cdd0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
1cde0 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
1cdf0 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50  ed *pBt, .  MemP
1ce00 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20  age **ppPage, . 
1ce10 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20   Pgno *pPgno, . 
1ce20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20   Pgno nearby,.  
1ce30 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65  u8 exact.){.  Me
1ce40 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
1ce50 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
1ce60 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1ce70 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
1ce80 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  freelist */.  in
1ce90 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  t k;     /* Numb
1cea0 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
1ceb0 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
1cec0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 0a 20 20   freelist */..  
1ced0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
1cee0 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34  age1;.  n = get4
1cef0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1cf00 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20  ata[36]);.  if( 
1cf10 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
1cf20 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
1cf30 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
1cf40 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
1cf50 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
1cf60 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
1cf70 20 3d 20 30 3b 0a 20 20 20 20 50 67 6e 6f 20 69   = 0;.    Pgno i
1cf80 54 72 75 6e 6b 3b 0a 20 20 20 20 4d 65 6d 50 61  Trunk;.    MemPa
1cf90 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
1cfa0 20 30 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63   0;.    u8 searc
1cfb0 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
1cfc0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
1cfd0 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
1cfe0 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
1cff0 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74      .    /* If t
1d000 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d  he 'exact' param
1d010 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e  eter was true an
1d020 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
1d030 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
1d040 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
1d050 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
1d060 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
1d070 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1d080 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
1d090 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
1d0a0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
1d0b0 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
1d0c0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1d0d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1d0e0 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20  M.    if( exact 
1d0f0 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
1d100 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1d110 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
1d120 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1d130 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
1d140 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1d150 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
1d160 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
1d170 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1d180 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
1d190 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
1d1a0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
1d1b0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
1d1c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d1d0 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
1d1e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1d1f0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
1d200 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
1d210 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
1d220 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
1d230 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
1d240 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
1d250 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
1d260 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
1d270 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
1d280 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1d290 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 31  ger_write(pPage1
1d2a0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
1d2b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1d2c0 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
1d2d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1d2e0 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
1d2f0 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
1d300 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
1d310 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
1d320 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
1d330 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
1d340 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
1d350 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
1d360 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
1d370 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
1d380 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
1d390 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
1d3a0 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
1d3b0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
1d3c0 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
1d3d0 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
1d3e0 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
1d3f0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1d400 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
1d410 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
1d420 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
1d430 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1d440 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
1d450 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1d460 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
1d470 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65      rc = getPage
1d480 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
1d490 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 69 66  Trunk);.      if
1d4a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1d4b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1d4c0 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  vTrunk);.       
1d4d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d4e0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f    }..      /* TO
1d4f0 44 4f 3a 20 54 68 69 73 20 73 68 6f 75 6c 64 20  DO: This should 
1d500 6d 6f 76 65 20 74 6f 20 61 66 74 65 72 20 74 68  move to after th
1d510 65 20 6c 6f 6f 70 3f 20 2a 2f 0a 20 20 20 20 20  e loop? */.     
1d520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1d530 65 72 5f 77 72 69 74 65 28 70 54 72 75 6e 6b 2d  er_write(pTrunk-
1d540 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69  >aData);.      i
1d550 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1d560 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
1d570 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 65  unk);.        re
1d580 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
1d590 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 72  runk);.        r
1d5a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1d5b0 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  }..      k = get
1d5c0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
1d5d0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20  Data[4]);.      
1d5e0 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
1d5f0 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
1d600 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
1d610 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
1d620 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
1d630 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
1d640 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
1d650 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
1d660 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
1d670 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
1d680 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
1d690 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
1d6a0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
1d6b0 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
1d6c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  =0 );.        *p
1d6d0 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
1d6e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1d6f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1d700 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1d710 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1d720 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
1d730 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
1d740 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
1d750 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1d760 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
1d770 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
1d780 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
1d790 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1d7a0 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ( k>pBt->usableS
1d7b0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
1d7c0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
1d7d0 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
1d7e0 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
1d7f0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1d800 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d810 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1d820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d830 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1d840 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1d850 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61  earchList && nea
1d860 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20  rby==iTrunk ){. 
1d870 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
1d880 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
1d890 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
1d8a0 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
1d8b0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
1d8c0 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
1d8d0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
1d8e0 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
1d8f0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1d900 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
1d910 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20  gno==iTrunk );. 
1d920 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
1d930 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
1d940 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1d950 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
1d960 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
1d970 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
1d980 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1d990 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
1d9a0 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
1d9b0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1d9c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1d9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1d9e0 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
1d9f0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
1da00 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1da10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1da20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1da30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
1da40 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
1da50 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
1da60 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
1da70 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
1da80 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
1da90 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
1daa0 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
1dab0 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
1dac0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
1dad0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
1dae0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1daf0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
1db00 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
1db10 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
1db20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
1db30 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
1db40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1db50 67 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65  getPage(pBt, iNe
1db60 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
1db70 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
1db80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1db90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dba0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
1dbb0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
1dbc0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
1dbd0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
1dbe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1dbf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1dc00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1dc10 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
1dc20 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 29  NewTrunk->aData)
1dc30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1dc40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1dc50 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
1dc60 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
1dc70 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
1dc80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
1dc90 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1dca0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1dcb0 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
1dcc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1dcd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1dce0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1dcf0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
1dd00 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
1dd10 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
1dd20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1dd30 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
1dd40 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
1dd50 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
1dd60 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
1dd70 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1dd80 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
1dd90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
1dda0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
1ddb0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1ddc0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1ddd0 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  [32], iNewTrunk)
1dde0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1ddf0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
1de00 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
1de10 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
1de20 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1de30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1de40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
1de50 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1de60 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
1de70 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
1de80 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1de90 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
1dea0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
1deb0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
1dec0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
1ded0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1dee0 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
1def0 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
1df00 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c  /.        int cl
1df10 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
1df20 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
1df30 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
1df40 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
1df50 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
1df60 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b   if( nearby>0 ){
1df70 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1df80 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  , dist;.        
1df90 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
1dfa0 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
1dfb0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
1dfc0 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  8]) - nearby;.  
1dfd0 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73 74          if( dist
1dfe0 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73  <0 ) dist = -dis
1dff0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  t;.          for
1e000 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=1; i<k; i++){
1e010 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1e020 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28 26   d2 = get4byte(&
1e030 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
1e040 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20  nearby;.        
1e050 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20 64      if( d2<0 ) d
1e060 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20  2 = -d2;.       
1e070 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
1e080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e090 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
1e0b0 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20  t = d2;.        
1e0c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e0d0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1e0e0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
1e0f0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1e100 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65  }..        iPage
1e110 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
1e120 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29  ta[8+closest*4])
1e130 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
1e140 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61  earchList || iPa
1e150 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20  ge==nearby ){.  
1e160 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
1e170 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
1e180 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 73 71 6c    if( *pPgno>sql
1e190 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
1e1a0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
1e1b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e1c0 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66 66  /* Free page off
1e1d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1e1e0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
1e1f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e200 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e210 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e220 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1e230 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
1e240 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
1e250 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
1e260 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
1e270 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
1e280 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e290 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
1e2a0 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
1e2b0 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
1e2c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
1e2d0 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
1e2e0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1e2f0 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
1e300 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
1e310 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
1e320 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1e330 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
1e340 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
1e350 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
1e360 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
1e370 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1e380 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e390 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1e3a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
1e3b0 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 28 2a 70 70  nt_rollback((*pp
1e3c0 50 61 67 65 29 2d 3e 61 44 61 74 61 29 3b 0a 20  Page)->aData);. 
1e3d0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1e3e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1e3f0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 61 44  te((*ppPage)->aD
1e400 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ata);.          
1e410 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e420 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e430 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e440 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
1e450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e460 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
1e470 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
1e480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e490 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1e4a0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
1e4b0 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
1e4c0 63 68 4c 69 73 74 20 29 3b 0a 20 20 20 20 72 65  chList );.    re
1e4d0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
1e4e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e4f0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
1e500 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1e510 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65  elist, so create
1e520 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74   a new page at t
1e530 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66  he.    ** end of
1e540 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
1e550 20 2a 70 50 67 6e 6f 20 3d 20 73 71 6c 69 74 65   *pPgno = sqlite
1e560 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
1e570 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 2b 20  (pBt->pPager) + 
1e580 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  1;..#ifndef SQLI
1e590 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1e5a0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
1e5b0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
1e5c0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1e5d0 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20   *pPgno) ){.    
1e5e0 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
1e5f0 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
1e600 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
1e610 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
1e620 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
1e630 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
1e640 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
1e650 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
1e660 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
1e670 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
1e680 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
1e690 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
1e6a0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
1e6b0 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
1e6c0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
1e6d0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
1e6e0 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
1e6f0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
1e700 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
1e710 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1e720 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
1e730 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
1e740 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a      (*pPgno)++;.
1e750 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1e760 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
1e770 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
1e780 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
1e790 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
1e7a0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
1e7b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1e7c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
1e7d0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1e7e0 5f 77 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  _write((*ppPage)
1e7f0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
1e800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e810 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1e820 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
1e830 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
1e840 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
1e850 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
1e860 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
1e870 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
1e880 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
1e890 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
1e8a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e8b0 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f  .** Add a page o
1e8c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1e8d0 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ile to the freel
1e8e0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ist..**.** sqlit
1e8f0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20  e3pager_unref() 
1e900 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f  is NOT called fo
1e910 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
1e920 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28  ic int freePage(
1e930 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
1e940 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1e950 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1e960 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1e970 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1e980 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a    int rc, n, k;.
1e990 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68  .  /* Prepare th
1e9a0 65 20 70 61 67 65 20 66 6f 72 20 66 72 65 65 69  e page for freei
1e9b0 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ng */.  assert( 
1e9c0 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b  pPage->pgno>1 );
1e9d0 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
1e9e0 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50   = 0;.  releaseP
1e9f0 61 67 65 28 70 50 61 67 65 2d 3e 70 50 61 72 65  age(pPage->pPare
1ea00 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50  nt);.  pPage->pP
1ea10 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  arent = 0;..  /*
1ea20 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
1ea30 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
1ea40 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
1ea50 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1ea60 77 72 69 74 65 28 70 50 61 67 65 31 2d 3e 61 44  write(pPage1->aD
1ea70 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ata);.  if( rc )
1ea80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20   return rc;.  n 
1ea90 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1eaa0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1eab0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1eac0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
1ead0 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  +1);..#ifdef SQL
1eae0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
1eaf0 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51  E.  /* If the SQ
1eb00 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
1eb10 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TE compile-time 
1eb20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
1eb30 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77  d, then.  ** alw
1eb40 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
1eb50 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
1eb60 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
1eb70 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  os..  */.  rc = 
1eb80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1eb90 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
1eba0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1ebb0 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74  urn rc;.  memset
1ebc0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
1ebd0 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
1ebe0 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  geSize);.#endif.
1ebf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ec00 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1ec10 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
1ec20 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
1ec30 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
1ec40 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
1ec50 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
1ec60 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
1ec70 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
1ec80 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
1ec90 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1eca0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  ){.    rc = ptrm
1ecb0 61 70 50 75 74 28 70 42 74 2c 20 70 50 61 67 65  apPut(pBt, pPage
1ecc0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46  ->pgno, PTRMAP_F
1ecd0 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  REEPAGE, 0);.   
1ece0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1ecf0 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1ed00 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20  .  if( n==0 ){. 
1ed10 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
1ed20 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
1ed30 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
1ed40 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1ed50 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
1ed60 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1ed70 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73  urn rc;.    mems
1ed80 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
1ed90 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34   0, 8);.    put4
1eda0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1edb0 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e  ata[32], pPage->
1edc0 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45  pgno);.    TRACE
1edd0 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
1ede0 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65   first\n", pPage
1edf0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73  ->pgno));.  }els
1ee00 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20  e{.    /* Other 
1ee10 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65 61  free pages alrea
1ee20 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72 69  dy exist.  Retri
1ee30 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72 75  ve the first tru
1ee40 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f  nk page.    ** o
1ee50 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
1ee60 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20  nd find out how 
1ee70 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68  many leaves it h
1ee80 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  as. */.    MemPa
1ee90 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20  ge *pTrunk;.    
1eea0 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
1eeb0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
1eec0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20  e1->aData[32]), 
1eed0 26 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 69 66  &pTrunk);.    if
1eee0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1eef0 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79  ;.    k = get4by
1ef00 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1ef10 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b  a[4]);.    if( k
1ef20 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  >=pBt->usableSiz
1ef30 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
1ef40 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73   /* The trunk is
1ef50 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65   full.  Turn the
1ef60 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
1ef70 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20  d into a new.   
1ef80 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65     ** trunk page
1ef90 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e   with no leaves.
1efa0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1efb0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1efc0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
1efd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
1efe0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1eff0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
1f000 3e 61 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e  >aData, pTrunk->
1f010 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 75 74  pgno);.      put
1f020 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1f030 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  ata[4], 0);.    
1f040 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1f050 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70  e1->aData[32], p
1f060 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
1f070 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
1f080 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
1f090 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
1f0a0 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  g %d\n",.       
1f0b0 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67         pPage->pg
1f0c0 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  no, pTrunk->pgno
1f0d0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
1f0e0 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1f0f0 6e 65 77 6c 79 20 66 72 65 65 64 20 70 61 67 65  newly freed page
1f100 20 61 73 20 61 20 6c 65 61 66 20 6f 6e 20 74 68   as a leaf on th
1f110 65 20 63 75 72 72 65 6e 74 20 74 72 75 6e 6b 20  e current trunk 
1f120 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1f130 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1f140 28 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 29 3b  (pTrunk->aData);
1f150 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
1f160 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1f170 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
1f180 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31  k->aData[4], k+1
1f190 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1f1a0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1f1b0 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e  [8+k*4], pPage->
1f1c0 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53  pgno);.#ifndef S
1f1d0 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
1f1e0 45 54 45 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ETE.      sqlite
1f1f0 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74  3pager_dont_writ
1f200 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
1f210 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 65 6e  Page->pgno);.#en
1f220 64 69 66 0a 20 20 20 20 20 20 54 52 41 43 45 28  dif.      TRACE(
1f230 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
1f240 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
1f250 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
1f260 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
1f270 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  o));.    }.    r
1f280 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
1f290 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  k);.  }.  return
1f2a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   rc;.}../*.** Fr
1f2b0 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
1f2c0 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
1f2d0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
1f2e0 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
1f2f0 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
1f300 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
1f310 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
1f320 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
1f330 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1f340 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
1f350 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
1f360 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  gno;.  int rc;..
1f370 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70    parseCellPtr(p
1f380 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
1f390 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
1f3a0 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a  iOverflow==0 ){.
1f3b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f3c0 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65  E_OK;  /* No ove
1f3d0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74  rflow pages. Ret
1f3e0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
1f3f0 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
1f400 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
1f410 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
1f420 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
1f430 0a 20 20 77 68 69 6c 65 28 20 6f 76 66 6c 50 67  .  while( ovflPg
1f440 6e 6f 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d  no!=0 ){.    Mem
1f450 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  Page *pOvfl;.   
1f460 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3e 73 71   if( ovflPgno>sq
1f470 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
1f480 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1f490 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1f4a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1f4b0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
1f4c0 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
1f4d0 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
1f4e0 76 66 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  vfl);.    if( rc
1f4f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f500 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
1f510 34 62 79 74 65 28 70 4f 76 66 6c 2d 3e 61 44 61  4byte(pOvfl->aDa
1f520 74 61 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 72  ta);.    rc = fr
1f530 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  eePage(pOvfl);. 
1f540 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
1f550 75 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 61 44 61  unref(pOvfl->aDa
1f560 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ta);.    if( rc 
1f570 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
1f580 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f590 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
1f5a0 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
1f5b0 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
1f5c0 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
1f5d0 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
1f5e0 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
1f5f0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
1f600 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
1f610 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
1f620 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
1f630 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
1f640 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
1f650 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
1f660 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
1f670 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
1f680 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
1f690 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
1f6a0 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
1f6b0 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
1f6c0 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
1f6d0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
1f6e0 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
1f6f0 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
1f700 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
1f710 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
1f720 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
1f730 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
1f740 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
1f750 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
1f760 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
1f770 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
1f780 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
1f790 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
1f7a0 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
1f7b0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
1f7c0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
1f7d0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
1f7e0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1f7f0 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
1f800 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
1f810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
1f820 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
1f830 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
1f840 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
1f850 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
1f860 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
1f870 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
1f880 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
1f890 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a   data */.  int *
1f8a0 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
1f8b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1f8c0 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
1f8d0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
1f8e0 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
1f8f0 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
1f900 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
1f910 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
1f920 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
1f930 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1f940 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
1f950 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1f960 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
1f970 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
1f980 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
1f990 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1f9a0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
1f9b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
1f9c0 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  der;.  CellInfo 
1f9d0 69 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  info;..  /* Fill
1f9e0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
1f9f0 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
1fa00 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
1fa10 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
1fa20 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
1fa30 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
1fa40 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
1fa50 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
1fa60 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
1fa70 6e 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 7b  nData);.  }else{
1fa80 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a  .    nData = 0;.
1fa90 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
1faa0 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
1fab0 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
1fac0 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 70 61 72  4*)&nKey);.  par
1fad0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
1fae0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1faf0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
1fb00 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
1fb10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
1fb20 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
1fb30 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
1fb40 44 61 74 61 3d 3d 6e 44 61 74 61 20 29 3b 0a 20  Data==nData );. 
1fb50 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
1fb60 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  he payload */.  
1fb70 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
1fb80 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
1fb90 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
1fba0 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
1fbb0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
1fbc0 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
1fbd0 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  lse{.    nPayloa
1fbe0 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70  d += nKey;.    p
1fbf0 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
1fc00 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d  nSrc = nKey;.  }
1fc10 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
1fc20 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
1fc30 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
1fc40 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
1fc50 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
1fc60 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
1fc70 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
1fc80 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
1fc90 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
1fca0 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
1fcb0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
1fcc0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1fcd0 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
1fce0 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
1fcf0 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
1fd00 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
1fd10 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
1fd20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
1fd30 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28   = allocatePage(
1fd40 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
1fd50 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
1fd60 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
1fd70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1fd80 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
1fd90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
1fda0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
1fdb0 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
1fdc0 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
1fdd0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
1fde0 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
1fdf0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
1fe00 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
1fe10 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
1fe20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
1fe30 67 65 20 6e 6f 77 2e 20 54 68 65 20 65 6e 74 72  ge now. The entr
1fe40 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
1fe50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 77 69  overflow page wi
1fe60 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61  ll be.      ** a
1fe70 64 64 65 64 20 6c 61 74 65 72 2c 20 62 79 20 74  dded later, by t
1fe80 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20  he insertCell() 
1fe90 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 20 20 2a  routine..      *
1fea0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
1feb0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 70  >autoVacuum && p
1fec0 67 6e 6f 50 74 72 6d 61 70 21 3d 30 20 26 26 20  gnoPtrmap!=0 && 
1fed0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1fee0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
1fef0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
1ff00 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  oOvfl, PTRMAP_OV
1ff10 45 52 46 4c 4f 57 32 2c 20 70 67 6e 6f 50 74 72  ERFLOW2, pgnoPtr
1ff20 6d 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  map);.      }.#e
1ff30 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
1ff40 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  c ){.        rel
1ff50 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
1ff60 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ase);.        /*
1ff70 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
1ff80 2c 20 70 43 65 6c 6c 29 3b 20 2a 2f 0a 20 20 20  , pCell); */.   
1ff90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ffa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
1ffb0 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
1ffc0 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
1ffd0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
1ffe0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
1fff0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
20000 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
20010 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
20020 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
20030 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
20040 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
20050 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
20060 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
20070 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
20080 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
20090 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
200a0 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
200b0 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
200c0 3b 0a 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63  ;.    if( n>nSrc
200d0 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
200e0 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
200f0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
20100 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
20110 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
20120 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
20130 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
20140 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
20150 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
20160 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
20170 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSrc==0 ){.     
20180 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
20190 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74       pSrc = pDat
201a0 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
201b0 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
201c0 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
201d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
201e0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
201f0 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20  MemPage.pParent 
20200 70 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70  pointer on the p
20210 61 67 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72  age whose number
20220 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20   is.** given in 
20230 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
20240 65 6e 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50  ent so that MemP
20250 61 67 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64  age.pParent hold
20260 73 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72  s the.** pointer
20270 20 69 6e 20 74 68 65 20 74 68 69 72 64 20 61 72   in the third ar
20280 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
20290 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 50 61  c int reparentPa
202a0 67 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ge(BtShared *pBt
202b0 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d  , Pgno pgno, Mem
202c0 50 61 67 65 20 2a 70 4e 65 77 50 61 72 65 6e 74  Page *pNewParent
202d0 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65  , int idx){.  Me
202e0 6d 50 61 67 65 20 2a 70 54 68 69 73 3b 0a 20 20  mPage *pThis;.  
202f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
20300 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  Data;..  assert(
20310 20 70 4e 65 77 50 61 72 65 6e 74 21 3d 30 20 29   pNewParent!=0 )
20320 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ;.  if( pgno==0 
20330 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20340 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  OK;.  assert( pB
20350 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
20360 20 20 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65    aData = sqlite
20370 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 42  3pager_lookup(pB
20380 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
20390 3b 0a 20 20 69 66 28 20 61 44 61 74 61 20 29 7b  ;.  if( aData ){
203a0 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d 65  .    pThis = (Me
203b0 6d 50 61 67 65 2a 29 26 61 44 61 74 61 5b 70 42  mPage*)&aData[pB
203c0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
203d0 20 20 61 73 73 65 72 74 28 20 70 54 68 69 73 2d    assert( pThis-
203e0 3e 61 44 61 74 61 3d 3d 61 44 61 74 61 20 29 3b  >aData==aData );
203f0 0a 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e  .    if( pThis->
20400 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20  isInit ){.      
20410 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65  if( pThis->pPare
20420 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20 29  nt!=pNewParent )
20430 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
20440 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20 73  his->pParent ) s
20450 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
20460 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74  f(pThis->pParent
20470 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
20480 20 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74    pThis->pParent
20490 20 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20   = pNewParent;. 
204a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
204b0 67 65 72 5f 72 65 66 28 70 4e 65 77 50 61 72 65  ger_ref(pNewPare
204c0 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  nt->aData);.    
204d0 20 20 7d 0a 20 20 20 20 20 20 70 54 68 69 73 2d    }.      pThis-
204e0 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 69 64 78  >idxParent = idx
204f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
20500 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 61  te3pager_unref(a
20510 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  Data);.  }..#ifn
20520 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20530 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
20540 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
20550 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
20560 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
20570 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
20580 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67  , pNewParent->pg
20590 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  no);.  }.#endif.
205a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
205b0 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43  OK;.}..../*.** C
205c0 68 61 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e  hange the pParen
205d0 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c  t pointer of all
205e0 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
205f0 67 65 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b  ge to point back
20600 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a  .** to pPage..**
20610 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
20620 64 73 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68  ds, for every ch
20630 69 6c 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e  ild of pPage, in
20640 76 6f 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67  voke reparentPag
20650 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73  e().** to make s
20660 75 72 65 20 74 68 61 74 20 65 61 63 68 20 63 68  ure that each ch
20670 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70  ild knows that p
20680 50 61 67 65 20 69 73 20 69 74 73 20 70 61 72 65  Page is its pare
20690 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
206a0 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
206b0 65 64 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d  ed after you mem
206c0 63 70 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69  cpy() one page i
206d0 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a  nto.** another..
206e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
206f0 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
20700 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
20710 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 53  {.  int i;.  BtS
20720 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
20730 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72  ge->pBt;.  int r
20740 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
20750 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
20760 66 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f ) return SQLIT
20770 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  E_OK;..  for(i=0
20780 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
20790 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
207a0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
207b0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
207c0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
207d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
207e0 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c  eparentPage(pBt,
207f0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
20800 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  , pPage, i);.   
20810 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20820 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
20830 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
20840 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
20850 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72  {.    rc = repar
20860 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74  entPage(pBt, get
20870 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
20880 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
20890 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20  fset+8]), .     
208a0 20 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20    pPage, i);.   
208b0 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
208c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
208d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
208e0 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
208f0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
20900 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
20910 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
20920 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
20930 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
20940 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
20950 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
20960 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
20970 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
20980 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
20990 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
209a0 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
209b0 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
209c0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
209d0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
209e0 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
209f0 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
20a00 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
20a10 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
20a20 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
20a30 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
20a40 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20  idx, int sz){.  
20a50 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
20a60 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
20a70 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
20a80 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
20a90 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
20aa0 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
20ab0 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
20ac0 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
20ad0 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
20ae0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
20af0 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
20b00 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
20b10 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20  in data[] */..  
20b20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
20b30 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
20b40 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
20b50 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
20b60 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
20b70 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67  sert( sqlite3pag
20b80 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70  er_iswriteable(p
20b90 50 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a  Page->aData) );.
20ba0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
20bb0 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
20bc0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
20bd0 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b  Offset + 2*idx];
20be0 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
20bf0 28 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28  (ptr);.  assert(
20c00 20 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c   pc>10 && pc+sz<
20c10 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
20c20 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65  bleSize );.  fre
20c30 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
20c40 2c 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69  , sz);.  for(i=i
20c50 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  dx+1; i<pPage->n
20c60 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d  Cell; i++, ptr+=
20c70 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d  2){.    ptr[0] =
20c80 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72   ptr[2];.    ptr
20c90 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20  [1] = ptr[3];.  
20ca0 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
20cb0 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  --;.  put2byte(&
20cc0 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
20cd0 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d  ffset+3], pPage-
20ce0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  >nCell);.  pPage
20cf0 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
20d00 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
20d10 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 1;.}../*.** In
20d20 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
20d30 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
20d40 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
20d50 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
20d60 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
20d70 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
20d80 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
20d90 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
20da0 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
20db0 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
20dc0 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
20dd0 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
20de0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
20df0 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
20e00 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
20e10 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
20e20 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
20e30 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
20e40 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
20e50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64  age->aOvfl[] and
20e60 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
20e70 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
20e80 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
20e90 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
20ea0 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
20eb0 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
20ec0 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
20ed0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
20ee0 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
20ef0 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
20f00 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
20f10 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
20f20 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mented..**.** If
20f30 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
20f40 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ro, then do not 
20f50 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e  copy the first n
20f60 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
20f70 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63  e.** cell. The c
20f80 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77  aller will overw
20f90 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20  rite them after 
20fa0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
20fb0 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b  turns. If.** nSk
20fc0 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
20fd0 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e  then pCell may n
20fe0 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69  ot point to an i
20ff0 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f  nvalid memory lo
21000 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20  cation .** (but 
21010 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61  pCell+nSkip is a
21020 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f  lways valid)..*/
21030 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65  .static int inse
21040 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
21050 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
21060 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
21070 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
21080 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
21090 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
210a0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
210b0 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
210c0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
210d0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
210e0 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
210f0 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
21100 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
21110 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
21120 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
21130 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
21140 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
21150 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
21160 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
21170 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20  u8 nSkip        
21180 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74    /* Do not writ
21190 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  e the first nSki
211a0 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  p bytes of the c
211b0 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ell */.){.  int 
211c0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  idx;          /*
211d0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
211e0 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
211f0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
21200 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
21210 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
21220 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  r */.  int top; 
21230 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
21240 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e  t byte of conten
21250 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69  t for any cell i
21260 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
21270 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20  t end;          
21280 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
21290 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  st the last cell
212a0 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
212b0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b  [] */.  int ins;
212c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
212d0 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65  ex in data[] whe
212e0 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e  re new cell poin
212f0 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20  ter is inserted 
21300 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
21310 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
21320 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20   into data[] of 
21330 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
21340 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
21350 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  set;   /* Addres
21360 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  s of first cell 
21370 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
21380 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  ] */.  u8 *data;
21390 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
213a0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
213b0 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
213c0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20  8 *ptr;         
213d0 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76   /* Used for mov
213e0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
213f0 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d  around in data[]
21400 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
21410 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
21420 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
21430 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
21440 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
21450 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
21460 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
21470 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77  sqlite3pager_isw
21480 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
21490 61 44 61 74 61 29 20 29 3b 0a 20 20 69 66 28 20  aData) );.  if( 
214a0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
214b0 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
214c0 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
214d0 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
214e0 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b  memcpy(pTemp+nSk
214f0 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  ip, pCell+nSkip,
21500 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
21510 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
21520 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
21530 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
21540 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
21550 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  <sizeof(pPage->a
21560 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
21570 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b  ge->aOvfl[0]) );
21580 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
21590 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65  l[j].pCell = pCe
215a0 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
215b0 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b  Ovfl[j].idx = i;
215c0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
215d0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
215e0 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
215f0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72  ->aData;.    hdr
21600 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
21610 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  set;.    top = g
21620 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
21630 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f  r+5]);.    cellO
21640 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
21650 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
21660 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
21670 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
21680 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20   + 2;.    ins = 
21690 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
216a0 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20  ;.    if( end > 
216b0 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20  top - sz ){.    
216c0 20 20 69 6e 74 20 72 63 20 3d 20 64 65 66 72 61    int rc = defra
216d0 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
216e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
216f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
21700 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 74 6f 70  rn rc;.      top
21710 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
21720 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
21730 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73   assert( end + s
21740 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20  z <= top );.    
21750 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f  }.    idx = allo
21760 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
21770 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74   sz);.    assert
21780 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61  ( idx>0 );.    a
21790 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65  ssert( end <= ge
217a0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
217b0 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67  +5]) );.    pPag
217c0 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
217d0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
217e0 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  2;.    memcpy(&d
217f0 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20  ata[idx+nSkip], 
21800 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
21810 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28  nSkip);.    for(
21820 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61  j=end-2, ptr=&da
21830 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d  ta[j]; j>ins; j-
21840 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20  =2, ptr-=2){.   
21850 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
21860 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31  -2];.      ptr[1
21870 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20  ] = ptr[-1];.   
21880 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28   }.    put2byte(
21890 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29  &data[ins], idx)
218a0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
218b0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
218c0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20  ge->nCell);.    
218d0 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
218e0 3d 20 31 3b 0a 20 20 20 20 70 61 67 65 49 6e 74  = 1;.    pageInt
218f0 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 23  egrity(pPage);.#
21900 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21910 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
21920 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
21930 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
21940 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
21950 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
21960 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
21970 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
21980 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
21990 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
219a0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
219b0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
219c0 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
219d0 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  /.      CellInfo
219e0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 70 61 72   info;.      par
219f0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
21a00 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
21a10 20 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e        if( (info.
21a20 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
21a30 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
21a40 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  ))>info.nLocal )
21a50 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70  {.        Pgno p
21a60 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  gnoOvfl = get4by
21a70 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
21a80 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20  Overflow]);.    
21a90 20 20 20 20 69 6e 74 20 72 63 20 3d 20 70 74 72      int rc = ptr
21aa0 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
21ab0 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52  t, pgnoOvfl, PTR
21ac0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
21ad0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
21ae0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21af0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
21b00 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
21b10 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
21b20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
21b40 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74   list of cells t
21b50 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70  o a page.  The p
21b60 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  age should be in
21b70 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a  itially empty..*
21b80 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20  * The cells are 
21b90 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
21ba0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
21bb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
21bc0 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65  semblePage(.  Me
21bd0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
21be0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
21bf0 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a  e assemblied */.
21c00 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
21c10 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
21c20 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
21c30 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a  d to this page *
21c40 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
21c50 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
21c60 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73  s to cell bodies
21c70 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 53 69 7a 65   */.  int *aSize
21c80 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
21c90 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f   of the cells */
21ca0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
21cb0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
21cc0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
21cd0 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f   totalSize;    /
21ce0 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
21cf0 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69  all cells */.  i
21d00 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
21d10 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67   /* Index of pag
21d20 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
21d30 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20  t cellptr;      
21d40 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
21d50 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
21d60 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
21d70 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
21d80 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
21d90 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ody */.  u8 *dat
21da0 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  a;         /* Da
21db0 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ta for the page 
21dc0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
21dd0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
21de0 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65  0 );.  totalSize
21df0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
21e00 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
21e10 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d      totalSize +=
21e20 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20   aSize[i];.  }. 
21e30 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69   assert( totalSi
21e40 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67  ze+2*nCell<=pPag
21e50 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73  e->nFree );.  as
21e60 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
21e70 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70  ll==0 );.  cellp
21e80 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  tr = pPage->cell
21e90 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d  Offset;.  data =
21ea0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
21eb0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
21ec0 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62  rOffset;.  put2b
21ed0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
21ee0 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20  , nCell);.  if( 
21ef0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c  nCell ){.    cel
21f00 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65  lbody = allocate
21f10 53 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74  Space(pPage, tot
21f20 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73  alSize);.    ass
21f30 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20  ert( cellbody>0 
21f40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21f50 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32  Page->nFree >= 2
21f60 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50  *nCell );.    pP
21f70 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a  age->nFree -= 2*
21f80 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69  nCell;.    for(i
21f90 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
21fa0 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  ){.      put2byt
21fb0 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d  e(&data[cellptr]
21fc0 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20  , cellbody);.   
21fd0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
21fe0 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
21ff0 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b  l[i], aSize[i]);
22000 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b  .      cellptr +
22010 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62  = 2;.      cellb
22020 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ody += aSize[i];
22030 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
22040 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61  t( cellbody==pPa
22050 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
22060 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61  ize );.  }.  pPa
22070 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c  ge->nCell = nCel
22080 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
22090 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
220a0 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
220b0 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
220c0 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
220d0 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
220e0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
220f0 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
22100 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
22110 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
22120 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
22130 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
22140 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
22150 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
22160 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
22170 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
22180 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
22190 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
221a0 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
221b0 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
221c0 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
221d0 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
221e0 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
221f0 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
22200 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
22210 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
22220 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
22230 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
22240 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
22250 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
22260 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
22270 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
22280 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
22290 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
222a0 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
222b0 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
222c0 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
222d0 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
222e0 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
222f0 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
22300 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22310 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
22320 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
22330 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
22340 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
22350 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
22360 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
22370 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  lance */../* For
22380 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
22390 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
223a0 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69  ance(MemPage*, i
223b0 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nt);..#ifndef SQ
223c0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
223d0 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  ALANCE./*.** Thi
223e0 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c  s version of bal
223f0 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74  ance() handles t
22400 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61  he common specia
22410 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  l case where.** 
22420 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62  a new entry is b
22430 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e  eing inserted on
22440 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
22450 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  ht-end of the.**
22460 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20   tree, in other 
22470 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20  words, when the 
22480 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  new entry will b
22490 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73  ecome the larges
224a0 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68  t.** entry in th
224b0 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  e tree..**.** In
224c0 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20  stead of trying 
224d0 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
224e0 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
224f0 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
22500 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
22510 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
22520 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
22530 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
22540 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
22550 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
22560 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
22570 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
22580 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
22590 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
225a0 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
225b0 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
225c0 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
225d0 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
225e0 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
225f0 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
22600 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
22610 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
22620 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
22630 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
22640 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
22650 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
22660 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
22670 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
22680 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
22690 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
226a0 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
226b0 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
226c0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
226d0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
226e0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
226f0 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
22700 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20  *pPage, MemPage 
22710 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74  *pParent){.  int
22720 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
22730 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  pNew;.  Pgno pgn
22740 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c  oNew;.  u8 *pCel
22750 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 65 6c 6c 3b  l;.  int szCell;
22760 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
22770 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
22780 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
22790 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20    int parentIdx 
227a0 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  = pParent->nCell
227b0 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e  ;   /* pParent n
227c0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
227d0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70  index */.  int p
227e0 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  arentSize;      
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22800 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69  Size of new divi
22810 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  der cell */.  u8
22820 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b   parentCell[64];
22830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22840 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65  /* Space for the
22850 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
22860 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  l */..  /* Alloc
22870 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
22880 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66  Insert the overf
22890 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  low cell from pP
228a0 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74  age.  ** into it
228b0 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  . Then remove th
228c0 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
228d0 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f  from pPage..  */
228e0 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
228f0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
22900 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
22910 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
22920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
22930 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
22940 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76  ell = pPage->aOv
22950 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73  fl[0].pCell;.  s
22960 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
22970 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
22980 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  );.  zeroPage(pN
22990 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ew, pPage->aData
229a0 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65  [0]);.  assemble
229b0 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
229c0 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
229d0 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
229e0 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65  ow = 0;..  /* Se
229f0 74 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  t the parent of 
22a00 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
22a10 74 65 64 20 70 61 67 65 20 74 6f 20 70 50 61 72  ted page to pPar
22a20 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  ent. */.  pNew->
22a30 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e  pParent = pParen
22a40 74 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  t;.  sqlite3page
22a50 72 5f 72 65 66 28 70 50 61 72 65 6e 74 2d 3e 61  r_ref(pParent->a
22a60 44 61 74 61 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  Data);..  /* pPa
22a70 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
22a80 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
22a90 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e  of pParent. Chan
22aa0 67 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20  ge this.  ** so 
22ab0 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 63  that the right-c
22ac0 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20  hild is the new 
22ad0 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  page allocated a
22ae0 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50  bove and.  ** pP
22af0 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d  age is the next-
22b00 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20  to-right child. 
22b10 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
22b20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
22b30 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72  ;.  parseCellPtr
22b40 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
22b50 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
22b60 43 65 6c 6c 2d 31 29 2c 20 26 69 6e 66 6f 29 3b  Cell-1), &info);
22b70 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65  .  rc = fillInCe
22b80 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65  ll(pParent, pare
22b90 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e  ntCell, 0, info.
22ba0 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 26 70 61 72  nKey, 0, 0, &par
22bb0 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  entSize);.  if( 
22bc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22bd0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
22be0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 61    }.  assert( pa
22bf0 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20  rentSize<64 );. 
22c00 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
22c10 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
22c20 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c  Idx, parentCell,
22c30 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20   parentSize, 0, 
22c40 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
22c50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
22c60 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
22c70 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
22c80 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
22c90 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50  t,parentIdx), pP
22ca0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75  age->pgno);.  pu
22cb0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
22cc0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
22cd0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
22ce0 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66  noNew);..#ifndef
22cf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
22d00 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20  OVACUUM.  /* If 
22d10 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
22d20 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
22d30 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
22d40 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74  ter map.  ** wit
22d50 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
22d60 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
22d70 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
22d80 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20   the .  ** cell 
22d90 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
22da0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
22db0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
22dc0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
22dd0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
22de0 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
22df0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
22e00 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
22e10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22e20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
22e30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
22e40 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
22e50 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20  Ovfl(pNew, 0);. 
22e60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22e70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
22e80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
22e90 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
22ea0 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
22eb0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
22ec0 20 70 61 67 65 20 61 6e 64 20 62 61 6c 61 6e 63   page and balanc
22ed0 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
22ee0 65 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  e,.  ** in case 
22ef0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
22f00 20 69 6e 73 65 72 74 65 64 20 63 61 75 73 65 64   inserted caused
22f10 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76   it to become ov
22f20 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72  erfull..  */.  r
22f30 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
22f40 3b 0a 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e  ;.  return balan
22f50 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a  ce(pParent, 0);.
22f60 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
22f70 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
22f80 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ANCE */../*.** T
22f90 68 65 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  he ISAUTOVACUUM 
22fa0 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 77 69  macro is used wi
22fb0 74 68 69 6e 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  thin balance_non
22fc0 72 6f 6f 74 28 29 20 74 6f 20 64 65 74 65 72 6d  root() to determ
22fd0 69 6e 65 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  ine.** if the da
22fe0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
22ff0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 72 20 6e  auto-vacuum or n
23000 6f 74 2e 20 42 65 63 61 75 73 65 20 69 74 20 69  ot. Because it i
23010 73 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 69 6e  s used.** within
23020 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
23030 68 61 74 20 69 73 20 61 6e 20 61 72 67 75 6d 65  hat is an argume
23040 6e 74 20 74 6f 20 61 6e 6f 74 68 65 72 20 6d 61  nt to another ma
23050 63 72 6f 20 0a 2a 2a 20 28 73 71 6c 69 74 65 4d  cro .** (sqliteM
23060 61 6c 6c 6f 63 52 61 77 29 2c 20 69 74 20 69 73  allocRaw), it is
23070 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
23080 20 75 73 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   use conditional
23090 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2a   compilation..**
230a0 20 53 6f 2c 20 74 68 69 73 20 6d 61 63 72 6f 20   So, this macro 
230b0 69 73 20 64 65 66 69 6e 65 64 20 69 6e 73 74 65  is defined inste
230c0 61 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ad..*/.#ifndef S
230d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
230e0 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20 49 53  ACUUM.#define IS
230f0 41 55 54 4f 56 41 43 55 55 4d 20 28 70 42 74 2d  AUTOVACUUM (pBt-
23100 3e 61 75 74 6f 56 61 63 75 75 6d 29 0a 23 65 6c  >autoVacuum).#el
23110 73 65 0a 23 64 65 66 69 6e 65 20 49 53 41 55 54  se.#define ISAUT
23120 4f 56 41 43 55 55 4d 20 30 0a 23 65 6e 64 69 66  OVACUUM 0.#endif
23130 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
23140 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74  tine redistribut
23150 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67  es Cells on pPag
23160 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32  e and up to NN*2
23170 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20   siblings.** of 
23180 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c  pPage so that al
23190 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
231a0 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75  ut the same amou
231b0 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
231c0 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20  ..** Usually NN 
231d0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68  siblings on eith
231e0 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
231f0 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65 20   is used in the 
23200 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68  balancing,.** th
23210 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e  ough more siblin
23220 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72  gs might come fr
23230 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70  om one side if p
23240 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73  Page is the firs
23250 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69  t.** or last chi
23260 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74  ld of its parent
23270 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73 20  .  If pPage has 
23280 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20  fewer than 2*NN 
23290 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d  siblings.** (som
232a0 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e  ething which can
232b0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
232c0 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f  pPage is the roo
232d0 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20  t page or a .** 
232e0 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74  child of root) t
232f0 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
23300 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69  e siblings parti
23310 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
23320 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
23330 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
23340 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d  lings of pPage m
23350 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65  ight be increase
23360 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  d or decreased b
23370 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20  y one or.** two 
23380 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  in an effort to 
23390 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c  keep pages nearl
233a0 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f  y full but not o
233b0 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f  ver full. The ro
233c0 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70  ot page.** is sp
233d0 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c  ecial and is all
233e0 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c  owed to be nearl
233f0 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67  y empty. If pPag
23400 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f  e is .** the roo
23410 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
23420 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72   depth of the tr
23430 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ee might be incr
23440 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72  eased.** or decr
23450 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73  eased by one, as
23460 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b   necessary, to k
23470 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67  eep the root pag
23480 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20  e from being.** 
23490 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70  overfull or comp
234a0 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  letely empty..**
234b0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
234c0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
234d0 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
234e0 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20  of the Cells on 
234f0 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e  pPage.** might n
23500 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ot actually be s
23510 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e  tored in pPage->
23520 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63  aData[].  This c
23530 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20  an happen.** if 
23540 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72  the page is over
23550 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74  full.  Part of t
23560 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
23570 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20  outine is to.** 
23580 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65  make sure all Ce
23590 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e  lls for pPage on
235a0 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20  ce again fit in 
235b0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a  pPage->aData[]..
235c0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75  **.** In the cou
235d0 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67  rse of balancing
235e0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66   the siblings of
235f0 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72 65   pPage, the pare
23600 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d  nt of pPage.** m
23610 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72  ight become over
23620 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c  full or underful
23630 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70 70  l.  If that happ
23640 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ens, then this r
23650 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
23660 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
23670 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a  on the parent..*
23680 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
23690 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61  tine fails for a
236a0 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69  ny reason, it mi
236b0 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61  ght leave the da
236c0 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63  tabase.** in a c
236d0 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20  orrupted state. 
236e0 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
236f0 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
23700 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
23710 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
23720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23730 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
23740 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
23750 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
23760 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
23770 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66  /* The parent of
23780 20 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68   pPage */.  BtSh
23790 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
237a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
237b0 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
237c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
237d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
237e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
237f0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
23800 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
23810 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
23820 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
23830 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
23840 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
23850 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
23860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23870 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23880 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
23890 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20   */.  int nNew; 
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
238c0 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
238d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20   */.  int nDiv; 
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23900 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d  cells in apDiv[]
23910 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
23920 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
23930 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
23940 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ers */.  int idx
23950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23960 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
23970 66 20 70 50 61 67 65 20 69 6e 20 70 50 61 72 65  f pPage in pPare
23980 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
23990 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20   int nxDiv;     
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
239b0 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c   Next divider sl
239c0 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ot in pParent->a
239d0 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
239e0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
239f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23a00 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
23a10 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74   int leafCorrect
23a20 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ion;          /*
23a30 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
23a40 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74   leaf.  0 if not
23a50 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61   */.  int leafDa
23a60 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
23a70 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
23a80 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66  age is a leaf of
23a90 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65   a LEAFDATA tree
23aa0 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
23ab0 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
23ac0 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70     /* Bytes in p
23ad0 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20  Page beyond the 
23ae0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
23af0 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20  pageFlags;      
23b00 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
23b10 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
23b20 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75  a[0] */.  int su
23b30 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20  btotal;         
23b40 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74         /* Subtot
23b50 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  al of bytes in c
23b60 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65  ells on one page
23b70 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65   */.  int iSpace
23b80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23b90 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
23ba0 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63  ed byte of aSpac
23bb0 65 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e[] */.  MemPage
23bc0 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
23bd0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
23be0 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
23bf0 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  lings */.  Pgno 
23c00 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20  pgnoOld[NB];    
23c10 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
23c20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68  numbers for each
23c30 20 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d   page in apOld[]
23c40 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
23c50 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
23c60 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
23c70 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
23c80 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
23c90 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
23ca0 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
23cb0 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
23cc0 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
23cd0 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  ancing */.  Pgno
23ce0 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20   pgnoNew[NB+2]; 
23cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
23d00 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63   numbers for eac
23d10 68 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b  h page in apNew[
23d20 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  ] */.  u8 *apDiv
23d30 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
23d40 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
23d50 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
23d60 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
23d70 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
23d80 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
23d90 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
23da0 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
23db0 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
23dc0 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
23dd0 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
23de0 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
23df0 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
23e00 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
23e10 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
23e20 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
23e30 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
23e40 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  int *szCell;    
23e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23e60 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
23e70 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
23e80 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f  l[] */.  u8 *aCo
23e90 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
23ea0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
23eb0 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  or holding data 
23ec0 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20  of apCopy[] */. 
23ed0 20 75 38 20 2a 61 53 70 61 63 65 3b 20 20 20 20   u8 *aSpace;    
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23ef0 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 63   Space to hold c
23f00 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72  opies of divider
23f10 73 20 63 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64  s cells */.#ifnd
23f20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
23f30 55 54 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 2a  UTOVACUUM.  u8 *
23f40 61 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  aFrom = 0;.#endi
23f50 66 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69  f..  /* .  ** Fi
23f60 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nd the parent pa
23f70 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
23f80 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
23f90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
23fa0 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69  lite3pager_iswri
23fb0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 61 44  teable(pPage->aD
23fc0 61 74 61 29 20 29 3b 0a 20 20 70 42 74 20 3d 20  ata) );.  pBt = 
23fd0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50  pPage->pBt;.  pP
23fe0 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
23ff0 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74  Parent;.  assert
24000 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69  ( pParent );.  i
24010 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
24020 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
24030 5f 77 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e  _write(pParent->
24040 61 44 61 74 61 29 29 20 29 7b 0a 20 20 20 20 72  aData)) ){.    r
24050 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
24060 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
24070 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
24080 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
24090 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
240a0 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69  ent->pgno));..#i
240b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
240c0 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20  T_QUICKBALANCE. 
240d0 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69   /*.  ** A speci
240e0 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e  al case:  If a n
240f0 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73  ew entry has jus
24100 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  t been inserted 
24110 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c  into a.  ** tabl
24120 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62 74  e (that is, a bt
24130 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65 72  ree with integer
24140 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61   keys and all da
24150 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65 73  ta at the leaves
24160 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e  ).  ** and the n
24170 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  ew entry is the 
24180 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
24190 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69 74   in the tree (it
241a0 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61   has the.  ** la
241b0 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20  rgest key) then 
241c0 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c 20  use the special 
241d0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
241e0 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a  routine for.  **
241f0 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c   balancing.  bal
24200 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20  ance_quick() is 
24210 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64 20  much faster and 
24220 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67  results in a tig
24230 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e  hter.  ** packin
24240 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  g of data in the
24250 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
24260 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
24270 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70 50  leaf &&.      pP
24280 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20  age->intKey &&. 
24290 20 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66       pPage->leaf
242a0 44 61 74 61 20 26 26 0a 20 20 20 20 20 20 70 50  Data &&.      pP
242b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
242c0 31 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  1 &&.      pPage
242d0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
242e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a  pPage->nCell &&.
242f0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61        pPage->pPa
24300 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26  rent->pgno!=1 &&
24310 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28  .      get4byte(
24320 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
24330 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
24340 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70  et+8])==pPage->p
24350 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 0a  gno.  ){.    /*.
24360 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65      ** TODO: Che
24370 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  ck the siblings 
24380 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70  to the left of p
24390 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20  Page. It may be 
243a0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79  that.    ** they
243b0 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e   are not full an
243c0 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73  d no new page is
243d0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
243e0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c  /.    return bal
243f0 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 67 65  ance_quick(pPage
24400 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  , pParent);.  }.
24410 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
24420 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c 20  * Find the cell 
24430 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  in the parent pa
24440 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63 68  ge whose left ch
24450 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a  ild points back.
24460 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20 20    ** to pPage.  
24470 54 68 65 20 22 69 64 78 22 20 76 61 72 69 61 62  The "idx" variab
24480 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  le is the index 
24490 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20 49  of that cell.  I
244a0 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73 20  f pPage.  ** is 
244b0 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63 68  the rightmost ch
244c0 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 74  ild of pParent t
244d0 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20 70  hen set idx to p
244e0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20  Parent->nCell . 
244f0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e   */.  if( pParen
24500 74 2d 3e 69 64 78 53 68 69 66 74 20 29 7b 0a 20  t->idxShift ){. 
24510 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
24520 20 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e    pgno = pPage->
24530 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
24540 28 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 70  ( pgno==sqlite3p
24550 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
24560 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b  pPage->aData) );
24570 0a 20 20 20 20 66 6f 72 28 69 64 78 3d 30 3b 20  .    for(idx=0; 
24580 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  idx<pParent->nCe
24590 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20  ll; idx++){.    
245a0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 66    if( get4byte(f
245b0 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
245c0 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a   idx))==pgno ){.
245d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
245e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
245f0 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61   assert( idx<pPa
24600 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20  rent->nCell.    
24610 20 20 20 20 20 20 20 20 20 7c 7c 20 67 65 74 34           || get4
24620 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
24630 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
24640 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e  rOffset+8])==pgn
24650 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o );.  }else{.  
24660 20 20 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 69    idx = pPage->i
24670 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20  dxParent;.  }.. 
24680 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c   /*.  ** Initial
24690 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f  ize variables so
246a0 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
246b0 20 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20   safe to jump.  
246c0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62  ** directly to b
246d0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61  alance_cleanup a
246e0 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20  t any moment..  
246f0 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77  */.  nOld = nNew
24700 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 70   = 0;.  sqlite3p
24710 61 67 65 72 5f 72 65 66 28 70 50 61 72 65 6e 74  ager_ref(pParent
24720 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 2f 2a 0a  ->aData);..  /*.
24730 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e    ** Find siblin
24740 67 20 70 61 67 65 73 20 74 6f 20 70 50 61 67 65  g pages to pPage
24750 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69   and the cells i
24760 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74 20 64  n pParent that d
24770 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73  ivide.  ** the s
24780 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74  iblings.  An att
24790 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
247a0 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73  find NN siblings
247b0 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20   on either.  ** 
247c0 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20  side of pPage.  
247d0 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72  More siblings ar
247e0 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65  e taken from one
247f0 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20   side, however, 
24800 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68  if.  ** pPage th
24810 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68  ere are fewer th
24820 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  an NN siblings o
24830 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  n the other side
24840 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20  .  If pParent.  
24850 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77  ** has NB or few
24860 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e  er children then
24870 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
24880 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b   pParent are tak
24890 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76  en..  */.  nxDiv
248a0 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69   = idx - NN;.  i
248b0 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20  f( nxDiv + NB > 
248c0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
248d0 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50  {.    nxDiv = pP
248e0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e  arent->nCell - N
248f0 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  B + 1;.  }.  if(
24900 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20   nxDiv<0 ){.    
24910 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20  nxDiv = 0;.  }. 
24920 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72   nDiv = 0;.  for
24930 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69  (i=0, k=nxDiv; i
24940 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a  <NB; i++, k++){.
24950 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e      if( k<pParen
24960 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
24970 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e    apDiv[i] = fin
24980 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b  dCell(pParent, k
24990 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b  );.      nDiv++;
249a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
249b0 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b  pParent->leaf );
249c0 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69  .      pgnoOld[i
249d0 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  ] = get4byte(apD
249e0 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  iv[i]);.    }els
249f0 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74  e if( k==pParent
24a00 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
24a10 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65   pgnoOld[i] = ge
24a20 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
24a30 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
24a40 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
24a50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24a60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
24a70 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
24a80 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c  Page(pBt, pgnoOl
24a90 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c  d[i], &apOld[i],
24aa0 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69   pParent);.    i
24ab0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
24ac0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
24ad0 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50    apOld[i]->idxP
24ae0 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61  arent = k;.    a
24af0 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20  pCopy[i] = 0;.  
24b00 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c    assert( i==nOl
24b10 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b  d );.    nOld++;
24b20 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b  .    nMaxCells +
24b30 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43  = 1+apOld[i]->nC
24b40 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f  ell+apOld[i]->nO
24b50 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20  verflow;.  }..  
24b60 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c  /* Make nMaxCell
24b70 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  s a multiple of 
24b80 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  2 in order to pr
24b90 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20  eserve 8-byte.  
24ba0 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a  ** alignment */.
24bb0 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e    nMaxCells = (n
24bc0 4d 61 78 43 65 6c 6c 73 20 2b 20 31 29 26 7e 31  MaxCells + 1)&~1
24bd0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
24be0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
24bf0 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
24c00 73 0a 20 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20  s.  */.  apCell 
24c10 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
24c20 77 28 20 0a 20 20 20 20 20 20 20 6e 4d 61 78 43  w( .       nMaxC
24c30 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29  ells*sizeof(u8*)
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
24c60 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e  Cell */.     + n
24c70 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
24c80 69 6e 74 29 20 20 20 20 20 20 20 20 20 20 20 20  int)            
24c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24ca0 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * szCell */.    
24cb0 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   + ROUND8(sizeof
24cc0 28 4d 65 6d 50 61 67 65 29 29 2a 4e 42 20 20 20  (MemPage))*NB   
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ce0 20 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20     /* aCopy */. 
24cf0 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53      + pBt->pageS
24d00 69 7a 65 2a 28 35 2b 4e 42 29 20 20 20 20 20 20  ize*(5+NB)      
24d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 20        /* aSpace 
24d30 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54  */.     + (ISAUT
24d40 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65  OVACUUM ? nMaxCe
24d50 6c 6c 73 20 3a 20 30 29 20 20 20 20 20 20 20 20  lls : 0)        
24d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72            /* aFr
24d70 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  om */.  );.  if(
24d80 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20   apCell==0 ){.  
24d90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
24da0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
24db0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
24dc0 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69   }.  szCell = (i
24dd0 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78  nt*)&apCell[nMax
24de0 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b  Cells];.  aCopy[
24df0 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  0] = (u8*)&szCel
24e00 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
24e10 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
24e20 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  0] - (u8*)apCell
24e30 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
24e40 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
24e50 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66   required */.  f
24e60 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b  or(i=1; i<NB; i+
24e70 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d  +){.    aCopy[i]
24e80 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70   = &aCopy[i-1][p
24e90 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55  Bt->pageSize+ROU
24ea0 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
24eb0 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72  ge))];.    asser
24ec0 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20  t( ((aCopy[i] - 
24ed0 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37  (u8*)apCell) & 7
24ee0 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
24ef0 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
24f00 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53  ired */.  }.  aS
24f10 70 61 63 65 20 3d 20 26 61 43 6f 70 79 5b 4e 42  pace = &aCopy[NB
24f20 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1][pBt->pageSiz
24f30 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  e+ROUND8(sizeof(
24f40 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61 73  MemPage))];.  as
24f50 73 65 72 74 28 20 28 28 61 53 70 61 63 65 20 2d  sert( ((aSpace -
24f60 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20   (u8*)apCell) & 
24f70 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79  7)==0 ); /* 8-by
24f80 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71  te alignment req
24f90 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66  uired */.#ifndef
24fa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
24fb0 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42  OVACUUM.  if( pB
24fc0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
24fd0 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53  .    aFrom = &aS
24fe0 70 61 63 65 5b 35 2a 70 42 74 2d 3e 70 61 67 65  pace[5*pBt->page
24ff0 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69  Size];.  }.#endi
25000 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d  f.  .  /*.  ** M
25010 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
25020 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61  e content of pPa
25030 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
25040 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e  ngs into aOld[].
25050 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f  .  ** The rest o
25060 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
25070 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
25080 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
25090 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74  ther.  ** that t
250a0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
250b0 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
250c0 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
250d0 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70  be in the.  ** p
250e0 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
250f0 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a  overwritten..  *
25100 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
25110 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Old; i++){.    M
25120 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f  emPage *p = apCo
25130 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
25140 2a 29 26 61 43 6f 70 79 5b 69 5d 5b 70 42 74 2d  *)&aCopy[i][pBt-
25150 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20  >pageSize];.    
25160 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38  p->aData = &((u8
25170 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53  *)p)[-pBt->pageS
25180 69 7a 65 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ize];.    memcpy
25190 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  (p->aData, apOld
251a0 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
251b0 3e 70 61 67 65 53 69 7a 65 20 2b 20 73 69 7a 65  >pageSize + size
251c0 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
251d0 20 20 2f 2a 20 54 68 65 20 6d 65 6d 63 70 79 28    /* The memcpy(
251e0 29 20 61 62 6f 76 65 20 63 68 61 6e 67 65 73 20  ) above changes 
251f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  the value of p->
25200 61 44 61 74 61 20 73 6f 20 77 65 20 68 61 76 65  aData so we have
25210 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 74 20 69   to.    ** set i
25220 74 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20  t again. */.    
25230 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38  p->aData = &((u8
25240 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53  *)p)[-pBt->pageS
25250 69 7a 65 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ize];.  }..  /*.
25260 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65    ** Load pointe
25270 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20  rs to all cells 
25280 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  on sibling pages
25290 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72   and the divider
252a0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
252b0 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c   the local apCel
252c0 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65  l[] array.  Make
252d0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64   copies of the d
252e0 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
252f0 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  * into space obt
25300 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70 61 63  ained form aSpac
25310 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74  e[] and remove t
25320 68 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43  he the divider C
25330 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70  ells.  ** from p
25340 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  Parent..  **.  *
25350 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
25360 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61  s are on leaf pa
25370 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ges, then the ch
25380 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20  ild pointers of 
25390 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72  the.  ** divider
253a0 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70   cells are strip
253b0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c  ped from the cel
253c0 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61  ls before they a
253d0 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69  re copied.  ** i
253e0 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e 20 20 49  nto aSpace[].  I
253f0 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20  n this way, all 
25400 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
25410 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20  ] are without.  
25420 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ** child pointer
25430 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20  s.  If siblings 
25440 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
25450 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e  then all cell in
25460 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69  .  ** apCell[] i
25470 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69  nclude child poi
25480 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77  nters.  Either w
25490 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
254a0 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61   apCell[].  ** a
254b0 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20  re alike..  **. 
254c0 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69   ** leafCorrecti
254d0 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20  on:  4 if pPage 
254e0 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
254f0 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20   pPage is not a 
25500 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20  leaf..  **      
25510 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66   leafData:  1 if
25520 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79   pPage holds key
25530 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e  +data and pParen
25540 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79  t holds only key
25550 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20  s..  */.  nCell 
25560 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65  = 0;.  leafCorre
25570 63 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c  ction = pPage->l
25580 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74  eaf*4;.  leafDat
25590 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  a = pPage->leafD
255a0 61 74 61 20 26 26 20 70 50 61 67 65 2d 3e 6c 65  ata && pPage->le
255b0 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  af;.  for(i=0; i
255c0 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
255d0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
255e0 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20   apCopy[i];.    
255f0 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64  int limit = pOld
25600 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f  ->nCell+pOld->nO
25610 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72  verflow;.    for
25620 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a  (j=0; j<limit; j
25630 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
25640 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
25650 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65  ls );.      apCe
25660 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
25670 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c  OverflowCell(pOl
25680 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43  d, j);.      szC
25690 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c  ell[nCell] = cel
256a0 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61  lSizePtr(pOld, a
256b0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23  pCell[nCell]);.#
256c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
256d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
256e0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
256f0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
25700 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20 20 20     int a;.      
25710 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
25720 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
25730 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76  a=0; a<pOld->nOv
25740 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20  erflow; a++){.  
25750 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
25760 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c  ->aOvfl[a].pCell
25770 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20  ==apCell[nCell] 
25780 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
25790 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78  From[nCell] = 0x
257a0 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF;.            
257b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
257c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
257d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
257e0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
257f0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
25800 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  1 ){.      int s
25810 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
25820 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
25830 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65  ]);.      if( le
25840 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
25850 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45    /* With the LE
25860 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61  AFDATA flag, pPa
25870 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20  rent cells hold 
25880 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61  only INTKEYs tha
25890 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65  t.        ** are
258a0 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b   duplicates of k
258b0 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64  eys on the child
258c0 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64   pages.  We need
258d0 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20   to remove.     
258e0 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65     ** the divide
258f0 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61  r cells from pPa
25900 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69  rent, but the di
25910 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65  viders cells are
25920 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
25930 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b  added to apCell[
25940 5d 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61  ] because they a
25950 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66  re duplicates of
25960 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20   child cells..  
25970 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25980 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
25990 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20  t, nxDiv, sz);. 
259a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
259b0 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
259c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
259d0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
259e0 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
259f0 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
25a00 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
25a10 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20  Space[iSpace];. 
25a20 20 20 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d         iSpace +=
25a30 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73   sz;.        ass
25a40 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74  ert( iSpace<=pBt
25a50 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a  ->pageSize*5 );.
25a60 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
25a70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20  Temp, apDiv[i], 
25a80 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43  sz);.        apC
25a90 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65  ell[nCell] = pTe
25aa0 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  mp+leafCorrectio
25ab0 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  n;.#ifndef SQLIT
25ac0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
25ad0 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  M.        if( pB
25ae0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
25af0 0a 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d  .          aFrom
25b00 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a  [nCell] = 0xFF;.
25b10 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
25b20 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
25b30 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
25b40 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 73  , sz);.        s
25b50 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20  zCell[nCell] -= 
25b60 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
25b70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25b80 67 65 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d  get4byte(pTemp)=
25b90 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20  =pgnoOld[i] );. 
25ba0 20 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64         if( !pOld
25bb0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
25bc0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
25bd0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
25be0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
25bf0 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20  e right pointer 
25c00 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
25c10 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74  e pOld becomes t
25c20 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  he left.        
25c30 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20    ** pointer of 
25c40 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
25c50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
25c60 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
25c70 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
25c80 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74  [pOld->hdrOffset
25c90 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  +8], 4);.       
25ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25cb0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
25cc0 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
25cd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25ce0 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
25cf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
25d00 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75  *.  ** Figure ou
25d10 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
25d20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20  pages needed to 
25d30 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63  hold all nCell c
25d40 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65  ells..  ** Store
25d50 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20   this number in 
25d60 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75  "k".  Also compu
25d70 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68  te szNew[] which
25d80 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20   is the total.  
25d90 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  ** size of all c
25da0 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68  ells on the i-th
25db0 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77   page and cntNew
25dc0 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
25dd0 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70  index.  ** in ap
25de0 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65  Cell[] of the ce
25df0 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20  ll that divides 
25e00 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65  page i from page
25e10 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74   i+1.  .  ** cnt
25e20 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71  New[k] should eq
25e30 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a  ual nCell..  **.
25e40 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70    ** Values comp
25e50 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  uted by this blo
25e60 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ck:.  **.  **   
25e70 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74          k: The t
25e80 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
25e90 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a  ibling pages.  *
25ea0 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53  *    szNew[i]: S
25eb0 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68  paced used on th
25ec0 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
25ed0 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e  age..  **   cntN
25ee0 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20  ew[i]: Index in 
25ef0 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43  apCell[] and szC
25f00 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69  ell[] for the fi
25f10 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a  rst cell to.  **
25f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
25f30 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69  e right of the i
25f40 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
25f50 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61  ..  ** usableSpa
25f60 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  ce: Number of by
25f70 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61  tes of space ava
25f80 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73  ilable on each s
25f90 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20  ibling..  ** .  
25fa0 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65  */.  usableSpace
25fb0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
25fc0 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f  ze - 12 + leafCo
25fd0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28  rrection;.  for(
25fe0 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20  subtotal=k=i=0; 
25ff0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
26000 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61     assert( i<nMa
26010 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75  xCells );.    su
26020 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c  btotal += szCell
26030 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28  [i] + 2;.    if(
26040 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62   subtotal > usab
26050 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  leSpace ){.     
26060 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
26070 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d  otal - szCell[i]
26080 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b  ;.      cntNew[k
26090 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28  ] = i;.      if(
260a0 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d   leafData ){ i--
260b0 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74  ; }.      subtot
260c0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b  al = 0;.      k+
260d0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  +;.    }.  }.  s
260e0 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
260f0 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20  al;.  cntNew[k] 
26100 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a  = nCell;.  k++;.
26110 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  /*.  ** The p
26120 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20  acking computed 
26130 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
26140 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20  block is biased 
26150 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69  toward the sibli
26160 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ngs.  ** on the 
26170 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20  left side.  The 
26180 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72  left siblings ar
26190 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20  e always nearly 
261a0 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a  full, while the.
261b0 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20    ** right-most 
261c0 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65  sibling might be
261d0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20   nearly empty.  
261e0 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  This block of co
261f0 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a  de attempts.  **
26200 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70   to adjust the p
26210 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e  acking of siblin
26220 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74  gs to get a bett
26230 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a  er balance..  **
26240 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73  .  ** This adjus
26250 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68  tment is more th
26260 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  an an optimizati
26270 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67  on.  The packing
26280 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a   above might.  *
26290 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62  * be so out of b
262a0 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20  alance as to be 
262b0 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78  illegal.  For ex
262c0 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74  ample, the right
262d0 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69  -most.  ** sibli
262e0 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70  ng might be comp
262f0 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54  letely empty.  T
26300 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
26310 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a  s not optional..
26320 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31    */.  for(i=k-1
26330 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
26340 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73   int szRight = s
26350 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a  zNew[i];  /* Siz
26360 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
26370 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20  the right */.   
26380 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a   int szLeft = sz
26390 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a  New[i-1]; /* Siz
263a0 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
263b0 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20  the left */.    
263c0 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20  int r;          
263d0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
263e0 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
263f0 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20  in left sibling 
26400 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20  */.    int d;   
26410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26420 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
26430 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  l to the left of
26440 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a   right sibling *
26450 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  /..    r = cntNe
26460 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
26470 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
26480 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
26490 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( d<nMaxCells );
264a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e  .    assert( r<n
264b0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
264c0 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d  while( szRight==
264d0 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43  0 || szRight+szC
264e0 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74  ell[d]+2<=szLeft
264f0 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29  -(szCell[r]+2) )
26500 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20  {.      szRight 
26510 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32  += szCell[d] + 2
26520 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d  ;.      szLeft -
26530 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b  = szCell[r] + 2;
26540 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d  .      cntNew[i-
26550 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20  1]--;.      r = 
26560 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
26570 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31  .      d = r + 1
26580 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
26590 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20   }.    szNew[i] 
265a0 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73  = szRight;.    s
265b0 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65  zNew[i-1] = szLe
265c0 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69  ft;.  }..  /* Ei
265d0 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e  ther we found on
265e0 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20  e or more cells 
265f0 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f  (cntnew[0])>0) o
26600 72 20 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a  r we are the.  *
26610 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
26620 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
26630 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
26640 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
26650 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
26660 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
26670 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
26680 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
26690 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  */.  assert( cnt
266a0 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61  New[0]>0 || (pPa
266b0 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26  rent->pgno==1 &&
266c0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
266d0 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  =0) );..  /*.  *
266e0 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77  * Allocate k new
266f0 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f   pages.  Reuse o
26700 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70  ld pages where p
26710 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
26720 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
26730 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46  gno>1 );.  pageF
26740 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44  lags = pPage->aD
26750 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  ata[0];.  for(i=
26760 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
26770 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
26780 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20  .    if( i<nOld 
26790 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
267a0 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64  apNew[i] = apOld
267b0 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
267c0 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b  ew[i] = pgnoOld[
267d0 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
267e0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
267f0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
26800 77 72 69 74 65 28 70 4e 65 77 2d 3e 61 44 61 74  write(pNew->aDat
26810 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  a);.      if( rc
26820 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
26830 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c  cleanup;.    }el
26840 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61  se{.      rc = a
26850 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  llocatePage(pBt,
26860 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
26870 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31  [i], pgnoNew[i-1
26880 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
26890 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
268a0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
268b0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
268c0 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4e 65  w;.    }.    nNe
268d0 77 2b 2b 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  w++;.    zeroPag
268e0 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67  e(pNew, pageFlag
268f0 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72  s);.  }..  /* Fr
26900 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73  ee any old pages
26910 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72   that were not r
26920 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67  eused as new pag
26930 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  es..  */.  while
26940 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
26950 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70  rc = freePage(ap
26960 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Old[i]);.    if(
26970 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
26980 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
26990 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
269a0 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64  d[i]);.    apOld
269b0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b  [i] = 0;.    i++
269c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
269d0 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67   Put the new pag
269e0 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
269f0 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c  order.  This hel
26a00 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20  ps to.  ** keep 
26a10 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64  entries in the d
26a20 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  isk file in orde
26a30 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e  r so that a scan
26a40 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
26a50 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73  le is a linear s
26a60 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
26a70 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a  file.  That.  **
26a80 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74   in turn helps t
26a90 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
26aa0 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70  tem to deliver p
26ab0 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  ages.  ** from t
26ac0 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70  he disk more rap
26ad0 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  idly..  **.  ** 
26ae0 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74  An O(n^2) insert
26af0 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74  ion sort algorit
26b00 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20  hm is used, but 
26b10 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20  since.  ** n is 
26b20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
26b30 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73  NB (a small cons
26b40 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75  tant), that shou
26b50 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  ld.  ** not be a
26b60 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20   problem..  **. 
26b70 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20   ** When NB==3, 
26b80 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a  this one optimiz
26b90 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20  ation makes the 
26ba0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62  database.  ** ab
26bb0 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66  out 25% faster f
26bc0 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69  or large inserti
26bd0 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ons and deletion
26be0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
26bf0 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a  0; i<k-1; i++){.
26c00 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70      int minV = p
26c10 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69  gnoNew[i];.    i
26c20 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20  nt minI = i;.   
26c30 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b   for(j=i+1; j<k;
26c40 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
26c50 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73   pgnoNew[j]<(uns
26c60 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20  igned)minV ){.  
26c70 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a        minI = j;.
26c80 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70          minV = p
26c90 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20  gnoNew[j];.     
26ca0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
26cb0 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20   minI>i ){.     
26cc0 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65   int t;.      Me
26cd0 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20  mPage *pT;.     
26ce0 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b   t = pgnoNew[i];
26cf0 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65  .      pT = apNe
26d00 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  w[i];.      pgno
26d10 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77  New[i] = pgnoNew
26d20 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70  [minI];.      ap
26d30 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d  New[i] = apNew[m
26d40 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  inI];.      pgno
26d50 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20  New[minI] = t;. 
26d60 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d       apNew[minI]
26d70 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d   = pT;.    }.  }
26d80 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
26d90 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25  CE: old: %d %d %
26da0 64 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25  d  new: %d(%d) %
26db0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
26dc0 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  %d) %d(%d)\n",. 
26dd0 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a     pgnoOld[0], .
26de0 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67      nOld>=2 ? pg
26df0 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20  noOld[1] : 0,.  
26e00 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f    nOld>=3 ? pgno
26e10 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20  Old[2] : 0,.    
26e20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65  pgnoNew[0], szNe
26e30 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d  w[0],.    nNew>=
26e40 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a  2 ? pgnoNew[1] :
26e50 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a   0, nNew>=2 ? sz
26e60 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  New[1] : 0,.    
26e70 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65  nNew>=3 ? pgnoNe
26e80 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[2] : 0, nNew>=
26e90 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30  3 ? szNew[2] : 0
26ea0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20  ,.    nNew>=4 ? 
26eb0 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20  pgnoNew[3] : 0, 
26ec0 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b  nNew>=4 ? szNew[
26ed0 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  3] : 0,.    nNew
26ee0 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d  >=5 ? pgnoNew[4]
26ef0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20   : 0, nNew>=5 ? 
26f00 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a  szNew[4] : 0));.
26f10 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c  .  /*.  ** Evenl
26f20 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65  y distribute the
26f30 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b   data in apCell[
26f40 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77  ] across the new
26f50 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73   pages..  ** Ins
26f60 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c  ert divider cell
26f70 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61  s into pParent a
26f80 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
26f90 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72  /.  j = 0;.  for
26fa0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
26fb0 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d  +){.    /* Assem
26fc0 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c  ble the new sibl
26fd0 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ing page. */.   
26fe0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
26ff0 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61   apNew[i];.    a
27000 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
27010 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ls );.    assert
27020 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67  ( pNew->pgno==pg
27030 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20  noNew[i] );.    
27040 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
27050 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20  w, cntNew[i]-j, 
27060 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43  &apCell[j], &szC
27070 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73  ell[j]);.    ass
27080 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c  ert( pNew->nCell
27090 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26  >0 || (nNew==1 &
270a0 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20  & cntNew[0]==0) 
270b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
270c0 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  New->nOverflow==
270d0 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  0 );..#ifndef SQ
270e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
270f0 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74  CUUM.    /* If t
27100 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
27110 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
27120 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
27130 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er map entries. 
27140 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74     ** that point
27150 20 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73   to the siblings
27160 20 74 68 61 74 20 77 65 72 65 20 72 65 61 72 72   that were rearr
27170 61 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e  anged. These can
27180 20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a   be: left.    **
27190 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c   children of cel
271a0 6c 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68  ls, the right-ch
271b0 69 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c  ild of the page,
271c0 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
271d0 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  es.    ** pointe
271e0 64 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20  d to by cells.. 
271f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
27200 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
27210 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20  .      for(k=j; 
27220 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b  k<cntNew[i]; k++
27230 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
27240 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( k<nMaxCells )
27250 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46  ;.        if( aF
27260 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20  rom[k]==0xFF || 
27270 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d  apCopy[aFrom[k]]
27280 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
27290 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  no ){.          
272a0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
272b0 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20  fl(pNew, k-j);. 
272c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
272d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
272e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
272f0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
27300 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27310 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
27320 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
27330 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a  j = cntNew[i];..
27340 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69      /* If the si
27350 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d  bling page assem
27360 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e  bled above was n
27370 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ot the right-mos
27380 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a  t sibling,.    *
27390 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64  * insert a divid
273a0 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  er cell into the
273b0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
273c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e    */.    if( i<n
273d0 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c  New-1 && j<nCell
273e0 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43   ){.      u8 *pC
273f0 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  ell;.      u8 *p
27400 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Temp;.      int 
27410 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  sz;..      asser
27420 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
27430 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
27440 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  apCell[j];.     
27450 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20   sz = szCell[j] 
27460 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
27470 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
27480 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  w->leaf ){.     
27490 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d     memcpy(&pNew-
274a0 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c  >aData[8], pCell
274b0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 70 54  , 4);.        pT
274c0 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  emp = 0;.      }
274d0 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74  else if( leafDat
274e0 61 20 29 7b 0a 09 2f 2a 20 49 66 20 74 68 65 20  a ){../* If the 
274f0 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
27500 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
27510 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
27520 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
27530 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
27540 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
27550 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
27560 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
27570 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
27580 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
27590 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
275a0 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
275b0 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
275c0 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
275d0 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
275e0 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
275f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27600 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
27610 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
27620 20 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74       parseCellPt
27630 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a  r(pNew, apCell[j
27640 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ], &info);.     
27650 20 20 20 70 43 65 6c 6c 20 3d 20 26 61 53 70 61     pCell = &aSpa
27660 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20  ce[iSpace];.    
27670 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70      fillInCell(p
27680 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30  Parent, pCell, 0
27690 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20  , info.nKey, 0, 
276a0 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20  0, &sz);.       
276b0 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20   iSpace += sz;. 
276c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
276d0 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65  Space<=pBt->page
276e0 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20  Size*5 );.      
276f0 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
27700 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27710 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20    pCell -= 4;.  
27720 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
27730 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20  Space[iSpace];. 
27740 20 20 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d         iSpace +=
27750 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73   sz;.        ass
27760 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74  ert( iSpace<=pBt
27770 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a  ->pageSize*5 );.
27780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
27790 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
277a0 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43  arent, nxDiv, pC
277b0 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20  ell, sz, pTemp, 
277c0 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  4);.      if( rc
277d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
277e0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
277f0 75 70 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  up;.      put4by
27800 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
27810 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69  ell(pParent,nxDi
27820 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b  v), pNew->pgno);
27830 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27840 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
27850 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
27860 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
27870 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  um database, and
27880 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61   not a leaf-data
27890 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20   tree,.      ** 
278a0 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65 20  then update the 
278b0 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68  pointer map with
278c0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
278d0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  e overflow page.
278e0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68        ** that th
278f0 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65  e cell just inse
27900 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28  rted points to (
27910 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a  if any)..      *
27920 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
27930 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 21  >autoVacuum && !
27940 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
27950 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
27960 75 74 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20  utOvfl(pParent, 
27970 6e 78 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20  nxDiv);.        
27980 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27990 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
279a0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
279b0 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nup;.        }. 
279c0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
279d0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e      j++;.      n
279e0 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  xDiv++;.    }.  
279f0 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e  }.  assert( j==n
27a00 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 28 70  Cell );.  if( (p
27a10 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
27a20 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  EAF)==0 ){.    m
27a30 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
27a40 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
27a50 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
27a60 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
27a70 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d   }.  if( nxDiv==
27a80 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70  pParent->nCell+p
27a90 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
27aa0 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  w ){.    /* Righ
27ab0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
27ac0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
27ad0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
27ae0 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  t */.    put4byt
27af0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
27b00 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
27b10 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
27b20 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c  [nNew-1]);.  }el
27b30 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74  se{.    /* Right
27b40 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
27b50 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20   the left child 
27b60 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  of the first ent
27b70 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20  ry in pParent.  
27b80 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69    ** past the ri
27b90 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72  ght-most divider
27ba0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75   entry */.    pu
27bb0 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
27bc0 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
27bd0 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77   nxDiv), pgnoNew
27be0 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a  [nNew-1]);.  }..
27bf0 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65    /*.  ** Repare
27c00 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 61  nt children of a
27c10 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  ll cells..  */. 
27c20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
27c30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
27c40 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
27c50 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  ges(apNew[i]);. 
27c60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27c70 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
27c80 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
27c90 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74  .  rc = reparent
27ca0 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65  ChildPages(pPare
27cb0 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  nt);.  if( rc!=S
27cc0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
27cd0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
27ce0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61  ..  /*.  ** Bala
27cf0 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
27d00 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  age.  Note that 
27d10 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
27d20 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20   (pPage) might. 
27d30 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64   ** have been ad
27d40 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
27d50 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20  ist so it might 
27d60 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69  no longer be ini
27d70 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42  tialized..  ** B
27d80 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ut the parent pa
27d90 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ge will always b
27da0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
27db0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
27dc0 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
27dd0 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50  .  /* assert( pP
27de0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 20 2f  age->isInit ); /
27df0 2f 20 4e 6f 21 20 70 50 61 67 65 20 6d 69 67 68  / No! pPage migh
27e00 74 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  t have been adde
27e10 64 20 74 6f 20 66 72 65 65 6c 69 73 74 20 2a 2f  d to freelist */
27e20 0a 20 20 2f 2a 20 70 61 67 65 49 6e 74 65 67 72  .  /* pageIntegr
27e30 69 74 79 28 70 50 61 67 65 29 3b 20 20 20 20 2f  ity(pPage);    /
27e40 2f 20 4e 6f 21 20 70 50 61 67 65 20 6d 69 67 68  / No! pPage migh
27e50 74 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  t have been adde
27e60 64 20 74 6f 20 66 72 65 65 6c 69 73 74 20 2a 2f  d to freelist */
27e70 20 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65   .  rc = balance
27e80 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20  (pParent, 0);.  
27e90 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
27ea0 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
27eb0 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
27ec0 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
27ed0 69 74 65 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  iteFree(apCell);
27ee0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
27ef0 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ld; i++){.    re
27f00 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
27f10 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  i]);.  }.  for(i
27f20 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
27f30 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
27f40 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d  e(apNew[i]);.  }
27f50 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
27f60 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45  Parent);.  TRACE
27f70 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
27f80 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c  shed with %d: ol
27f90 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
27fa0 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
27fb0 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
27fc0 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
27fd0 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  l));.  return rc
27fe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
27ff0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
28000 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  d for the root p
28010 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77  age of a btree w
28020 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  hen the root.** 
28030 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
28040 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73   cells.  This is
28050 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
28060 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65  to make the tree
28070 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79  .** shallower by
28080 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73   one level..*/.s
28090 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
280a0 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50  e_shallower(MemP
280b0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
280c0 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
280d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
280e0 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61  he only child pa
280f0 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  ge of pPage */. 
28100 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b   Pgno pgnoChild;
28110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28120 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
28130 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74   pChild */.  int
28140 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
28160 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
28170 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
28180 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
28190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281a0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72   /* The main BTr
281b0 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
281c0 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50    int mxCellPerP
281d0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
281e0 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
281f0 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61   of cells per pa
28200 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
28210 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
28220 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
28230 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69  s from pages bei
28240 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
28250 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   int *szCell;   
28260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28270 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
28280 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61  ll cells */..  a
28290 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50  ssert( pPage->pP
282a0 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  arent==0 );.  as
282b0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
282c0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d  ll==0 );.  pBt =
282d0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d   pPage->pBt;.  m
282e0 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d  xCellPerPage = M
282f0 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61  X_CELL(pBt);.  a
28300 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61  pCell = sqliteMa
28310 6c 6c 6f 63 52 61 77 28 20 6d 78 43 65 6c 6c 50  llocRaw( mxCellP
28320 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75  erPage*(sizeof(u
28330 38 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  8*)+sizeof(int))
28340 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
28350 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
28360 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43  ITE_NOMEM;.  szC
28370 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43  ell = (int*)&apC
28380 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67  ell[mxCellPerPag
28390 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  e];.  if( pPage-
283a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  >leaf ){.    /* 
283b0 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  The table is com
283c0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f  pletely empty */
283d0 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
283e0 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c  ANCE: empty tabl
283f0 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  e %d\n", pPage->
28400 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
28410 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
28420 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62   page is empty b
28430 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64  ut has one child
28440 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
28450 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
28460 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65  on from that one
28470 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20   child into the 
28480 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20  root page if it 
28490 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74  .    ** will fit
284a0 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
284b0 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
284c0 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20   tree by one..  
284d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
284e0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
284f0 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
28500 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
28510 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ble than.    ** 
28520 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
28530 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
28540 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
28550 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
28560 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
28570 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20   database fle), 
28580 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  so it might not 
28590 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  be able to hold 
285a0 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20  all of the .    
285b0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
285c0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
285d0 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
285e0 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
285f0 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74   .    ** case, t
28600 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  hen do not do th
28610 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61  e transfer.  Lea
28620 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20  ve page 1 empty 
28630 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
28640 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
28650 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64  ter to the child
28660 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c   page.  The chil
28670 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20  d page becomes. 
28680 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61     ** the virtua
28690 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  l root of the tr
286a0 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ee..    */.    p
286b0 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
286c0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
286d0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
286e0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
286f0 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20  rt( pgnoChild>0 
28700 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
28710 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65  gnoChild<=sqlite
28720 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
28730 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
28740 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
28750 20 67 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e   getPage(pPage->
28760 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20  pBt, pgnoChild, 
28770 26 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 69 66  &pChild);.    if
28780 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
28790 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
287a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
287b0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
287c0 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28 70   rc = initPage(p
287d0 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20  Child, pPage);. 
287e0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
287f0 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
28800 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73  alance;.      as
28810 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f  sert( pChild->nO
28820 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
28830 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e      if( pChild->
28840 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20  nFree>=100 ){.  
28850 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
28860 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ld information w
28870 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72  ill fit on the r
28880 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20  oot page, so do 
28890 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
288a0 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  opy */.        i
288b0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65  nt i;.        ze
288c0 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  roPage(pPage, pC
288d0 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  hild->aData[0]);
288e0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
288f0 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ; i<pChild->nCel
28900 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
28910 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66     apCell[i] = f
28920 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69  indCell(pChild,i
28930 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43  );.          szC
28940 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  ell[i] = cellSiz
28950 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43  ePtr(pChild, apC
28960 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ell[i]);.       
28970 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d   }.        assem
28980 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20 70  blePage(pPage, p
28990 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70  Child->nCell, ap
289a0 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20  Cell, szCell);. 
289b0 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74         /* Copy t
289c0 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
289d0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f   of the child to
289e0 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   the parent. */.
289f0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
28a00 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
28a10 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
28a20 38 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  8], .           
28a30 20 67 65 74 34 62 79 74 65 28 26 70 43 68 69 6c   get4byte(&pChil
28a40 64 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d  d->aData[pChild-
28a50 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
28a60 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 61 67  .        freePag
28a70 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
28a80 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
28a90 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61  CE: child %d tra
28aa0 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c  nsfer to page 1\
28ab0 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  n", pChild->pgno
28ac0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
28ad0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
28ae0 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69  child has more i
28af0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
28b00 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
28b10 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  root..        **
28b20 20 54 68 65 20 74 72 65 65 20 69 73 20 61 6c 72   The tree is alr
28b30 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20  eady balanced.  
28b40 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20  Do nothing. */. 
28b50 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42         TRACE(("B
28b60 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64  ALANCE: child %d
28b70 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
28b80 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69   page 1\n", pChi
28b90 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ld->pgno));.    
28ba0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
28bb0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67       memcpy(pPag
28bc0 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64  e->aData, pChild
28bd0 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e  ->aData, pPage->
28be0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
28bf0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  ;.      pPage->i
28c00 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  sInit = 0;.     
28c10 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
28c20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
28c30 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  initPage(pPage, 
28c40 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
28c50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28c60 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67  );.      freePag
28c70 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
28c80 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
28c90 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64  : transfer child
28ca0 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64   %d into root %d
28cb0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
28cc0 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c     pChild->pgno,
28cd0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
28ce0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72      }.    rc = r
28cf0 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65  eparentChildPage
28d00 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20 61 73  s(pPage);.    as
28d10 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
28d20 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66  erflow==0 );.#if
28d30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28d40 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
28d50 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
28d60 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  uum ){.      int
28d70 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
28d80 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
28d90 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  l; i++){ .      
28da0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
28db0 4f 76 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Ovfl(pPage, i);.
28dc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28dd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28de0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
28df0 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
28e00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28e10 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
28e20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28e30 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
28e40 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
28e50 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
28e60 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65  e(pChild);.  }.e
28e70 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
28e80 63 65 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  ce:.  sqliteFree
28e90 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75  (apCell);.  retu
28ea0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
28eb0 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   The root page i
28ec0 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a  s overfull.**.**
28ed0 20 57 68 65 6e 20 74 68 69 73 20 68 61 70 70 65   When this happe
28ee0 6e 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77  ns, Create a new
28ef0 20 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20   child page and 
28f00 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  copy the.** cont
28f10 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
28f20 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e   into the child.
28f30 20 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20    Then make the 
28f40 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20  root.** page an 
28f50 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20  empty page with 
28f60 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74  rightChild point
28f70 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ing to the new.*
28f80 2a 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c  * child.   Final
28f90 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ly, call balance
28fa0 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74  _internal() on t
28fb0 68 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20  he new child.** 
28fc0 74 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20 73  to cause it to s
28fd0 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  plit..*/.static 
28fe0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
28ff0 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
29000 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
29010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
29020 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73  urn value from s
29030 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
29040 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
29050 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  d;    /* Pointer
29060 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
29070 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  page */.  Pgno p
29080 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a  gnoChild;     /*
29090 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
290a0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
290b0 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
290c0 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f   *pBt;         /
290d0 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20  * The BTree */. 
290e0 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
290f0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73       /* Total us
29100 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70  able size of a p
29110 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  age */.  u8 *dat
29120 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
29130 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  Content of the p
29140 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  arent page */.  
29150 75 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20  u8 *cdata;      
29160 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
29170 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
29180 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
29190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
291a0 73 65 74 20 74 6f 20 70 61 67 65 20 68 65 61 64  set to page head
291b0 65 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  er in parent */.
291c0 20 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20    int brk;      
291d0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
291e0 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69  to content of fi
291f0 72 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65  rst cell in pare
29200 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
29210 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
29220 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
29230 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29240 3e 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  >0 );.  pBt = pP
29250 61 67 65 2d 3e 70 42 74 3b 0a 20 20 72 63 20 3d  age->pBt;.  rc =
29260 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42   allocatePage(pB
29270 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e  t, &pChild, &pgn
29280 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70  oChild, pPage->p
29290 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  gno, 0);.  if( r
292a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
292b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
292c0 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c  pager_iswriteabl
292d0 65 28 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 29  e(pChild->aData)
292e0 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
292f0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
29300 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  ze;.  data = pPa
29310 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
29320 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
29330 73 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74  set;.  brk = get
29340 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
29350 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70  5]);.  cdata = p
29360 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20  Child->aData;.  
29370 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64  memcpy(cdata, &d
29380 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d  ata[hdr], pPage-
29390 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50  >cellOffset+2*pP
293a0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b  age->nCell-hdr);
293b0 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61  .  memcpy(&cdata
293c0 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b  [brk], &data[brk
293d0 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 62 72  ], usableSize-br
293e0 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  k);.  assert( pC
293f0 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  hild->isInit==0 
29400 29 3b 0a 20 20 72 63 20 3d 20 69 6e 69 74 50 61  );.  rc = initPa
29410 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65  ge(pChild, pPage
29420 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
29430 74 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72  to balancedeeper
29440 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70  _out;.  memcpy(p
29450 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50  Child->aOvfl, pP
29460 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67  age->aOvfl, pPag
29470 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a  e->nOverflow*siz
29480 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
29490 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d  [0]));.  pChild-
294a0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61  >nOverflow = pPa
294b0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ge->nOverflow;. 
294c0 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76   if( pChild->nOv
294d0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43  erflow ){.    pC
294e0 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b  hild->nFree = 0;
294f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
29500 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50  Child->nCell==pP
29510 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
29520 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
29530 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
29540 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20   & ~PTF_LEAF);. 
29550 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
29560 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
29570 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
29580 6f 43 68 69 6c 64 29 3b 0a 20 20 54 52 41 43 45  oChild);.  TRACE
29590 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79  (("BALANCE: copy
295a0 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64   root %d into %d
295b0 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
295c0 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
295d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
295e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
295f0 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
29600 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e  Vacuum ){.    in
29610 74 20 69 3b 0a 20 20 20 20 72 63 20 3d 20 70 74  t i;.    rc = pt
29620 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43 68  rmapPut(pBt, pCh
29630 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  ild->pgno, PTRMA
29640 50 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e  P_BTREE, pPage->
29650 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
29660 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
29670 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20  deeper_out;.    
29680 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c  for(i=0; i<pChil
29690 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  d->nCell; i++){.
296a0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
296b0 70 50 75 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c  pPutOvfl(pChild,
296c0 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   i);.      if( r
296d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
296e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
296f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
29700 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63  .  }.#endif.  rc
29710 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
29720 6f 74 28 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c  ot(pChild);..bal
29730 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a  ancedeeper_out:.
29740 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
29750 68 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  hild);.  return 
29760 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
29770 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20  ide if the page 
29780 70 50 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62  pPage needs to b
29790 65 20 62 61 6c 61 6e 63 65 64 2e 20 20 49 66 20  e balanced.  If 
297a0 62 61 6c 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20  balancing is.** 
297b0 72 65 71 75 69 72 65 64 2c 20 63 61 6c 6c 20 74  required, call t
297c0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62  he appropriate b
297d0 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65  alancing routine
297e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
297f0 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 20  balance(MemPage 
29800 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 6e 73 65  *pPage, int inse
29810 72 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  rt){.  int rc = 
29820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
29830 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
29840 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  =0 ){.    if( pP
29850 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
29860 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
29870 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50  alance_deeper(pP
29880 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
29890 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
298a0 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c  K && pPage->nCel
298b0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l==0 ){.      rc
298c0 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c   = balance_shall
298d0 6f 77 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20  ower(pPage);.   
298e0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
298f0 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
29900 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20  flow>0 || .     
29910 20 20 20 28 21 69 6e 73 65 72 74 20 26 26 20 70     (!insert && p
29920 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67  Page->nFree>pPag
29930 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
29940 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20 20  ze*2/3) ){.     
29950 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
29960 6e 72 6f 6f 74 28 70 50 61 67 65 29 3b 0a 20 20  nroot(pPage);.  
29970 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
29980 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
29990 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
299a0 73 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68  s all cursors th
299b0 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c  at point to tabl
299c0 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49  e pgnoRoot..** I
299d0 66 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63  f any of those c
299e0 75 72 73 6f 72 73 20 6f 74 68 65 72 20 74 68 61  ursors other tha
299f0 6e 20 70 45 78 63 6c 75 64 65 20 77 65 72 65 20  n pExclude were 
29a00 6f 70 65 6e 65 64 20 77 69 74 68 20 0a 2a 2a 20  opened with .** 
29a10 77 72 46 6c 61 67 3d 3d 30 20 74 68 65 6e 20 74  wrFlag==0 then t
29a20 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
29a30 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rns SQLITE_LOCKE
29a40 44 2e 20 20 49 66 20 61 6c 6c 0a 2a 2a 20 63 75  D.  If all.** cu
29a50 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74  rsors that point
29a60 20 74 6f 20 70 67 6e 6f 52 6f 6f 74 20 77 65 72   to pgnoRoot wer
29a70 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  e opened with wr
29a80 46 6c 61 67 3d 3d 31 0a 2a 2a 20 74 68 65 6e 20  Flag==1.** then 
29a90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
29aa0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
29ab0 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f  **.** In additio
29ac0 6e 20 74 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f  n to checking fo
29ad0 72 20 72 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68  r read-locks (wh
29ae0 65 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ere a read-lock 
29af0 0a 2a 2a 20 6d 65 61 6e 73 20 61 20 63 75 72 73  .** means a curs
29b00 6f 72 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  or opened with w
29b10 72 46 6c 61 67 3d 3d 30 29 20 74 68 69 73 20 72  rFlag==0) this r
29b20 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65  outine also move
29b30 73 0a 2a 2a 20 61 6c 6c 20 63 75 72 73 6f 72 73  s.** all cursors
29b40 20 6f 74 68 65 72 20 74 68 61 6e 20 70 45 78 63   other than pExc
29b50 6c 75 64 65 20 73 6f 20 74 68 61 74 20 74 68 65  lude so that the
29b60 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 74  y are pointing t
29b70 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  o the .** first 
29b80 43 65 6c 6c 20 6f 6e 20 72 6f 6f 74 20 70 61 67  Cell on root pag
29b90 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
29ba0 73 73 61 72 79 20 62 65 63 61 75 73 65 20 61 6e  ssary because an
29bb0 20 69 6e 73 65 72 74 20 0a 2a 2a 20 6f 72 20 64   insert .** or d
29bc0 65 6c 65 74 65 20 6d 69 67 68 74 20 63 68 61 6e  elete might chan
29bd0 67 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ge the number of
29be0 20 63 65 6c 6c 73 20 6f 6e 20 61 20 70 61 67 65   cells on a page
29bf0 20 6f 72 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20   or delete.** a 
29c00 70 61 67 65 20 65 6e 74 69 72 65 6c 79 20 61 6e  page entirely an
29c10 64 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  d we do not want
29c20 20 74 6f 20 6c 65 61 76 65 20 61 6e 79 20 63 75   to leave any cu
29c30 72 73 6f 72 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  rsors .** pointi
29c40 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78 69 73 74 61  ng to non-exista
29c50 6e 74 20 70 61 67 65 73 20 6f 72 20 63 65 6c 6c  nt pages or cell
29c60 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
29c70 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
29c80 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
29c90 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 42 74  gno pgnoRoot, Bt
29ca0 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65  Cursor *pExclude
29cb0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
29cc0 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
29cd0 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
29ce0 70 4e 65 78 74 29 7b 0a 20 20 20 20 75 33 32 20  pNext){.    u32 
29cf0 66 6c 61 67 73 20 3d 20 28 70 2d 3e 70 42 74 72  flags = (p->pBtr
29d00 65 65 2d 3e 70 53 71 6c 69 74 65 20 3f 20 70 2d  ee->pSqlite ? p-
29d10 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65  >pBtree->pSqlite
29d20 2d 3e 66 6c 61 67 73 20 3a 20 30 29 3b 0a 20 20  ->flags : 0);.  
29d30 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
29d40 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 7c 7c 20 70  t!=pgnoRoot || p
29d50 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e  ==pExclude ) con
29d60 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
29d70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 26 26 20 66  ->wrFlag==0 && f
29d80 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
29d90 55 6e 63 6f 6d 6d 69 74 74 65 64 20 29 20 63 6f  Uncommitted ) co
29da0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
29db0 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 29 20 72  p->wrFlag==0 ) r
29dc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
29dd0 4b 45 44 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  KED;.    if( p->
29de0 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e  pPage->pgno!=p->
29df0 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
29e00 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b    moveToRoot(p);
29e10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
29e20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
29e30 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
29e40 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
29e50 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65   the BTree.  The
29e60 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79   key is given by
29e70 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20   (pKey,nKey).** 
29e80 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20  and the data is 
29e90 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c  given by (pData,
29ea0 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72  nData).  The cur
29eb0 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  sor is used only
29ec0 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68   to.** define wh
29ed0 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63  at table the rec
29ee0 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ord should be in
29ef0 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68  serted into.  Th
29f00 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
29f10 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
29f20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
29f30 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  n..**.** For an 
29f40 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e  INTKEY table, on
29f50 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75  ly the nKey valu
29f60 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  e of the key is 
29f70 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a  used.  pKey is.*
29f80 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20  * ignored.  For 
29f90 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65  a ZERODATA table
29fa0 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20  , the pData and 
29fb0 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69  nData are both i
29fc0 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  gnored..*/.int s
29fd0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
29fe0 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
29ff0 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
2a000 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
2a010 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ta into the tabl
2a020 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72  e of this cursor
2a030 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2a040 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
2a050 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
2a060 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
2a070 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
2a080 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
2a090 61 74 61 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ata   /* The dat
2a0a0 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  a of the new rec
2a0b0 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ord */.){.  int 
2a0c0 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20  rc;.  int loc;. 
2a0d0 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65   int szNew;.  Me
2a0e0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2a0f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2a100 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
2a110 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
2a120 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75  ar *oldCell;.  u
2a130 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65  nsigned char *ne
2a140 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66  wCell = 0;..  if
2a150 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2a160 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
2a170 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
2a180 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
2a190 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e  tion before doin
2a1a0 67 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20  g an insert */. 
2a1b0 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
2a1c0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2a1d0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2a1e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2a1f0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
2a200 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20  adOnly );.  if( 
2a210 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b  !pCur->wrFlag ){
2a220 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a230 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75  TE_PERM;   /* Cu
2a240 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f  rsor not open fo
2a250 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d  r writing */.  }
2a260 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64  .  if( checkRead
2a270 4c 6f 63 6b 73 28 70 42 74 2c 20 70 43 75 72 2d  Locks(pBt, pCur-
2a280 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
2a290 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2a2a0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a  QLITE_LOCKED; /*
2a2b0 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
2a2c0 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
2a2d0 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  read lock */.  }
2a2e0 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
2a2f0 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
2a300 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f   other cursors o
2a310 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  pen on this tabl
2a320 65 20 2a 2f 0a 20 20 72 65 73 74 6f 72 65 4f 72  e */.  restoreOr
2a330 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
2a340 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  ion(pCur, 0);.  
2a350 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f  if( .    SQLITE_
2a360 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK!=(rc = saveAl
2a370 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
2a380 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2a390 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49  ur)) ||.    SQLI
2a3a0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
2a3b0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
2a3c0 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  pCur, pKey, nKey
2a3d0 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20  , &loc)).  ){.  
2a3e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2a3f0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
2a400 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
2a410 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
2a420 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20   || nKey>=0 );. 
2a430 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a440 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e  leaf || !pPage->
2a450 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 54 52  leafData );.  TR
2a460 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61  ACE(("INSERT: ta
2a470 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64  ble=%d nkey=%lld
2a480 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25   ndata=%d page=%
2a490 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
2a4a0 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2a4b0 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20  t, nKey, nData, 
2a4c0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20  pPage->pgno,.   
2a4d0 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20         loc==0 ? 
2a4e0 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e  "overwrite" : "n
2a4f0 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61  ew entry"));.  a
2a500 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2a510 49 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 73  Init );.  rc = s
2a520 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
2a530 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
2a540 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2a550 72 6e 20 72 63 3b 0a 20 20 6e 65 77 43 65 6c 6c  rn rc;.  newCell
2a560 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
2a570 61 77 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  aw( MX_CELL_SIZE
2a580 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6e  (pBt) );.  if( n
2a590 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  ewCell==0 ) retu
2a5a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2a5b0 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65  .  rc = fillInCe
2a5c0 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  ll(pPage, newCel
2a5d0 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  l, pKey, nKey, p
2a5e0 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 26 73 7a  Data, nData, &sz
2a5f0 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29  New);.  if( rc )
2a600 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
2a610 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
2a620 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  w==cellSizePtr(p
2a630 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29  Page, newCell) )
2a640 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
2a650 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  w<=MX_CELL_SIZE(
2a660 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f  pBt) );.  if( lo
2a670 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56  c==0 && CURSOR_V
2a680 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2a690 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  te ){.    int sz
2a6a0 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Old;.    assert(
2a6b0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
2a6c0 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
2a6d0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 6f  ->nCell );.    o
2a6e0 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  ldCell = findCel
2a6f0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2a700 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  dx);.    if( !pP
2a710 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2a720 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c     memcpy(newCel
2a730 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a  l, oldCell, 4);.
2a740 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20      }.    szOld 
2a750 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2a760 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
2a770 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
2a780 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  l(pPage, oldCell
2a790 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2a7a0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2a7b0 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  .    dropCell(pP
2a7c0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2a7d0 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20  szOld);.  }else 
2a7e0 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61  if( loc<0 && pPa
2a7f0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ge->nCell>0 ){. 
2a800 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a810 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43  ->leaf );.    pC
2a820 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70  ur->idx++;.    p
2a830 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2a840 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
2a850 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2a860 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72  >leaf );.  }.  r
2a870 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
2a880 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2a890 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c   newCell, szNew,
2a8a0 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
2a8b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2a8c0 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2a8d0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
2a8e0 61 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71  age, 1);.  /* sq
2a8f0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 44 75  lite3BtreePageDu
2a900 6d 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43  mp(pCur->pBt, pC
2a910 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29  ur->pgnoRoot, 1)
2a920 3b 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68  ; */.  /* fflush
2a930 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69  (stdout); */.  i
2a940 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a950 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
2a960 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e  ot(pCur);.  }.en
2a970 64 5f 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69  d_insert:.  sqli
2a980 74 65 46 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b  teFree(newCell);
2a990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a9a0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
2a9b0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
2a9c0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
2a9d0 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72  ing to.  The cur
2a9e0 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
2a9f0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
2aa00 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f  dom location..*/
2aa10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2aa20 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72  eDelete(BtCursor
2aa30 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2aa40 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2aa50 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67  ->pPage;.  unsig
2aa60 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
2aa70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e  .  int rc;.  Pgn
2aa80 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b  o pgnoChild = 0;
2aa90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2aaa0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d   = pCur->pBtree-
2aab0 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
2aac0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2aad0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
2aae0 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e  ransaction!=TRAN
2aaf0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f  S_WRITE ){.    /
2ab00 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74  * Must start a t
2ab10 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72  ransaction befor
2ab20 65 20 64 6f 69 6e 67 20 61 20 64 65 6c 65 74 65  e doing a delete
2ab30 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70   */.    return p
2ab40 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2ab50 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2ab60 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2ab70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
2ab80 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
2ab90 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e   if( pCur->idx >
2aba0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  = pPage->nCell )
2abb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2abc0 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54  ITE_ERROR;  /* T
2abd0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
2abe0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79   pointing to any
2abf0 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
2ac00 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67  f( !pCur->wrFlag
2ac10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ac20 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a  QLITE_PERM;   /*
2ac30 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68   Did not open th
2ac40 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72  is cursor for wr
2ac50 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  iting */.  }.  i
2ac60 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
2ac70 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
2ac80 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a  oRoot, pCur) ){.
2ac90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2aca0 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65  E_LOCKED; /* The
2acb0 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e   table pCur poin
2acc0 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64  ts to has a read
2acd0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20   lock */.  }..  
2ace0 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  /* Restore the c
2acf0 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
2ad00 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20  sition (a no-op 
2ad10 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2ad20 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55   not in .  ** CU
2ad30 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2ad40 20 73 74 61 74 65 29 20 61 6e 64 20 73 61 76 65   state) and save
2ad50 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
2ad60 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73  f any other curs
2ad70 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f  ors .  ** open o
2ad80 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
2ad90 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69  . Then call sqli
2ada0 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
2adb0 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a   on the page.  *
2adc0 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79  * that the entry
2add0 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
2ade0 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66   from..  */.  if
2adf0 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73  ( .    (rc = res
2ae00 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
2ae10 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20  rPosition(pCur, 
2ae20 31 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  1))!=0 ||.    (r
2ae30 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
2ae40 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
2ae50 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d  noRoot, pCur))!=
2ae60 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73  0 ||.    (rc = s
2ae70 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
2ae80 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 29  e(pPage->aData))
2ae90 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  !=0.  ){.    ret
2aea0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2aeb0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c  * Locate the cel
2aec0 6c 20 77 69 74 68 69 6e 20 69 74 27 73 20 70 61  l within it's pa
2aed0 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65  ge and leave pCe
2aee0 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ll pointing to t
2aef0 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68  he.  ** data. Th
2af00 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61  e clearCell() ca
2af10 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65  ll frees any ove
2af20 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
2af30 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
2af40 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63    ** cell. The c
2af50 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74  ell itself is st
2af60 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f  ill intact..  */
2af70 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  .  pCell = findC
2af80 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2af90 3e 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50  >idx);.  if( !pP
2afa0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2afb0 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74   pgnoChild = get
2afc0 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
2afd0 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65  }.  rc = clearCe
2afe0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
2aff0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2b000 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21  urn rc;..  if( !
2b010 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2b020 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
2b030 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62   entry we are ab
2b040 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73  out to delete is
2b050 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69   not a leaf so i
2b060 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20  f we do not.    
2b070 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  ** do something 
2b080 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20  we will leave a 
2b090 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72  hole on an inter
2b0a0 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a  nal page..    **
2b0b0 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c   We have to fill
2b0c0 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76   the hole by mov
2b0d0 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72  ing in a cell fr
2b0e0 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a  om a leaf.  The.
2b0f0 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c      ** next Cell
2b100 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74   after the one t
2b110 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20  o be deleted is 
2b120 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
2b130 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  ist and.    ** t
2b140 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77  o be a leaf so w
2b150 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20  e can use it..  
2b160 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f    */.    BtCurso
2b170 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75  r leafCur;.    u
2b180 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e  nsigned char *pN
2b190 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 73 7a 4e  ext;.    int szN
2b1a0 65 78 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  ext;  /* The com
2b1b0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 69 73  piler warning is
2b1c0 20 77 72 6f 6e 67 3a 20 73 7a 4e 65 78 74 20 69   wrong: szNext i
2b1d0 73 20 61 6c 77 61 79 73 20 0a 20 20 20 20 20 20  s always .      
2b1e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
2b1f0 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65  itialized before
2b200 20 75 73 65 2e 20 20 41 64 64 69 6e 67 20 61 6e   use.  Adding an
2b210 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a   extra initializ
2b220 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ation.          
2b230 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 69 6c         ** to sil
2b240 65 6e 63 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  ence the compile
2b250 72 20 73 6c 6f 77 73 20 64 6f 77 6e 20 74 68 65  r slows down the
2b260 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 6e   code. */.    in
2b270 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75  t notUsed;.    u
2b280 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
2b290 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  mpCell = 0;.    
2b2a0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e  assert( !pPage->
2b2b0 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20 20  leafData );.    
2b2c0 67 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43  getTempCursor(pC
2b2d0 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20  ur, &leafCur);. 
2b2e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2b2f0 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75  treeNext(&leafCu
2b300 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  r, &notUsed);.  
2b310 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b320 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
2b330 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
2b340 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  M ){.        rc 
2b350 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2b360 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
2b370 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2b380 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b390 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b3a0 33 70 61 67 65 72 5f 77 72 69 74 65 28 6c 65 61  3pager_write(lea
2b3b0 66 43 75 72 2e 70 50 61 67 65 2d 3e 61 44 61 74  fCur.pPage->aDat
2b3c0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
2b3d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b3e0 29 7b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  ){.      TRACE((
2b3f0 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25  "DELETE: table=%
2b400 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61  d delete interna
2b410 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63  l from %d replac
2b420 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
2b430 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72  ",.         pCur
2b440 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
2b450 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72  e->pgno, leafCur
2b460 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a  .pPage->pgno));.
2b470 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
2b480 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2b490 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2b4a0 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
2b4b0 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43     pNext = findC
2b4c0 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67  ell(leafCur.pPag
2b4d0 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b  e, leafCur.idx);
2b4e0 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20  .      szNext = 
2b4f0 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66  cellSizePtr(leaf
2b500 43 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74  Cur.pPage, pNext
2b510 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2b520 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
2b530 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a  t)>=szNext+4 );.
2b540 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d        tempCell =
2b550 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
2b560 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  ( MX_CELL_SIZE(p
2b570 42 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Bt) );.      if(
2b580 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a   tempCell==0 ){.
2b590 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2b5a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2b5b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2b5c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b5d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  {.      rc = ins
2b5e0 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ertCell(pPage, p
2b5f0 43 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d  Cur->idx, pNext-
2b600 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d  4, szNext+4, tem
2b610 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  pCell, 0);.    }
2b620 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b630 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b640 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
2b650 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
2b660 20 70 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e   pCur->idx), pgn
2b670 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 72  oChild);.      r
2b680 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67  c = balance(pPag
2b690 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
2b6a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b6b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 64 72 6f 70  OK ){.      drop
2b6c0 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61  Cell(leafCur.pPa
2b6d0 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c  ge, leafCur.idx,
2b6e0 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   szNext);.      
2b6f0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61  rc = balance(lea
2b700 66 43 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a  fCur.pPage, 0);.
2b710 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2b720 46 72 65 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a  Free(tempCell);.
2b730 20 20 20 20 72 65 6c 65 61 73 65 54 65 6d 70 43      releaseTempC
2b740 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b  ursor(&leafCur);
2b750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52  .  }else{.    TR
2b760 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61  ACE(("DELETE: ta
2b770 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72  ble=%d delete fr
2b780 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20  om leaf %d\n",. 
2b790 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2b7a0 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
2b7b0 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  o));.    dropCel
2b7c0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2b7d0 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
2b7e0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
2b7f0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2b800 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a  (pPage, 0);.  }.
2b810 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b820 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
2b830 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
2b840 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b850 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2b860 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e  new BTree table.
2b870 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
2b880 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a  Table the page.*
2b890 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
2b8a0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
2b8b0 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  e new table..**.
2b8c0 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74  ** The type of t
2b8d0 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ype is determine
2b8e0 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70  d by the flags p
2b8f0 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20  arameter.  Only 
2b900 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
2b910 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73   values of flags
2b920 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
2b930 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61  n use.  Other va
2b940 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67  lues for.** flag
2b950 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b  s might not work
2b960 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45  :.**.**     BTRE
2b970 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c  E_INTKEY|BTREE_L
2b980 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64  EAFDATA     Used
2b990 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20   for SQL tables 
2b9a0 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a  with rowid keys.
2b9b0 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52  **     BTREE_ZER
2b9c0 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20  ODATA           
2b9d0 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20         Used for 
2b9e0 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 69  SQL indices.*/.i
2b9f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
2ba00 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
2ba10 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
2ba20 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
2ba30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2ba40 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
2ba50 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e  ge *pRoot;.  Pgn
2ba60 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e  o pgnoRoot;.  in
2ba70 74 20 72 63 3b 0a 20 20 69 66 28 20 70 42 74 2d  t rc;.  if( pBt-
2ba80 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
2ba90 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2baa0 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
2bab0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66   a transaction f
2bac0 69 72 73 74 20 2a 2f 0a 20 20 20 20 72 65 74 75  irst */.    retu
2bad0 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
2bae0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2baf0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2bb00 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
2bb10 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
2bb20 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69  );..  /* It is i
2bb30 6c 6c 65 67 61 6c 20 74 6f 20 63 72 65 61 74 65  llegal to create
2bb40 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20   a table if any 
2bb50 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e  cursors are open
2bb60 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
2bb70 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62  abase. This is b
2bb80 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76  ecause in auto-v
2bb90 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62  acuum mode the b
2bba0 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20  ackend may.  ** 
2bbb0 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 20 64  need to move a d
2bbc0 61 74 61 62 61 73 65 20 70 61 67 65 20 74 6f 20  atabase page to 
2bbd0 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
2bbe0 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 2e  e new root-page.
2bbf0 0a 20 20 2a 2a 20 49 66 20 61 6e 20 6f 70 65 6e  .  ** If an open
2bc00 20 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e   cursor was usin
2bc10 67 20 74 68 65 20 70 61 67 65 20 61 20 70 72 6f  g the page a pro
2bc20 62 6c 65 6d 20 77 6f 75 6c 64 20 6f 63 63 75 72  blem would occur
2bc30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2bc40 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
2bc50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2bc60 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 23 69 66 64  OCKED;.  }..#ifd
2bc70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2bc80 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d  UTOVACUUM.  rc =
2bc90 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42   allocatePage(pB
2bca0 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
2bcb0 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69  Root, 1, 0);.  i
2bcc0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2bcd0 63 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70  c;.#else.  if( p
2bce0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2bcf0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d  {.    Pgno pgnoM
2bd00 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76  ove;      /* Mov
2bd10 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f  e a page here to
2bd20 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
2bd30 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a  he root-page */.
2bd40 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2bd50 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70  geMove; /* The p
2bd60 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20  age to move to. 
2bd70 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  */..    /* Read 
2bd80 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74  the value of met
2bd90 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61  a[3] from the da
2bda0 74 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d  tabase to determ
2bdb0 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20  ine where the.  
2bdc0 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f    ** root page o
2bdd0 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
2bde0 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b  should go. meta[
2bdf0 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73  3] is the larges
2be00 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
2be10 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61  ** created so fa
2be20 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f  r, so the new ro
2be30 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61  ot-page is (meta
2be40 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20  [3]+1)..    */. 
2be50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2be60 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34  treeGetMeta(p, 4
2be70 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  , &pgnoRoot);.  
2be80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2be90 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
2bea0 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b  .    pgnoRoot++;
2beb0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  ..    /* The new
2bec0 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e   root-page may n
2bed0 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ot be allocated 
2bee0 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  on a pointer-map
2bef0 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20   page, or the.  
2bf00 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
2bf10 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  E page..    */. 
2bf20 20 20 20 69 66 28 20 70 67 6e 6f 52 6f 6f 74 3d     if( pgnoRoot=
2bf30 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
2bf40 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c  Bt, pgnoRoot) ||
2bf50 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  .        pgnoRoo
2bf60 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
2bf70 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
2bf80 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20     pgnoRoot++;. 
2bf90 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2bfa0 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a   pgnoRoot>=3 );.
2bfb0 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
2bfc0 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67   a page. The pag
2bfd0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
2bfe0 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f   resides at pgno
2bff0 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  Root will.    **
2c000 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   be moved to the
2c010 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2c020 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f  (unless the allo
2c030 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65  cated page happe
2c040 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73  ns.    ** to res
2c050 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29  ide at pgnoRoot)
2c060 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2c070 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70  = allocatePage(p
2c080 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20  Bt, &pPageMove, 
2c090 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52  &pgnoMove, pgnoR
2c0a0 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  oot, 1);.    if(
2c0b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c0c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2c0d0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
2c0e0 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f  ( pgnoMove!=pgno
2c0f0 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 75 38  Root ){.      u8
2c100 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67   eType;.      Pg
2c110 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
2c120 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2c130 70 50 61 67 65 4d 6f 76 65 29 3b 0a 20 20 20 20  pPageMove);.    
2c140 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
2c150 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  Bt, pgnoRoot, &p
2c160 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Root);.      if(
2c170 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c180 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2c190 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2c1a0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
2c1b0 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  t(pBt, pgnoRoot,
2c1c0 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
2c1d0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2c1e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2c1f0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
2c200 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d  OTPAGE || eType=
2c210 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
2c220 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
2c230 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2c240 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2c250 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2c260 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
2c270 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
2c280 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2c290 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46   eType!=PTRMAP_F
2c2a0 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20  REEPAGE );.     
2c2b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
2c2c0 65 72 5f 77 72 69 74 65 28 70 52 6f 6f 74 2d 3e  er_write(pRoot->
2c2d0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66  aData);.      if
2c2e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c2f0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2c300 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2c310 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2c320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c330 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
2c340 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54  e(pBt, pRoot, eT
2c350 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70  ype, iPtrPage, p
2c360 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  gnoMove);.      
2c370 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2c380 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
2c390 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c3a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2c3b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c3c0 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
2c3d0 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f  , pgnoRoot, &pRo
2c3e0 6f 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ot);.      if( r
2c3f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c400 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2c410 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2c420 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
2c430 65 72 5f 77 72 69 74 65 28 70 52 6f 6f 74 2d 3e  er_write(pRoot->
2c440 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66  aData);.      if
2c450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c460 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2c470 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2c480 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2c490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2c4a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  lse{.      pRoot
2c4b0 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20   = pPageMove;.  
2c4c0 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64    } ..    /* Upd
2c4d0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
2c4e0 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74  map and meta-dat
2c4f0 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72  a with the new r
2c500 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
2c510 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72   */.    rc = ptr
2c520 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2c530 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Root, PTRMAP_ROO
2c540 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  TPAGE, 0);.    i
2c550 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2c560 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2c570 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2c580 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
2c590 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
2c5a0 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
2c5b0 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
2c5c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2c5d0 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2c5e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2c5f0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  rc;.    }..  }el
2c600 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  se{.    rc = all
2c610 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 26  ocatePage(pBt, &
2c620 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74  pRoot, &pgnoRoot
2c630 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
2c640 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2c650 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73  .  }.#endif.  as
2c660 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67  sert( sqlite3pag
2c670 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70  er_iswriteable(p
2c680 52 6f 6f 74 2d 3e 61 44 61 74 61 29 20 29 3b 0a  Root->aData) );.
2c690 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74    zeroPage(pRoot
2c6a0 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45  , flags | PTF_LE
2c6b0 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61  AF);.  sqlite3pa
2c6c0 67 65 72 5f 75 6e 72 65 66 28 70 52 6f 6f 74 2d  ger_unref(pRoot-
2c6d0 3e 61 44 61 74 61 29 3b 0a 20 20 2a 70 69 54 61  >aData);.  *piTa
2c6e0 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52  ble = (int)pgnoR
2c6f0 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oot;.  return SQ
2c700 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2c710 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65  * Erase the give
2c720 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
2c730 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c  and all its chil
2c740 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  dren.  Return.**
2c750 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
2c760 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74   freelist..*/.st
2c770 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61  atic int clearDa
2c780 74 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74  tabasePage(.  Bt
2c790 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
2c7a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54         /* The BT
2c7b0 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ree that contain
2c7c0 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  s the table */. 
2c7d0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
2c7e0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2c7f0 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a  umber to clear *
2c800 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
2c810 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72  rent,     /* Par
2c820 65 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20  ent page.  NULL 
2c830 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a  for the root */.
2c840 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c    int freePageFl
2c850 61 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c  ag      /* Deall
2c860 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72  ocate page if tr
2c870 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ue */.){.  MemPa
2c880 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
2c890 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
2c8a0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
2c8b0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
2c8c0 20 70 67 6e 6f 3e 73 71 6c 69 74 65 33 70 61 67   pgno>sqlite3pag
2c8d0 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74  er_pagecount(pBt
2c8e0 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
2c8f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2c900 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
2c910 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ..  rc = getAndI
2c920 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
2c930 6f 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65  o, &pPage, pPare
2c940 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
2c950 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2c960 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 72 63  sepage_out;.  rc
2c970 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
2c980 77 72 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61  write(pPage->aDa
2c990 74 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ta);.  if( rc ) 
2c9a0 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2c9b0 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f  sepage_out;.  fo
2c9c0 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
2c9d0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2c9e0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2c9f0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
2ca00 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2ca10 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2ca20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2ca30 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
2ca40 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70  pCell), pPage->p
2ca50 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20  Parent, 1);.    
2ca60 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2ca70 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2ca80 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2ca90 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
2caa0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
2cab0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2cac0 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
2cad0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66  ge_out;.  }.  if
2cae0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2caf0 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  {.    rc = clear
2cb00 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
2cb10 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2cb20 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50  e->aData[8]), pP
2cb30 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29  age->pParent, 1)
2cb40 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2cb50 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2cb60 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2cb70 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61   if( freePageFla
2cb80 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72  g ){.    rc = fr
2cb90 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2cba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 65 72 6f   }else{.    zero
2cbb0 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
2cbc0 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54  e->aData[0] | PT
2cbd0 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c  F_LEAF);.  }..cl
2cbe0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2cbf0 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  out:.  releasePa
2cc00 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
2cc10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2cc20 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f   Delete all info
2cc30 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73  rmation from a s
2cc40 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
2cc50 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54  he database.  iT
2cc60 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70  able is.** the p
2cc70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2cc80 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
2cc90 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73  ble.  After this
2cca0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2ccb0 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  ,.** the root pa
2ccc0 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74  ge is empty, but
2ccd0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a   still exists..*
2cce0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2ccf0 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
2cd00 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
2cd10 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2cd20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72  open.** read cur
2cd30 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  sors on the tabl
2cd40 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63  e.  Open write c
2cd50 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64  ursors are moved
2cd60 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   to the.** root 
2cd70 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  of the table..*/
2cd80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2cd90 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65  eClearTable(Btre
2cda0 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
2cdb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
2cdc0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
2cdd0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2cde0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
2cdf0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70 53 71 6c  e3 *db = p->pSql
2ce00 69 74 65 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  ite;.  if( p->in
2ce10 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
2ce20 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
2ce30 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2ce40 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2ce50 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2ce60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2ce70 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  is connection is
2ce80 20 6e 6f 74 20 69 6e 20 72 65 61 64 2d 75 6e 63   not in read-unc
2ce90 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 61 6e  ommitted mode an
2cea0 64 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 0a  d currently has.
2ceb0 20 20 2a 2a 20 61 20 72 65 61 64 2d 63 75 72 73    ** a read-curs
2cec0 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74  or open on the t
2ced0 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72  able being clear
2cee0 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
2cef0 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20  E_LOCKED..  */. 
2cf00 20 69 66 28 20 30 3d 3d 64 62 20 7c 7c 20 30 3d   if( 0==db || 0=
2cf10 3d 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  =(db->flags&SQLI
2cf20 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2cf30 65 64 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ed) ){.    for(p
2cf40 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
2cf50 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
2cf60 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
2cf70 20 69 66 28 20 70 43 75 72 2d 3e 70 42 74 72 65   if( pCur->pBtre
2cf80 65 3d 3d 70 20 26 26 20 70 43 75 72 2d 3e 70 67  e==p && pCur->pg
2cf90 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54  noRoot==(Pgno)iT
2cfa0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
2cfb0 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 77 72 46  if( 0==pCur->wrF
2cfc0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
2cfd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2cfe0 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 20 20 7d  OCKED;.        }
2cff0 0a 20 20 20 20 20 20 20 20 6d 6f 76 65 54 6f 52  .        moveToR
2d000 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  oot(pCur);.     
2d010 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2d020 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
2d030 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 63 75 72 73  tion of all curs
2d040 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
2d050 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
2d060 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2d070 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2d080 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  pBt, iTable, 0))
2d090 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2d0a0 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  c;.  }..  return
2d0b0 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2d0c0 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
2d0d0 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  able, 0, 0);.}..
2d0e0 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
2d0f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61  information in a
2d100 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74   table and add t
2d110 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
2d120 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66  able to.** the f
2d130 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74  reelist.  Except
2d140 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  , the root of th
2d150 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c  e principle tabl
2d160 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a  e (the one on.**
2d170 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65   page 1) is neve
2d180 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  r added to the f
2d190 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  reelist..**.** T
2d1a0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2d1b0 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
2d1c0 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
2d1d0 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
2d1e0 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  * cursors on the
2d1f0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
2d200 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65   AUTOVACUUM is e
2d210 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70  nabled and the p
2d220 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73  age at iTable is
2d230 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a   not the last.**
2d240 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
2d250 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2d260 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72   then the last r
2d270 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20  oot page .** in 
2d280 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d290 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20  e is moved into 
2d2a0 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  the slot formerl
2d2b0 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a  y occupied by.**
2d2c0 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74   iTable and that
2d2d0 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65   last slot forme
2d2e0 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20  rly occupied by 
2d2f0 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2d300 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ge.** is added t
2d310 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  o the freelist i
2d320 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65  nstead of iTable
2d330 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20  .  In this say, 
2d340 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  all.** root page
2d350 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68  s are kept at th
2d360 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2d370 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d380 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65  , which.** is ne
2d390 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f  cessary for AUTO
2d3a0 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72  VACUUM to work r
2d3b0 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20  ight.  *piMoved 
2d3c0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a  is set to the .*
2d3d0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  * page number th
2d3e0 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68  at used to be th
2d3f0 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2d400 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66   in the file bef
2d410 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e  ore.** the move.
2d420 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74    If no page get
2d430 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65  s moved, *piMove
2d440 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
2d450 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  * The last root 
2d460 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64  page is recorded
2d470 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20   in meta[3] and 
2d480 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
2d490 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74  meta[3] is updat
2d4a0 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ed by this proce
2d4b0 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dure..*/.int sql
2d4c0 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
2d4d0 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
2d4e0 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
2d4f0 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
2d500 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2d510 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ge = 0;.  BtShar
2d520 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2d530 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
2d540 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2d550 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2d560 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2d570 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2d580 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2d590 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69   }..  /* It is i
2d5a0 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61  llegal to drop a
2d5b0 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75   table if any cu
2d5c0 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f  rsors are open o
2d5d0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
2d5e0 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ase. This is bec
2d5f0 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63  ause in auto-vac
2d600 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63  uum mode the bac
2d610 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65  kend may.  ** ne
2d620 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68  ed to move anoth
2d630 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20  er root-page to 
2d640 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20  fill a gap left 
2d650 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20  by the deleted. 
2d660 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49   ** root page. I
2d670 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  f an open cursor
2d680 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20   was using this 
2d690 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77  page a problem w
2d6a0 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72  ould .  ** occur
2d6b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2d6c0 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
2d6d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2d6e0 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63  OCKED;.  }..  rc
2d6f0 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
2d700 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70  (Pgno)iTable, &p
2d710 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2d720 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
2d730 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2d740 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54  ClearTable(p, iT
2d750 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20  able);.  if( rc 
2d760 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
2d770 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
2d780 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2d790 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a   *piMoved = 0;..
2d7a0 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29    if( iTable>1 )
2d7b0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2d7c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2d7d0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2d7e0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
2d7f0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2d800 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  ;.#else.    if( 
2d810 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2d820 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61  ){.      Pgno ma
2d830 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20  xRootPgno;.     
2d840 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2d850 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20  eeGetMeta(p, 4, 
2d860 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20  &maxRootPgno);. 
2d870 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2d880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d890 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2d8a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
2d8b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2d8c0 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62  ..      if( iTab
2d8d0 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20  le==maxRootPgno 
2d8e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
2d8f0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
2d900 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20   dropped is the 
2d910 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c  table with the l
2d920 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
2d930 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
2d940 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
2d950 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74  se, put the root
2d960 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65   page on the fre
2d970 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20  e list. .       
2d980 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
2d990 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
2d9a0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2d9b0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2d9c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d9d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d9e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d9f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2da00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2da10 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
2da20 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e  g dropped does n
2da30 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67  ot have the larg
2da40 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
2da50 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
2da60 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2da70 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67   So move the pag
2da80 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f  e that does into
2da90 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
2daa0 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
2dab0 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61   deleted root-pa
2dac0 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ge..        */. 
2dad0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
2dae0 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72  pMove;.        r
2daf0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2db00 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2db10 67 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78  getPage(pBt, max
2db20 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65  RootPgno, &pMove
2db30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2db40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2db50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2db60 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2db70 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
2db80 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d  catePage(pBt, pM
2db90 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  ove, PTRMAP_ROOT
2dba0 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 29  PAGE, 0, iTable)
2dbb0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2dbc0 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
2dbd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2dbe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dbf0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2dc00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dc10 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
2dc20 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
2dc30 20 26 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20   &pMove);.      
2dc40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2dc50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2dc60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2dc70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2dc80 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76   = freePage(pMov
2dc90 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
2dca0 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  asePage(pMove);.
2dcb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2dcc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dcd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2dce0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2dcf0 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d      *piMoved = m
2dd00 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
2dd10 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
2dd20 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72  t the new 'max-r
2dd30 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20  oot-page' value 
2dd40 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2dd50 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20  header. This.   
2dd60 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64     ** is the old
2dd70 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c   value less one,
2dd80 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69   less one more i
2dd90 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74  f that happens t
2dda0 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20  o.      ** be a 
2ddb0 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
2ddc0 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e  , less one again
2ddd0 20 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a   if that is the.
2dde0 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47        ** PENDING
2ddf0 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20  _BYTE_PAGE..    
2de00 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f    */.      maxRo
2de10 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
2de20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
2de30 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2de40 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
2de50 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
2de60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2de70 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
2de80 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
2de90 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  Bt, maxRootPgno)
2dea0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
2deb0 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
2dec0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2ded0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45   maxRootPgno!=PE
2dee0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2def0 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72  pBt) );..      r
2df00 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2df10 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c  UpdateMeta(p, 4,
2df20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20   maxRootPgno);. 
2df30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2df40 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
2df50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  age);.      rele
2df60 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2df70 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
2df80 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
2df90 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
2dfa0 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64  Table was called
2dfb0 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20   on page 1. */. 
2dfc0 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
2dfd0 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  e, PTF_INTKEY|PT
2dfe0 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65  F_LEAF );.    re
2dff0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2e000 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2e010 63 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  c;  .}.../*.** R
2e020 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66  ead the meta-inf
2e030 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20  ormation out of 
2e040 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
2e050 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20    Meta[0].** is 
2e060 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
2e070 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ee pages current
2e080 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ly in the databa
2e090 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20  se.  Meta[1].** 
2e0a0 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d  through meta[15]
2e0b0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66   are available f
2e0c0 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65 72  or use by higher
2e0d0 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30   layers.  Meta[0
2e0e0 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ].** is read-onl
2e0f0 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61 72  y, the others ar
2e100 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a  e read/write..**
2e110 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20   .** The schema 
2e120 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65  layer numbers me
2e130 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72  ta values differ
2e140 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73  ently.  At the s
2e150 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28  chema.** layer (
2e160 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69  and the SetCooki
2e170 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65  e and ReadCookie
2e180 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75   opcodes) the nu
2e190 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20  mber of.** free 
2e1a0 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73  pages is not vis
2e1b0 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65  ible.  So Cookie
2e1c0 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20  [0] is the same 
2e1d0 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69  as Meta[1]..*/.i
2e1e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
2e1f0 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  etMeta(Btree *p,
2e200 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70   int idx, u32 *p
2e210 4d 65 74 61 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Meta){.  int rc;
2e220 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2e230 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65   *pP1;.  BtShare
2e240 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2e250 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61  ..  /* Reading a
2e260 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65   meta-data value
2e270 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61 64   requires a read
2e280 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20  -lock on page 1 
2e290 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20  (and hence.  ** 
2e2a0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
2e2b0 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62  r table. We grab
2e2c0 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72   this lock regar
2e2d0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2e2e0 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65   or.  ** not the
2e2f0 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
2e300 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
2e310 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20 72  set (the table r
2e320 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20 20  ooted at page.  
2e330 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64 20  ** 1 is treated 
2e340 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
2e350 65 20 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c  e by queryTableL
2e360 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61  ock() and lockTa
2e370 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72  ble())..  */.  r
2e380 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  c = queryTableLo
2e390 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f  ck(p, 1, READ_LO
2e3a0 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
2e3b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e3c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2e3d0 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
2e3e0 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
2e3f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
2e400 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61 67  er_get(pBt->pPag
2e410 65 72 2c 20 31 2c 20 28 76 6f 69 64 2a 2a 29 26  er, 1, (void**)&
2e420 70 50 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29  pP1);.  if( rc )
2e430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
2e440 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65 28  Meta = get4byte(
2e450 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d  &pP1[36 + idx*4]
2e460 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  );.  sqlite3page
2e470 72 5f 75 6e 72 65 66 28 70 50 31 29 3b 0a 0a 20  r_unref(pP1);.. 
2e480 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75   /* If autovacuu
2e490 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20  med is disabled 
2e4a0 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75  in this build bu
2e4b0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
2e4c0 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20  to .  ** access 
2e4d0 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20  an autovacuumed 
2e4e0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d  database, then m
2e4f0 61 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ake the database
2e500 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f   readonly. .  */
2e510 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
2e520 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2e530 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a   if( idx==4 && *
2e540 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72  pMeta>0 ) pBt->r
2e550 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e  eadOnly = 1;.#en
2e560 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74  dif..  /* Grab t
2e570 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  he read-lock on 
2e580 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20  page 1. */.  rc 
2e590 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31  = lockTable(p, 1
2e5a0 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
2e5b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2e5c0 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69  .** Write meta-i
2e5d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20  nformation back 
2e5e0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
2e5f0 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a  e.  Meta[0] is.*
2e600 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20  * read-only and 
2e610 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74  may not be writt
2e620 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
2e630 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
2e640 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
2e650 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b  idx, u32 iMeta){
2e660 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2e670 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
2e680 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b  igned char *pP1;
2e690 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
2e6a0 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69  ert( idx>=1 && i
2e6b0 64 78 3c 3d 31 35 20 29 3b 0a 20 20 69 66 28 20  dx<=15 );.  if( 
2e6c0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
2e6d0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
2e6e0 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f  eturn pBt->readO
2e6f0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
2e700 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
2e710 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65  RROR;.  }.  asse
2e720 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 21  rt( pBt->pPage1!
2e730 3d 30 20 29 3b 0a 20 20 70 50 31 20 3d 20 70 42  =0 );.  pP1 = pB
2e740 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
2e750 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2e760 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 31 29  pager_write(pP1)
2e770 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2e780 75 72 6e 20 72 63 3b 0a 20 20 70 75 74 34 62 79  urn rc;.  put4by
2e790 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78  te(&pP1[36 + idx
2e7a0 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 20 20 72  *4], iMeta);.  r
2e7b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e7c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2e7d0 20 74 68 65 20 66 6c 61 67 20 62 79 74 65 20 61   the flag byte a
2e7e0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2e7f0 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
2e800 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   the cursor.** i
2e810 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2e820 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20  ting to..*/.int 
2e830 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67  sqlite3BtreeFlag
2e840 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2e850 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
2e860 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52 5f  at about CURSOR_
2e870 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74  REQUIRESEEK stat
2e880 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64  e? Probably need
2e890 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65   to call.  ** re
2e8a0 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2e8b0 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72  orPosition() her
2e8c0 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  e..  */.  MemPag
2e8d0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2e8e0 3e 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e  >pPage;.  return
2e8f0 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d 3e   pPage ? pPage->
2e900 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2e910 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a  Offset] : 0;.}..
2e920 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2e930 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
2e940 61 20 64 69 73 61 73 73 65 6d 62 6c 79 20 6f 66  a disassembly of
2e950 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
2e960 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70  on standard outp
2e970 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
2e980 65 0a 2a 2a 20 69 73 20 75 73 65 64 20 66 6f 72  e.** is used for
2e990 20 64 65 62 75 67 67 69 6e 67 20 61 6e 64 20 74   debugging and t
2e9a0 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  esting only..*/.
2e9b0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
2e9c0 50 61 67 65 44 75 6d 70 28 42 74 53 68 61 72 65  PageDump(BtShare
2e9d0 64 20 2a 70 42 74 2c 20 69 6e 74 20 70 67 6e 6f  d *pBt, int pgno
2e9e0 2c 20 69 6e 74 20 72 65 63 75 72 73 69 76 65 2c  , int recursive,
2e9f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
2ea00 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
2ea10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2ea20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 63 3b 0a 20    int i, j, c;. 
2ea30 20 69 6e 74 20 6e 46 72 65 65 3b 0a 20 20 75 31   int nFree;.  u1
2ea40 36 20 69 64 78 3b 0a 20 20 69 6e 74 20 68 64 72  6 idx;.  int hdr
2ea50 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
2ea60 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75   int isInit;.  u
2ea70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
2ea80 74 61 3b 0a 20 20 63 68 61 72 20 72 61 6e 67 65  ta;.  char range
2ea90 5b 32 30 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  [20];.  unsigned
2eaa0 20 63 68 61 72 20 70 61 79 6c 6f 61 64 5b 32 30   char payload[20
2eab0 5d 3b 0a 0a 20 20 72 63 20 3d 20 67 65 74 50 61  ];..  rc = getPa
2eac0 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 70 67  ge(pBt, (Pgno)pg
2ead0 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69  no, &pPage);.  i
2eae0 73 49 6e 69 74 20 3d 20 70 50 61 67 65 2d 3e 69  sInit = pPage->i
2eaf0 73 49 6e 69 74 3b 0a 20 20 69 66 28 20 70 50 61  sInit;.  if( pPa
2eb00 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  ge->isInit==0 ){
2eb10 0a 20 20 20 20 69 6e 69 74 50 61 67 65 28 70 50  .    initPage(pP
2eb20 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  age, pParent);. 
2eb30 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
2eb40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2eb50 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  }.  hdr = pPage-
2eb60 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61  >hdrOffset;.  da
2eb70 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2eb80 61 3b 0a 20 20 63 20 3d 20 64 61 74 61 5b 68 64  a;.  c = data[hd
2eb90 72 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74  r];.  pPage->int
2eba0 4b 65 79 20 3d 20 28 63 20 26 20 28 50 54 46 5f  Key = (c & (PTF_
2ebb0 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
2ebc0 41 54 41 29 29 21 3d 30 3b 0a 20 20 70 50 61 67  ATA))!=0;.  pPag
2ebd0 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28 63  e->zeroData = (c
2ebe0 20 26 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29   & PTF_ZERODATA)
2ebf0 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  !=0;.  pPage->le
2ec00 61 66 44 61 74 61 20 3d 20 28 63 20 26 20 50 54  afData = (c & PT
2ec10 46 5f 4c 45 41 46 44 41 54 41 29 21 3d 30 3b 0a  F_LEAFDATA)!=0;.
2ec20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
2ec30 28 63 20 26 20 50 54 46 5f 4c 45 41 46 29 21 3d  (c & PTF_LEAF)!=
2ec40 30 3b 0a 20 20 70 50 61 67 65 2d 3e 68 61 73 44  0;.  pPage->hasD
2ec50 61 74 61 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a  ata = !(pPage->z
2ec60 65 72 6f 44 61 74 61 20 7c 7c 20 28 21 70 50 61  eroData || (!pPa
2ec70 67 65 2d 3e 6c 65 61 66 20 26 26 20 70 50 61 67  ge->leaf && pPag
2ec80 65 2d 3e 6c 65 61 66 44 61 74 61 29 29 3b 0a 20  e->leafData));. 
2ec90 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
2eca0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
2ecb0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
2ecc0 72 69 6e 74 66 28 22 50 41 47 45 20 25 64 3a 20  rintf("PAGE %d: 
2ecd0 20 66 6c 61 67 73 3d 30 78 25 30 32 78 20 20 66   flags=0x%02x  f
2ece0 72 61 67 3d 25 64 20 20 20 70 61 72 65 6e 74 3d  rag=%d   parent=
2ecf0 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 0a 20 20 20  %d\n", pgno,.   
2ed00 20 64 61 74 61 5b 68 64 72 5d 2c 20 64 61 74 61   data[hdr], data
2ed10 5b 68 64 72 2b 37 5d 2c 20 0a 20 20 20 20 28 70  [hdr+7], .    (p
2ed20 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 26 26 20  Page->isInit && 
2ed30 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 20  pPage->pParent) 
2ed40 3f 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ? pPage->pParent
2ed50 2d 3e 70 67 6e 6f 20 3a 20 30 29 3b 0a 20 20 61  ->pgno : 0);.  a
2ed60 73 73 65 72 74 28 20 68 64 72 20 3d 3d 20 28 70  ssert( hdr == (p
2ed70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
2ed80 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 68 64 72  ) );.  idx = hdr
2ed90 20 2b 20 31 32 20 2d 20 70 50 61 67 65 2d 3e 6c   + 12 - pPage->l
2eda0 65 61 66 2a 34 3b 0a 20 20 66 6f 72 28 69 3d 30  eaf*4;.  for(i=0
2edb0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
2edc0 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
2edd0 66 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69  fo;.    Pgno chi
2ede0 6c 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ld;.    unsigned
2edf0 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
2ee00 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 69 6e    int sz;.    in
2ee10 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 61 64 64  t addr;..    add
2ee20 72 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  r = get2byte(&da
2ee30 74 61 5b 69 64 78 20 2b 20 32 2a 69 5d 29 3b 0a  ta[idx + 2*i]);.
2ee40 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 64 61 74      pCell = &dat
2ee50 61 5b 61 64 64 72 5d 3b 0a 20 20 20 20 70 61 72  a[addr];.    par
2ee60 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2ee70 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
2ee80 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 53      sz = info.nS
2ee90 69 7a 65 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  ize;.    sprintf
2eea0 28 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64 22 2c  (range,"%d..%d",
2eeb0 20 61 64 64 72 2c 20 61 64 64 72 2b 73 7a 2d 31   addr, addr+sz-1
2eec0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
2eed0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2eee0 63 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 7d  child = 0;.    }
2eef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 69 6c  else{.      chil
2ef00 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  d = get4byte(pCe
2ef10 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
2ef20 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  z = info.nData;.
2ef30 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2ef40 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69  intKey ) sz += i
2ef50 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 69 66  nfo.nKey;.    if
2ef60 28 20 73 7a 3e 73 69 7a 65 6f 66 28 70 61 79 6c  ( sz>sizeof(payl
2ef70 6f 61 64 29 2d 31 20 29 20 73 7a 20 3d 20 73 69  oad)-1 ) sz = si
2ef80 7a 65 6f 66 28 70 61 79 6c 6f 61 64 29 2d 31 3b  zeof(payload)-1;
2ef90 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 61 79 6c  .    memcpy(payl
2efa0 6f 61 64 2c 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  oad, &pCell[info
2efb0 2e 6e 48 65 61 64 65 72 5d 2c 20 73 7a 29 3b 0a  .nHeader], sz);.
2efc0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
2efd0 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  z; j++){.      i
2efe0 66 28 20 70 61 79 6c 6f 61 64 5b 6a 5d 3c 30 78  f( payload[j]<0x
2eff0 32 30 20 7c 7c 20 70 61 79 6c 6f 61 64 5b 6a 5d  20 || payload[j]
2f000 3e 30 78 37 66 20 29 20 70 61 79 6c 6f 61 64 5b  >0x7f ) payload[
2f010 6a 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7d 0a  j] = '.';.    }.
2f020 20 20 20 20 70 61 79 6c 6f 61 64 5b 73 7a 5d 20      payload[sz] 
2f030 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2f040 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
2f050 20 20 20 22 63 65 6c 6c 20 25 32 64 3a 20 69 3d     "cell %2d: i=
2f060 25 2d 31 30 73 20 63 68 6c 64 3d 25 2d 34 64 20  %-10s chld=%-4d 
2f070 6e 6b 3d 25 2d 34 6c 6c 64 20 6e 64 3d 25 2d 34  nk=%-4lld nd=%-4
2f080 64 20 70 61 79 6c 6f 61 64 3d 25 73 5c 6e 22 2c  d payload=%s\n",
2f090 0a 20 20 20 20 20 20 69 2c 20 72 61 6e 67 65 2c  .      i, range,
2f0a0 20 63 68 69 6c 64 2c 20 69 6e 66 6f 2e 6e 4b 65   child, info.nKe
2f0b0 79 2c 20 69 6e 66 6f 2e 6e 44 61 74 61 2c 20 70  y, info.nData, p
2f0c0 61 79 6c 6f 61 64 0a 20 20 20 20 29 3b 0a 20 20  ayload.    );.  
2f0d0 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
2f0e0 6c 65 61 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  leaf ){.    sqli
2f0f0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2f100 72 69 67 68 74 5f 63 68 69 6c 64 3a 20 25 64 5c  right_child: %d\
2f110 6e 22 2c 20 67 65 74 34 62 79 74 65 28 26 64 61  n", get4byte(&da
2f120 74 61 5b 68 64 72 2b 38 5d 29 29 3b 0a 20 20 7d  ta[hdr+8]));.  }
2f130 0a 20 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  .  nFree = 0;.  
2f140 69 20 3d 20 30 3b 0a 20 20 69 64 78 20 3d 20 67  i = 0;.  idx = g
2f150 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2f160 72 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20  r+1]);.  while( 
2f170 69 64 78 3e 30 20 26 26 20 69 64 78 3c 70 50 61  idx>0 && idx<pPa
2f180 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2f190 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ize ){.    int s
2f1a0 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  z = get2byte(&da
2f1b0 74 61 5b 69 64 78 2b 32 5d 29 3b 0a 20 20 20 20  ta[idx+2]);.    
2f1c0 73 70 72 69 6e 74 66 28 72 61 6e 67 65 2c 22 25  sprintf(range,"%
2f1d0 64 2e 2e 25 64 22 2c 20 69 64 78 2c 20 69 64 78  d..%d", idx, idx
2f1e0 2b 73 7a 2d 31 29 3b 0a 20 20 20 20 6e 46 72 65  +sz-1);.    nFre
2f1f0 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 73 71 6c  e += sz;.    sql
2f200 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2f210 22 66 72 65 65 62 6c 6f 63 6b 20 25 32 64 3a 20  "freeblock %2d: 
2f220 69 3d 25 2d 31 30 73 20 73 69 7a 65 3d 25 2d 34  i=%-10s size=%-4
2f230 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20  d total=%d\n",. 
2f240 20 20 20 20 20 20 69 2c 20 72 61 6e 67 65 2c 20        i, range, 
2f250 73 7a 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20  sz, nFree);.    
2f260 69 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 26  idx = get2byte(&
2f270 64 61 74 61 5b 69 64 78 5d 29 3b 0a 20 20 20 20  data[idx]);.    
2f280 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  i++;.  }.  if( i
2f290 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  dx!=0 ){.    sql
2f2a0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2f2b0 22 45 52 52 4f 52 3a 20 6e 65 78 74 20 66 72 65  "ERROR: next fre
2f2c0 65 62 6c 6f 63 6b 20 69 6e 64 65 78 20 6f 75 74  eblock index out
2f2d0 20 6f 66 20 72 61 6e 67 65 3a 20 25 64 5c 6e 22   of range: %d\n"
2f2e0 2c 20 69 64 78 29 3b 0a 20 20 7d 0a 20 20 69 66  , idx);.  }.  if
2f2f0 28 20 72 65 63 75 72 73 69 76 65 20 26 26 20 21  ( recursive && !
2f300 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f310 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
2f320 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
2f330 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2f340 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2f350 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
2f360 20 20 62 74 72 65 65 50 61 67 65 44 75 6d 70 28    btreePageDump(
2f370 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
2f380 65 6c 6c 29 2c 20 31 2c 20 70 50 61 67 65 29 3b  ell), 1, pPage);
2f390 0a 20 20 20 20 20 20 69 64 78 20 3d 20 67 65 74  .      idx = get
2f3a0 32 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  2byte(pCell);.  
2f3b0 20 20 7d 0a 20 20 20 20 62 74 72 65 65 50 61 67    }.    btreePag
2f3c0 65 44 75 6d 70 28 70 42 74 2c 20 67 65 74 34 62  eDump(pBt, get4b
2f3d0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 38 5d  yte(&data[hdr+8]
2f3e0 29 2c 20 31 2c 20 70 50 61 67 65 29 3b 0a 20 20  ), 1, pPage);.  
2f3f0 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  }.  pPage->isIni
2f400 74 20 3d 20 69 73 49 6e 69 74 3b 0a 20 20 73 71  t = isInit;.  sq
2f410 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
2f420 28 64 61 74 61 29 3b 0a 20 20 66 66 6c 75 73 68  (data);.  fflush
2f430 28 73 74 64 6f 75 74 29 3b 0a 20 20 72 65 74 75  (stdout);.  retu
2f440 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2f450 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2f460 50 61 67 65 44 75 6d 70 28 42 74 72 65 65 20 2a  PageDump(Btree *
2f470 70 2c 20 69 6e 74 20 70 67 6e 6f 2c 20 69 6e 74  p, int pgno, int
2f480 20 72 65 63 75 72 73 69 76 65 29 7b 0a 20 20 72   recursive){.  r
2f490 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 44  eturn btreePageD
2f4a0 75 6d 70 28 70 2d 3e 70 42 74 2c 20 70 67 6e 6f  ump(p->pBt, pgno
2f4b0 2c 20 72 65 63 75 72 73 69 76 65 2c 20 30 29 3b  , recursive, 0);
2f4c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
2f4d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
2f4e0 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ST) && defined(S
2f4f0 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
2f500 2a 2a 20 46 69 6c 6c 20 61 52 65 73 75 6c 74 5b  ** Fill aResult[
2f510 5d 20 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69  ] with informati
2f520 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 65 6e 74  on about the ent
2f530 72 79 20 61 6e 64 20 70 61 67 65 20 74 68 61 74  ry and page that
2f540 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69   the.** cursor i
2f550 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a  s pointing to..*
2f560 2a 20 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  * .**   aResult[
2f570 30 5d 20 3d 20 20 54 68 65 20 70 61 67 65 20 6e  0] =  The page n
2f580 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73 75  umber.**   aResu
2f590 6c 74 5b 31 5d 20 3d 20 20 54 68 65 20 65 6e 74  lt[1] =  The ent
2f5a0 72 79 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61  ry number.**   a
2f5b0 52 65 73 75 6c 74 5b 32 5d 20 3d 20 20 54 6f 74  Result[2] =  Tot
2f5c0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  al number of ent
2f5d0 72 69 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67  ries on this pag
2f5e0 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 33  e.**   aResult[3
2f5f0 5d 20 3d 20 20 43 65 6c 6c 20 73 69 7a 65 20 28  ] =  Cell size (
2f600 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 2b 20  local payload + 
2f610 68 65 61 64 65 72 29 0a 2a 2a 20 20 20 61 52 65  header).**   aRe
2f620 73 75 6c 74 5b 34 5d 20 3d 20 20 4e 75 6d 62 65  sult[4] =  Numbe
2f630 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
2f640 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a 20  on this page.** 
2f650 20 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20 20    aResult[5] =  
2f660 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  Number of free b
2f670 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 70 61 67  locks on the pag
2f680 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 36  e.**   aResult[6
2f690 5d 20 3d 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f  ] =  Total paylo
2f6a0 61 64 20 73 69 7a 65 20 28 6c 6f 63 61 6c 20 2b  ad size (local +
2f6b0 20 6f 76 65 72 66 6c 6f 77 29 0a 2a 2a 20 20 20   overflow).**   
2f6c0 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 20 48 65  aResult[7] =  He
2f6d0 61 64 65 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ader size in byt
2f6e0 65 73 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  es.**   aResult[
2f6f0 38 5d 20 3d 20 20 4c 6f 63 61 6c 20 70 61 79 6c  8] =  Local payl
2f700 6f 61 64 20 73 69 7a 65 0a 2a 2a 20 20 20 61 52  oad size.**   aR
2f710 65 73 75 6c 74 5b 39 5d 20 3d 20 20 50 61 72 65  esult[9] =  Pare
2f720 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a  nt page number.*
2f730 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2f740 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
2f750 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
2f760 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  ing only..*/.int
2f770 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
2f780 73 6f 72 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  sorInfo(BtCursor
2f790 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 61 52 65   *pCur, int *aRe
2f7a0 73 75 6c 74 2c 20 69 6e 74 20 75 70 43 6e 74 29  sult, int upCnt)
2f7b0 7b 0a 20 20 69 6e 74 20 63 6e 74 2c 20 69 64 78  {.  int cnt, idx
2f7c0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2f7d0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2f7e0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 74 6d 70  ;.  BtCursor tmp
2f7f0 43 75 72 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d  Cur;..  int rc =
2f800 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
2f810 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2f820 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63  ur, 1);.  if( rc
2f830 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f840 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f850 7d 0a 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69  }..  pageIntegri
2f860 74 79 28 70 50 61 67 65 29 3b 0a 20 20 61 73 73  ty(pPage);.  ass
2f870 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2f880 69 74 20 29 3b 0a 20 20 67 65 74 54 65 6d 70 43  it );.  getTempC
2f890 75 72 73 6f 72 28 70 43 75 72 2c 20 26 74 6d 70  ursor(pCur, &tmp
2f8a0 43 75 72 29 3b 0a 20 20 77 68 69 6c 65 28 20 75  Cur);.  while( u
2f8b0 70 43 6e 74 2d 2d 20 29 7b 0a 20 20 20 20 6d 6f  pCnt-- ){.    mo
2f8c0 76 65 54 6f 50 61 72 65 6e 74 28 26 74 6d 70 43  veToParent(&tmpC
2f8d0 75 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ur);.  }.  pPage
2f8e0 20 3d 20 74 6d 70 43 75 72 2e 70 50 61 67 65 3b   = tmpCur.pPage;
2f8f0 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79  .  pageIntegrity
2f900 28 70 50 61 67 65 29 3b 0a 20 20 61 52 65 73 75  (pPage);.  aResu
2f910 6c 74 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 70  lt[0] = sqlite3p
2f920 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
2f930 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
2f940 20 61 73 73 65 72 74 28 20 61 52 65 73 75 6c 74   assert( aResult
2f950 5b 30 5d 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  [0]==pPage->pgno
2f960 20 29 3b 0a 20 20 61 52 65 73 75 6c 74 5b 31 5d   );.  aResult[1]
2f970 20 3d 20 74 6d 70 43 75 72 2e 69 64 78 3b 0a 20   = tmpCur.idx;. 
2f980 20 61 52 65 73 75 6c 74 5b 32 5d 20 3d 20 70 50   aResult[2] = pP
2f990 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66  age->nCell;.  if
2f9a0 28 20 74 6d 70 43 75 72 2e 69 64 78 3e 3d 30 20  ( tmpCur.idx>=0 
2f9b0 26 26 20 74 6d 70 43 75 72 2e 69 64 78 3c 70 50  && tmpCur.idx<pP
2f9c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2f9d0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 26 74    getCellInfo(&t
2f9e0 6d 70 43 75 72 29 3b 0a 20 20 20 20 61 52 65 73  mpCur);.    aRes
2f9f0 75 6c 74 5b 33 5d 20 3d 20 74 6d 70 43 75 72 2e  ult[3] = tmpCur.
2fa00 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20  info.nSize;.    
2fa10 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 74 6d 70  aResult[6] = tmp
2fa20 43 75 72 2e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  Cur.info.nData;.
2fa30 20 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d      aResult[7] =
2fa40 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 48 65   tmpCur.info.nHe
2fa50 61 64 65 72 3b 0a 20 20 20 20 61 52 65 73 75 6c  ader;.    aResul
2fa60 74 5b 38 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e  t[8] = tmpCur.in
2fa70 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c  fo.nLocal;.  }el
2fa80 73 65 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b  se{.    aResult[
2fa90 33 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52 65 73  3] = 0;.    aRes
2faa0 75 6c 74 5b 36 5d 20 3d 20 30 3b 0a 20 20 20 20  ult[6] = 0;.    
2fab0 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 30 3b 0a  aResult[7] = 0;.
2fac0 20 20 20 20 61 52 65 73 75 6c 74 5b 38 5d 20 3d      aResult[8] =
2fad0 20 30 3b 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c   0;.  }.  aResul
2fae0 74 5b 34 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 46  t[4] = pPage->nF
2faf0 72 65 65 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a  ree;.  cnt = 0;.
2fb00 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65    idx = get2byte
2fb10 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2fb20 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2fb30 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  1]);.  while( id
2fb40 78 3e 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  x>0 && idx<pPage
2fb50 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2fb60 65 20 29 7b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a  e ){.    cnt++;.
2fb70 20 20 20 20 69 64 78 20 3d 20 67 65 74 32 62 79      idx = get2by
2fb80 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2fb90 5b 69 64 78 5d 29 3b 0a 20 20 7d 0a 20 20 61 52  [idx]);.  }.  aR
2fba0 65 73 75 6c 74 5b 35 5d 20 3d 20 63 6e 74 3b 0a  esult[5] = cnt;.
2fbb0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
2fbc0 72 65 6e 74 3d 3d 30 20 7c 7c 20 69 73 52 6f 6f  rent==0 || isRoo
2fbd0 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a  tPage(pPage) ){.
2fbe0 20 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d      aResult[9] =
2fbf0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2fc00 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 70 50   aResult[9] = pP
2fc10 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67  age->pParent->pg
2fc20 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  no;.  }.  releas
2fc30 65 54 65 6d 70 43 75 72 73 6f 72 28 26 74 6d 70  eTempCursor(&tmp
2fc40 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Cur);.  return S
2fc50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
2fc60 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
2fc70 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63   the pager assoc
2fc80 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72  iated with a BTr
2fc90 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ee.  This routin
2fca0 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  e is used for.**
2fcb0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
2fcc0 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
2fcd0 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74  Pager *sqlite3Bt
2fce0 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a  reePager(Btree *
2fcf0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
2fd00 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a  pBt->pPager;.}..
2fd10 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63  /*.** This struc
2fd20 74 75 72 65 20 69 73 20 70 61 73 73 65 64 20 61  ture is passed a
2fd30 72 6f 75 6e 64 20 74 68 72 6f 75 67 68 20 61 6c  round through al
2fd40 6c 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65  l the sanity che
2fd50 63 6b 69 6e 67 20 72 6f 75 74 69 6e 65 73 0a 2a  cking routines.*
2fd60 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  * in order to ke
2fd70 65 70 20 74 72 61 63 6b 20 6f 66 20 73 6f 6d 65  ep track of some
2fd80 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20 69 6e   global state in
2fd90 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  formation..*/.ty
2fda0 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6e 74  pedef struct Int
2fdb0 65 67 72 69 74 79 43 6b 20 49 6e 74 65 67 72 69  egrityCk Integri
2fdc0 74 79 43 6b 3b 0a 73 74 72 75 63 74 20 49 6e 74  tyCk;.struct Int
2fdd0 65 67 72 69 74 79 43 6b 20 7b 0a 20 20 42 74 53  egrityCk {.  BtS
2fde0 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 2f  hared *pBt;    /
2fdf0 2a 20 54 68 65 20 74 72 65 65 20 62 65 69 6e 67  * The tree being
2fe00 20 63 68 65 63 6b 65 64 20 6f 75 74 20 2a 2f 0a   checked out */.
2fe10 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
2fe20 20 2f 2a 20 54 68 65 20 61 73 73 6f 63 69 61 74   /* The associat
2fe30 65 64 20 70 61 67 65 72 2e 20 20 41 6c 73 6f 20  ed pager.  Also 
2fe40 61 63 63 65 73 73 69 62 6c 65 20 62 79 20 70 42  accessible by pB
2fe50 74 2d 3e 70 50 61 67 65 72 20 2a 2f 0a 20 20 69  t->pPager */.  i
2fe60 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 2f 2a  nt nPage;     /*
2fe70 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2fe80 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2fe90 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 6e 52 65 66   */.  int *anRef
2fea0 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
2feb0 66 20 74 69 6d 65 73 20 65 61 63 68 20 70 61 67  f times each pag
2fec0 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 20  e is referenced 
2fed0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  */.  char *zErrM
2fee0 73 67 3b 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20  sg; /* An error 
2fef0 6d 65 73 73 61 67 65 2e 20 20 4e 55 4c 4c 20 6f  message.  NULL o
2ff00 66 20 6e 6f 20 65 72 72 6f 72 73 20 73 65 65 6e  f no errors seen
2ff10 2e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  . */.};..#ifndef
2ff20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
2ff30 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
2ff40 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73  ** Append a mess
2ff50 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72  age to the error
2ff60 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e   message string.
2ff70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2ff80 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a  checkAppendMsg(.
2ff90 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
2ffa0 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a  Check,.  char *z
2ffb0 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Msg1,.  const ch
2ffc0 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e  ar *zFormat,.  .
2ffd0 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2ffe0 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  ap;.  char *zMsg
2fff0 32 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  2;.  va_start(ap
30000 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d  , zFormat);.  zM
30010 73 67 32 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  sg2 = sqlite3VMP
30020 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
30030 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
30040 3b 0a 20 20 69 66 28 20 7a 4d 73 67 31 3d 3d 30  ;.  if( zMsg1==0
30050 20 29 20 7a 4d 73 67 31 20 3d 20 22 22 3b 0a 20   ) zMsg1 = "";. 
30060 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 7a 45 72   if( pCheck->zEr
30070 72 4d 73 67 20 29 7b 0a 20 20 20 20 63 68 61 72  rMsg ){.    char
30080 20 2a 7a 4f 6c 64 20 3d 20 70 43 68 65 63 6b 2d   *zOld = pCheck-
30090 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 43  >zErrMsg;.    pC
300a0 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  heck->zErrMsg = 
300b0 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  0;.    sqlite3Se
300c0 74 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d  tString(&pCheck-
300d0 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20  >zErrMsg, zOld, 
300e0 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73  "\n", zMsg1, zMs
300f0 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  g2, (char*)0);. 
30100 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4f     sqliteFree(zO
30110 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ld);.  }else{.  
30120 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
30130 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72  ng(&pCheck->zErr
30140 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67  Msg, zMsg1, zMsg
30150 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  2, (char*)0);.  
30160 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  }.  sqliteFree(z
30170 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Msg2);.}.#endif 
30180 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
30190 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
301a0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
301b0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
301c0 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64  _CHECK./*.** Add
301d0 20 31 20 74 6f 20 74 68 65 20 72 65 66 65 72 65   1 to the refere
301e0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
301f0 67 65 20 69 50 61 67 65 2e 20 20 49 66 20 74 68  ge iPage.  If th
30200 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
30210 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
30220 20 74 68 65 20 70 61 67 65 2c 20 61 64 64 20 61   the page, add a
30230 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
30240 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d  to pCheck->zErrM
30250 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  sg..** Return 1 
30260 69 66 20 74 68 65 72 65 20 61 72 65 20 32 20 6f  if there are 2 o
30270 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e 63  re more referenc
30280 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 61  es to the page a
30290 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74 68  nd 0 if.** if th
302a0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
302b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
302c0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73   page..**.** Als
302d0 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  o check that the
302e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
302f0 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74  in bounds..*/.st
30300 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
30310 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70  f(IntegrityCk *p
30320 43 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67 65  Check, int iPage
30330 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74  , char *zContext
30340 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d  ){.  if( iPage==
30350 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
30360 69 66 28 20 69 50 61 67 65 3e 70 43 68 65 63 6b  if( iPage>pCheck
30370 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67 65  ->nPage || iPage
30380 3c 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  <0 ){.    checkA
30390 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
303a0 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61   zContext, "inva
303b0 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  lid page number 
303c0 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
303d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
303e0 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52   if( pCheck->anR
303f0 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a  ef[iPage]==1 ){.
30400 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
30410 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
30420 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72 65  ext, "2nd refere
30430 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22 2c  nce to page %d",
30440 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74   iPage);.    ret
30450 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
30460 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e  urn  (pCheck->an
30470 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b  Ref[iPage]++)>1;
30480 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
30490 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
304a0 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  UM./*.** Check t
304b0 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e  hat the entry in
304c0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
304d0 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64   for page iChild
304e0 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67   maps to .** pag
304f0 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74  e iParent, point
30500 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65 2e  er type ptrType.
30510 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20   If not, append 
30520 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
30530 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a  .** to pCheck..*
30540 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
30550 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e 74  eckPtrmap(.  Int
30560 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
30570 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79  ,   /* Integrity
30580 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a   check context *
30590 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
305a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
305b0 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ild page number 
305c0 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
305d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
305e0 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20  xpected pointer 
305f0 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50 67  map type */.  Pg
30600 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20 20  no iParent,     
30610 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
30620 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 72   pointer map par
30630 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
30640 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74  */.  char *zCont
30650 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ext         /* C
30660 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70 74 69  ontext descripti
30670 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72 72  on (used for err
30680 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20  or msg) */.){.  
30690 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50 74  int rc;.  u8 ePt
306a0 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f  rmapType;.  Pgno
306b0 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a   iPtrmapParent;.
306c0 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65  .  rc = ptrmapGe
306d0 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69  t(pCheck->pBt, i
306e0 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70 54  Child, &ePtrmapT
306f0 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61 72  ype, &iPtrmapPar
30700 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ent);.  if( rc!=
30710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30720 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
30730 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
30740 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61  , "Failed to rea
30750 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22  d ptrmap key=%d"
30760 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72  , iChild);.    r
30770 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
30780 28 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65  ( ePtrmapType!=e
30790 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50  Type || iPtrmapP
307a0 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29  arent!=iParent )
307b0 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
307c0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
307d0 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42  ntext, .      "B
307e0 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79  ad ptr map entry
307f0 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65 64   key=%d expected
30800 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64  =(%d,%d) got=(%d
30810 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43  ,%d)", .      iC
30820 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61  hild, eType, iPa
30830 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70  rent, ePtrmapTyp
30840 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  e, iPtrmapParent
30850 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
30860 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  ./*.** Check the
30870 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
30880 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66  e freelist or of
30890 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
308a0 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66  e list..** Verif
308b0 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
308c0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
308d0 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a  e list is N..*/.
308e0 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
308f0 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69  kList(.  Integri
30900 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f  tyCk *pCheck,  /
30910 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63  * Integrity chec
30920 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  king context */.
30930 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74    int isFreeList
30940 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ,       /* True 
30950 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20  for a freelist. 
30960 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66   False for overf
30970 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f  low page list */
30980 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20  .  int iPage,   
30990 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
309a0 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73   number for firs
309b0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  t page in the li
309c0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  st */.  int N,  
309d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
309e0 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72   Expected number
309f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
30a00 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20   list */.  char 
30a10 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  *zContext       
30a20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
30a30 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a  error messages *
30a40 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
30a50 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20 4e  int expected = N
30a60 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d  ;.  int iFirst =
30a70 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65 28   iPage;.  while(
30a80 20 4e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   N-- > 0 ){.    
30a90 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
30aa0 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 69 50  Ovfl;.    if( iP
30ab0 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63  age<1 ){.      c
30ac0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
30ad0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
30ae0 20 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20           "%d of 
30af0 25 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67  %d pages missing
30b00 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c   from overflow l
30b10 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
30b20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  %d",.          N
30b30 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46  +1, expected, iF
30b40 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  irst);.      bre
30b50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
30b60 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63  ( checkRef(pChec
30b70 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  k, iPage, zConte
30b80 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xt) ) break;.   
30b90 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65   if( sqlite3page
30ba0 72 5f 67 65 74 28 70 43 68 65 63 6b 2d 3e 70 50  r_get(pCheck->pP
30bb0 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67  ager, (Pgno)iPag
30bc0 65 2c 20 28 76 6f 69 64 2a 2a 29 26 70 4f 76 66  e, (void**)&pOvf
30bd0 6c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  l) ){.      chec
30be0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
30bf0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61  k, zContext, "fa
30c00 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67 65  iled to get page
30c10 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
30c20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
30c30 0a 20 20 20 20 69 66 28 20 69 73 46 72 65 65 4c  .    if( isFreeL
30c40 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ist ){.      int
30c50 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
30c60 4f 76 66 6c 5b 34 5d 29 3b 0a 23 69 66 6e 64 65  Ovfl[4]);.#ifnde
30c70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30c80 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
30c90 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
30ca0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
30cb0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
30cc0 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  p(pCheck, iPage,
30cd0 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
30ce0 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
30cf0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
30d00 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63       if( n>pChec
30d10 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  k->pBt->usableSi
30d20 7a 65 2f 34 2d 38 20 29 7b 0a 20 20 20 20 20 20  ze/4-8 ){.      
30d30 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
30d40 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
30d50 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66  t,.           "f
30d60 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75  reelist leaf cou
30d70 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61  nt too big on pa
30d80 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
30d90 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20          N--;.   
30da0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30db0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
30dc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
30dd0 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d  Pgno iFreePage =
30de0 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c   get4byte(&pOvfl
30df0 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65  [8+i*4]);.#ifnde
30e00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30e10 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20  TOVACUUM.       
30e20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
30e30 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
30e40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
30e50 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
30e60 2c 20 69 46 72 65 65 50 61 67 65 2c 20 50 54 52  , iFreePage, PTR
30e70 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
30e80 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
30e90 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
30ea0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 52 65           checkRe
30eb0 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50  f(pCheck, iFreeP
30ec0 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
30ed0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30ee0 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20    N -= n;.      
30ef0 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
30f00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
30f10 56 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b  VACUUM.    else{
30f20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
30f30 73 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  s database suppo
30f40 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  rts auto-vacuum 
30f50 61 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f 74  and iPage is not
30f60 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20   the last.      
30f70 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
30f80 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63  overflow list, c
30f90 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 6f  heck that the po
30fa0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
30fb0 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  for.      ** the
30fc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20   following page 
30fd0 6d 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a 20  matches iPage.. 
30fe0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
30ff0 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
31000 75 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e 30  utoVacuum && N>0
31010 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
31020 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 29 3b  get4byte(pOvfl);
31030 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
31040 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20  rmap(pCheck, i, 
31050 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
31060 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
31070 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
31080 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61  }.#endif.    iPa
31090 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f  ge = get4byte(pO
310a0 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  vfl);.    sqlite
310b0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4f 76  3pager_unref(pOv
310c0 66 6c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  fl);.  }.}.#endi
310d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
310e0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
310f0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
31100 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
31110 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44  TY_CHECK./*.** D
31120 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79  o various sanity
31130 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e   checks on a sin
31140 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74 72  gle page of a tr
31150 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ee.  Return.** t
31160 68 65 20 74 72 65 65 20 64 65 70 74 68 2e 20 20  he tree depth.  
31170 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75 72  Root pages retur
31180 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66  n 0.  Parents of
31190 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72   root pages.** r
311a0 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20  eturn 1, and so 
311b0 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  forth..** .** Th
311c0 65 73 65 20 63 68 65 63 6b 73 20 61 72 65 20 64  ese checks are d
311d0 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  one:.**.**      
311e0 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  1.  Make sure th
311f0 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65  at cells and fre
31200 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f  eblocks do not o
31210 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20  verlap.**       
31220 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74     but combine t
31230 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76  o completely cov
31240 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  er the page..** 
31250 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75   NO  2.  Make su
31260 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65  re cell keys are
31270 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e   in order..**  N
31280 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  3.  Make sure
31290 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20   no key is less 
312a0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
312b0 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a   zLowerBound..**
312c0 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73    NO  4.  Make s
312d0 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72  ure no key is gr
312e0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
312f0 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75  ual to zUpperBou
31300 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20  nd..**      5.  
31310 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72  Check the integr
31320 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ity of overflow 
31330 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36  pages..**      6
31340 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 63  .  Recursively c
31350 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67  all checkTreePag
31360 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  e on all childre
31370 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56  n..**      7.  V
31380 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
31390 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c  epth of all chil
313a0 64 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65  dren is the same
313b0 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61  ..**      8.  Ma
313c0 6b 65 20 73 75 72 65 20 74 68 69 73 20 70 61 67  ke sure this pag
313d0 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 33 33  e is at least 33
313e0 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69  % full or else i
313f0 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  t is.**         
31400 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
31410 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
31420 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61   int checkTreePa
31430 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ge(.  IntegrityC
31440 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43  k *pCheck,  /* C
31450 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 73  ontext for the s
31460 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20  anity check */. 
31470 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20   int iPage,     
31480 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
31490 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
314a0 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
314b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
314c0 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  ,     /* Parent 
314d0 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  page */.  char *
314e0 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20  zParentContext  
314f0 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78  /* Parent contex
31500 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  t */.){.  MemPag
31510 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  e *pPage;.  int 
31520 69 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32  i, rc, depth, d2
31530 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69  , pgno, cnt;.  i
31540 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72  nt hdr, cellStar
31550 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  t;.  int nCell;.
31560 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74    u8 *data;.  Bt
31570 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69  Shared *pBt;.  i
31580 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  nt usableSize;. 
31590 20 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31   char zContext[1
315a0 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74  00];.  char *hit
315b0 3b 0a 0a 20 20 73 70 72 69 6e 74 66 28 7a 43 6f  ;..  sprintf(zCo
315c0 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a  ntext, "Page %d:
315d0 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f   ", iPage);..  /
315e0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
315f0 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a   page exists.  *
31600 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63 6b  /.  pBt = pCheck
31610 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65 53  ->pBt;.  usableS
31620 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
31630 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50 61  eSize;.  if( iPa
31640 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ge==0 ) return 0
31650 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 66  ;.  if( checkRef
31660 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
31670 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29 20  zParentContext) 
31680 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
31690 28 20 28 72 63 20 3d 20 67 65 74 50 61 67 65 28  ( (rc = getPage(
316a0 70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65  pBt, (Pgno)iPage
316b0 2c 20 26 70 50 61 67 65 29 29 21 3d 30 20 29 7b  , &pPage))!=0 ){
316c0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
316d0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
316e0 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e  text,.       "un
316f0 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20  able to get the 
31700 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65  page. error code
31710 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72  =%d", rc);.    r
31720 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
31730 66 28 20 28 72 63 20 3d 20 69 6e 69 74 50 61 67  f( (rc = initPag
31740 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  e(pPage, pParent
31750 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65  ))!=0 ){.    che
31760 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
31770 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69  ck, zContext, "i
31780 6e 69 74 50 61 67 65 28 29 20 72 65 74 75 72 6e  nitPage() return
31790 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64 22  s error code %d"
317a0 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c 65 61  , rc);.    relea
317b0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
317c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
317d0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74  ..  /* Check out
317e0 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a   all the cells..
317f0 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20 30    */.  depth = 0
31800 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
31810 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
31820 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
31830 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20  ;.    int sz;.  
31840 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
31850 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 70  ..    /* Check p
31860 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20  ayload overflow 
31870 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20  pages.    */.   
31880 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e 74 65 78   sprintf(zContex
31890 74 2c 20 22 4f 6e 20 74 72 65 65 20 70 61 67 65  t, "On tree page
318a0 20 25 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20   %d cell %d: ", 
318b0 69 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70  iPage, i);.    p
318c0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
318d0 70 50 61 67 65 2c 69 29 3b 0a 20 20 20 20 70 61  pPage,i);.    pa
318e0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
318f0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
31900 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e  .    sz = info.n
31910 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70  Data;.    if( !p
31920 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73  Page->intKey ) s
31930 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  z += info.nKey;.
31940 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e      if( sz>info.
31950 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
31960 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73 7a 20  int nPage = (sz 
31970 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
31980 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f  usableSize - 5)/
31990 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  (usableSize - 4)
319a0 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  ;.      Pgno pgn
319b0 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  oOvfl = get4byte
319c0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
319d0 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65  erflow]);.#ifnde
319e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
319f0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
31a00 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
31a10 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
31a20 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
31a30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d  , pgnoOvfl, PTRM
31a40 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50  AP_OVERFLOW1, iP
31a50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
31a60 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
31a70 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70       checkList(p
31a80 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76  Check, 0, pgnoOv
31a90 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74  fl, nPage, zCont
31aa0 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ext);.    }..   
31ab0 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69 74 79   /* Check sanity
31ac0 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64 20 70   of left child p
31ad0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
31ae0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
31af0 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d   ){.      pgno =
31b00 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
31b10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
31b20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
31b30 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
31b40 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
31b50 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
31b60 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20  p(pCheck, pgno, 
31b70 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50  PTRMAP_BTREE, iP
31b80 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
31b90 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
31ba0 20 20 20 20 20 64 32 20 3d 20 63 68 65 63 6b 54       d2 = checkT
31bb0 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 70  reePage(pCheck,p
31bc0 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74 65  gno,pPage,zConte
31bd0 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  xt);.      if( i
31be0 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74 68 20  >0 && d2!=depth 
31bf0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
31c00 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31c10 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68 69  , zContext, "Chi
31c20 6c 64 20 70 61 67 65 20 64 65 70 74 68 20 64 69  ld page depth di
31c30 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20 20 7d  ffers");.      }
31c40 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d 20 64  .      depth = d
31c50 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
31c60 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
31c70 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
31c80 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
31c90 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
31ca0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73  ffset+8]);.    s
31cb0 70 72 69 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c  printf(zContext,
31cc0 20 22 4f 6e 20 70 61 67 65 20 25 64 20 61 74 20   "On page %d at 
31cd0 72 69 67 68 74 20 63 68 69 6c 64 3a 20 22 2c 20  right child: ", 
31ce0 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20  iPage);.#ifndef 
31cf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31d00 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
31d10 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
31d20 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72  {.      checkPtr
31d30 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
31d40 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
31d50 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d  iPage, 0);.    }
31d60 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63  .#endif.    chec
31d70 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b  kTreePage(pCheck
31d80 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c 20 7a  , pgno, pPage, z
31d90 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 0a  Context);.  }. .
31da0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
31db0 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72 61 67 65  omplete coverage
31dc0 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a   of the page.  *
31dd0 2f 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  /.  data = pPage
31de0 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
31df0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
31e00 74 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c 69 74  t;.  hit = sqlit
31e10 65 4d 61 6c 6c 6f 63 28 20 75 73 61 62 6c 65 53  eMalloc( usableS
31e20 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 68 69 74  ize );.  if( hit
31e30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68   ){.    memset(h
31e40 69 74 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28  it, 1, get2byte(
31e50 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a  &data[hdr+5]));.
31e60 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32      nCell = get2
31e70 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
31e80 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72  ]);.    cellStar
31e90 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
31ea0 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
31eb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
31ec0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
31ed0 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74  int pc = get2byt
31ee0 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72  e(&data[cellStar
31ef0 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 69  t+i*2]);.      i
31f00 6e 74 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69  nt size = cellSi
31f10 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61  zePtr(pPage, &da
31f20 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 69  ta[pc]);.      i
31f30 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  nt j;.      if( 
31f40 28 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61  (pc+size-1)>=usa
31f50 62 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20  bleSize || pc<0 
31f60 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
31f70 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31f80 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
31f90 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65    "Corruption de
31fa0 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25  tected in cell %
31fb0 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c  d on page %d",i,
31fc0 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20  iPage,0);.      
31fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
31fe0 6f 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20  or(j=pc+size-1; 
31ff0 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b  j>=pc; j--) hit[
32000 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  j]++;.      }.  
32010 20 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d    }.    for(cnt=
32020 30 2c 20 69 3d 67 65 74 32 62 79 74 65 28 26 64  0, i=get2byte(&d
32030 61 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30  ata[hdr+1]); i>0
32040 20 26 26 20 69 3c 75 73 61 62 6c 65 53 69 7a 65   && i<usableSize
32050 20 26 26 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a   && cnt<10000; .
32060 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
32070 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
32080 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
32090 74 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20  ta[i+2]);.      
320a0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28  int j;.      if(
320b0 20 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61   (i+size-1)>=usa
320c0 62 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29  bleSize || i<0 )
320d0 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
320e0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
320f0 20 30 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20   0,  .          
32100 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65    "Corruption de
32110 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25  tected in cell %
32120 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c  d on page %d",i,
32130 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20  iPage,0);.      
32140 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
32150 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a  or(j=i+size-1; j
32160 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d  >=i; j--) hit[j]
32170 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
32180 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26    i = get2byte(&
32190 64 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  data[i]);.    }.
321a0 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b      for(i=cnt=0;
321b0 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69   i<usableSize; i
321c0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68  ++){.      if( h
321d0 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  it[i]==0 ){.    
321e0 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
321f0 20 7d 65 6c 73 65 20 69 66 28 20 68 69 74 5b 69   }else if( hit[i
32200 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ]>1 ){.        c
32210 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
32220 68 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20  heck, 0,.       
32230 20 20 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65     "Multiple use
32240 73 20 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66  s for byte %d of
32250 20 70 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50   page %d", i, iP
32260 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
32270 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
32280 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
32290 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20  data[hdr+7] ){. 
322a0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
322b0 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a  Msg(pCheck, 0, .
322c0 20 20 20 20 20 20 20 20 20 20 22 46 72 61 67 6d            "Fragm
322d0 65 6e 74 65 64 20 73 70 61 63 65 20 69 73 20 25  ented space is %
322e0 64 20 62 79 74 65 20 72 65 70 6f 72 74 65 64 20  d byte reported 
322f0 61 73 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  as %d on page %d
32300 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74  ",.          cnt
32310 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69  , data[hdr+7], i
32320 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
32330 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 68 69  .  sqliteFree(hi
32340 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61  t);..  releasePa
32350 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
32360 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23  urn depth+1;.}.#
32370 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
32380 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
32390 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
323a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
323b0 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
323c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
323d0 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  does a complete 
323e0 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76  check of the giv
323f0 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20  en BTree file.  
32400 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e  aRoot[] is.** an
32410 20 61 72 72 61 79 20 6f 66 20 70 61 67 65 73 20   array of pages 
32420 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65 61 63  numbers were eac
32430 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  h page number is
32440 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
32450 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e  f.** a table.  n
32460 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62  Root is the numb
32470 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
32480 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   aRoot..**.** If
32490 20 65 76 65 72 79 74 68 69 6e 67 20 63 68 65 63   everything chec
324a0 6b 73 20 6f 75 74 2c 20 74 68 69 73 20 72 6f 75  ks out, this rou
324b0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
324c0 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  L.  If something
324d0 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e   is.** amiss, an
324e0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
324f0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  s written into m
32500 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
32510 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20  rom malloc().** 
32520 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
32530 20 74 68 61 74 20 65 72 72 6f 72 20 6d 65 73 73   that error mess
32540 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  age is returned.
32550 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
32560 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73  nction.** is res
32570 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65  ponsible for fre
32580 65 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d  eing the error m
32590 65 73 73 61 67 65 20 77 68 65 6e 20 69 74 20 69  essage when it i
325a0 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20  s done..*/.char 
325b0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74  *sqlite3BtreeInt
325c0 65 67 72 69 74 79 43 68 65 63 6b 28 42 74 72 65  egrityCheck(Btre
325d0 65 20 2a 70 2c 20 69 6e 74 20 2a 61 52 6f 6f 74  e *p, int *aRoot
325e0 2c 20 69 6e 74 20 6e 52 6f 6f 74 29 7b 0a 20 20  , int nRoot){.  
325f0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65  int i;.  int nRe
32600 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  f;.  IntegrityCk
32610 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61   sCheck;.  BtSha
32620 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
32630 74 3b 0a 0a 20 20 6e 52 65 66 20 3d 20 2a 73 71  t;..  nRef = *sq
32640 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73  lite3pager_stats
32650 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
32660 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57 69   if( lockBtreeWi
32670 74 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c 49  thRetry(p)!=SQLI
32680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
32690 75 72 6e 20 73 71 6c 69 74 65 53 74 72 44 75 70  urn sqliteStrDup
326a0 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71 75  ("Unable to acqu
326b0 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  ire a read lock 
326c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 22  on the database"
326d0 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e  );.  }.  sCheck.
326e0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43 68  pBt = pBt;.  sCh
326f0 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74  eck.pPager = pBt
32700 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68 65  ->pPager;.  sChe
32710 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69 74  ck.nPage = sqlit
32720 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
32730 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29  t(sCheck.pPager)
32740 3b 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e  ;.  if( sCheck.n
32750 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75  Page==0 ){.    u
32760 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
32770 65 64 28 70 42 74 29 3b 0a 20 20 20 20 72 65 74  ed(pBt);.    ret
32780 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68  urn 0;.  }.  sCh
32790 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69  eck.anRef = sqli
327a0 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 28 73 43  teMallocRaw( (sC
327b0 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69  heck.nPage+1)*si
327c0 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65  zeof(sCheck.anRe
327d0 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21  f[0]) );.  if( !
327e0 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a  sCheck.anRef ){.
327f0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
32800 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
32810 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
32820 4d 50 72 69 6e 74 66 28 22 55 6e 61 62 6c 65 20  MPrintf("Unable 
32830 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79 74  to malloc %d byt
32840 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28 73  es", .        (s
32850 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73  Check.nPage+1)*s
32860 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52  izeof(sCheck.anR
32870 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 66  ef[0]));.  }.  f
32880 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63  or(i=0; i<=sChec
32890 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73  k.nPage; i++){ s
328a0 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d  Check.anRef[i] =
328b0 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44   0; }.  i = PEND
328c0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
328d0 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43 68  t);.  if( i<=sCh
328e0 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20  eck.nPage ){.   
328f0 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
32900 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68 65   = 1;.  }.  sChe
32910 63 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  ck.zErrMsg = 0;.
32920 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
32930 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
32940 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20   freelist.  */. 
32950 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65   checkList(&sChe
32960 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28  ck, 1, get4byte(
32970 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
32980 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20  ata[32]),.      
32990 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
329a0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
329b0 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66  ta[36]), "Main f
329c0 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20  reelist: ");..  
329d0 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65  /* Check all the
329e0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
329f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74  for(i=0; i<nRoot
32a00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
32a10 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f  aRoot[i]==0 ) co
32a20 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20  ntinue;.#ifndef 
32a30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
32a40 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
32a50 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
32a60 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a  & aRoot[i]>1 ){.
32a70 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
32a80 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74  p(&sCheck, aRoot
32a90 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  [i], PTRMAP_ROOT
32aa0 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  PAGE, 0, 0);.   
32ab0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68   }.#endif.    ch
32ac0 65 63 6b 54 72 65 65 50 61 67 65 28 26 73 43 68  eckTreePage(&sCh
32ad0 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30  eck, aRoot[i], 0
32ae0 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20  , "List of tree 
32af0 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a  roots: ");.  }..
32b00 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65    /* Make sure e
32b10 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
32b20 20 66 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e   file is referen
32b30 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ced.  */.  for(i
32b40 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =1; i<=sCheck.nP
32b50 61 67 65 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65  age; i++){.#ifde
32b60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
32b70 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
32b80 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
32b90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ==0 ){.      che
32ba0 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
32bb0 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
32bc0 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
32bd0 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65   i);.    }.#else
32be0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
32bf0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
32c00 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61   auto-vacuum, ma
32c10 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65  ke sure no table
32c20 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  s contain.    **
32c30 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70   references to p
32c40 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
32c50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
32c60 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
32c70 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28  ==0 && .       (
32c80 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
32c90 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42 74  t, i)!=i || !pBt
32ca0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
32cb0 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
32cc0 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
32cd0 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65  , "Page %d is ne
32ce0 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20  ver used", i);. 
32cf0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 68     }.    if( sCh
32d00 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20  eck.anRef[i]!=0 
32d10 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d  && .       (PTRM
32d20 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69  AP_PAGENO(pBt, i
32d30 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74  )==i && pBt->aut
32d40 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
32d50 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32d60 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f  (&sCheck, 0, "Po
32d70 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 25  inter map page %
32d80 64 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 22  d is referenced"
32d90 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , i);.    }.#end
32da0 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  if.  }..  /* Mak
32db0 65 20 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c  e sure this anal
32dc0 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61  ysis did not lea
32dd0 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70  ve any unref() p
32de0 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f  ages.  */.  unlo
32df0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
32e00 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66  pBt);.  if( nRef
32e10 20 21 3d 20 2a 73 71 6c 69 74 65 33 70 61 67 65   != *sqlite3page
32e20 72 5f 73 74 61 74 73 28 70 42 74 2d 3e 70 50 61  r_stats(pBt->pPa
32e30 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65 63  ger) ){.    chec
32e40 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
32e50 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 4f  ck, 0, .      "O
32e60 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
32e70 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20  count goes from 
32e80 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67 20  %d to %d during 
32e90 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a  this analysis",.
32ea0 20 20 20 20 20 20 6e 52 65 66 2c 20 2a 73 71 6c        nRef, *sql
32eb0 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28  ite3pager_stats(
32ec0 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20 20  pBt->pPager).   
32ed0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   );.  }..  /* Cl
32ee0 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f  ean  up and repo
32ef0 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  rt errors..  */.
32f00 20 20 73 71 6c 69 74 65 46 72 65 65 28 73 43 68    sqliteFree(sCh
32f10 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 72 65  eck.anRef);.  re
32f20 74 75 72 6e 20 73 43 68 65 63 6b 2e 7a 45 72 72  turn sCheck.zErr
32f30 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Msg;.}.#endif /*
32f40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
32f50 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
32f60 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
32f70 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
32f80 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
32f90 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  g database file.
32fa0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
32fb0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
32fc0 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  ilename(Btree *p
32fd0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
32fe0 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
32ff0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
33000 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65  e3pager_filename
33010 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  (p->pBt->pPager)
33020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
33030 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f  n the pathname o
33040 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
33050 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
33060 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
33070 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
33080 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44  sqlite3BtreeGetD
33090 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29  irname(Btree *p)
330a0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
330b0 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
330c0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
330d0 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 70  3pager_dirname(p
330e0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
330f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
33100 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  the pathname of 
33110 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
33120 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
33130 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a  se. The return.*
33140 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
33150 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 73  routine is the s
33160 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ame regardless o
33170 66 20 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f  f whether the jo
33180 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61  urnal file.** ha
33190 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  s been created o
331a0 72 20 6e 6f 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  r not..*/.const 
331b0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
331c0 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
331d0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
331e0 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50  sert( p->pBt->pP
331f0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  ager!=0 );.  ret
33200 75 72 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72  urn sqlite3pager
33210 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e  _journalname(p->
33220 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
33230 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33240 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  OMIT_VACUUM./*.*
33250 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c  * Copy the compl
33260 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  ete content of p
33270 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54  BtFrom into pBtT
33280 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f  o.  A transactio
33290 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74  n.** must be act
332a0 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c  ive for both fil
332b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  es..**.** The si
332c0 7a 65 20 6f 66 20 66 69 6c 65 20 70 42 74 46 72  ze of file pBtFr
332d0 6f 6d 20 6d 61 79 20 62 65 20 72 65 64 75 63 65  om may be reduce
332e0 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
332f0 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ion..** If anyth
33300 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
33310 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
33320 6f 6e 20 70 42 74 46 72 6f 6d 20 69 73 20 72 6f  on pBtFrom is ro
33330 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 69 6e  lled back..*/.in
33340 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
33350 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54  pyFile(Btree *pT
33360 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29  o, Btree *pFrom)
33370 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
33380 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69  ITE_OK;.  Pgno i
33390 2c 20 6e 50 61 67 65 2c 20 6e 54 6f 50 61 67 65  , nPage, nToPage
333a0 2c 20 69 53 6b 69 70 3b 0a 0a 20 20 42 74 53 68  , iSkip;..  BtSh
333b0 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54  ared *pBtTo = pT
333c0 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72  o->pBt;.  BtShar
333d0 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46  ed *pBtFrom = pF
333e0 72 6f 6d 2d 3e 70 42 74 3b 0a 0a 20 20 69 66 28  rom->pBt;..  if(
333f0 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54   pTo->inTrans!=T
33400 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 46  RANS_WRITE || pF
33410 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  rom->inTrans!=TR
33420 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
33430 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
33440 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
33450 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29  pBtTo->pCursor )
33460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
33470 55 53 59 3b 0a 20 20 6e 54 6f 50 61 67 65 20 3d  USY;.  nToPage =
33480 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
33490 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e 70  gecount(pBtTo->p
334a0 50 61 67 65 72 29 3b 0a 20 20 6e 50 61 67 65 20  Pager);.  nPage 
334b0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  = sqlite3pager_p
334c0 61 67 65 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d  agecount(pBtFrom
334d0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 53 6b  ->pPager);.  iSk
334e0 69 70 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  ip = PENDING_BYT
334f0 45 5f 50 41 47 45 28 70 42 74 54 6f 29 3b 0a 20  E_PAGE(pBtTo);. 
33500 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51   for(i=1; rc==SQ
33510 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 50  LITE_OK && i<=nP
33520 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76  age; i++){.    v
33530 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  oid *pPage;.    
33540 69 66 28 20 69 3d 3d 69 53 6b 69 70 20 29 20 63  if( i==iSkip ) c
33550 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20  ontinue;.    rc 
33560 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
33570 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67  et(pBtFrom->pPag
33580 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a  er, i, &pPage);.
33590 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
335a0 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ak;.    rc = sql
335b0 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72  ite3pager_overwr
335c0 69 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  ite(pBtTo->pPage
335d0 72 2c 20 69 2c 20 70 50 61 67 65 29 3b 0a 20 20  r, i, pPage);.  
335e0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
335f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  ;.    sqlite3pag
33600 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b  er_unref(pPage);
33610 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6e 50 61  .  }.  for(i=nPa
33620 67 65 2b 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ge+1; rc==SQLITE
33630 5f 4f 4b 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67  _OK && i<=nToPag
33640 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 6f 69  e; i++){.    voi
33650 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 69 66  d *pPage;.    if
33660 28 20 69 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e  ( i==iSkip ) con
33670 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d 20  tinue;.    rc = 
33680 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
33690 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
336a0 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  i, &pPage);.    
336b0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
336c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
336d0 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
336e0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70  e);.    sqlite3p
336f0 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
33700 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  );.    sqlite3pa
33710 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 70  ger_dont_write(p
33720 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 29  BtTo->pPager, i)
33730 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20  ;.  }.  if( !rc 
33740 26 26 20 6e 50 61 67 65 3c 6e 54 6f 50 61 67 65  && nPage<nToPage
33750 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
33760 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61  ite3pager_trunca
33770 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  te(pBtTo->pPager
33780 2c 20 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  , nPage);.  }.  
33790 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
337a0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
337b0 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72  ck(pTo);.  }.  r
337c0 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 23 65  eturn rc;  .}.#e
337d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
337e0 4d 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f  MIT_VACUUM */../
337f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
33800 7a 65 72 6f 20 69 66 20 61 20 74 72 61 6e 73 61  zero if a transa
33810 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
33820 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
33830 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 42 74  treeIsInTrans(Bt
33840 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
33850 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72  n (p && (p->inTr
33860 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
33870 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ));.}../*.** Ret
33880 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
33890 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
338a0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
338b0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
338c0 33 42 74 72 65 65 49 73 49 6e 53 74 6d 74 28 42  3BtreeIsInStmt(B
338d0 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
338e0 72 6e 20 28 70 2d 3e 70 42 74 20 26 26 20 70 2d  rn (p->pBt && p-
338f0 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d  >pBt->inStmt);.}
33900 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ../*.** This cal
33910 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
33920 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
33930 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
33940 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
33950 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
33960 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
33970 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
33980 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
33990 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
339a0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
339b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
339c0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
339d0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
339e0 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
339f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
33a00 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
33a10 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
33a20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
33a30 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
33a40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
33a50 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
33a60 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
33a70 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
33a80 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
33a90 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
33aa0 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
33ab0 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
33ac0 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
33ad0 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
33ae0 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
33af0 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
33b00 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
33b10 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
33b20 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
33b30 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
33b40 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
33b50 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
33b60 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
33b70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
33b80 72 65 65 53 79 6e 63 28 42 74 72 65 65 20 2a 70  reeSync(Btree *p
33b90 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
33ba0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
33bb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33bc0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
33bd0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
33be0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
33bf0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50   = p->pBt;.    P
33c00 67 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a  gno nTrunc = 0;.
33c10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33c20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
33c30 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
33c40 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
33c50 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
33c60 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54 72 75  ommit(pBt, &nTru
33c70 6e 63 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  nc); .      if( 
33c80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33c90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
33ca0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
33cb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
33cc0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  = sqlite3pager_s
33cd0 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ync(pBt->pPager,
33ce0 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63   zMaster, nTrunc
33cf0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
33d00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
33d10 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
33d20 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
33d30 61 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  a blob of memory
33d40 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
33d50 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61  .** a single sha
33d60 72 65 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d  red-btree. The m
33d70 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20 62 79  emory is used by
33d80 20 63 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72   client code for
33d90 20 69 74 27 73 20 6f 77 6e 0a 2a 2a 20 70 75 72   it's own.** pur
33da0 70 6f 73 65 73 20 28 66 6f 72 20 65 78 61 6d 70  poses (for examp
33db0 6c 65 2c 20 74 6f 20 73 74 6f 72 65 20 61 20 68  le, to store a h
33dc0 69 67 68 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61  igh-level schema
33dd0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
33de0 20 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d   .** the shared-
33df0 62 74 72 65 65 29 2e 20 54 68 65 20 62 74 72 65  btree). The btre
33e00 65 20 6c 61 79 65 72 20 6d 61 6e 61 67 65 73 20  e layer manages 
33e10 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 69  reference counti
33e20 6e 67 20 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a  ng issues..**.**
33e30 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
33e40 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f  this is called o
33e50 6e 20 61 20 73 68 61 72 65 64 2d 62 74 72 65 65  n a shared-btree
33e60 2c 20 6e 42 79 74 65 73 20 62 79 74 65 73 20 6f  , nBytes bytes o
33e70 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20  f memory.** are 
33e80 61 6c 6c 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65  allocated, zeroe
33e90 64 2c 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20  d, and returned 
33ea0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 46  to the caller. F
33eb0 6f 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65  or each subseque
33ec0 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20  nt .** call the 
33ed0 6e 42 79 74 65 73 20 70 61 72 61 6d 65 74 65 72  nBytes parameter
33ee0 20 69 73 20 69 67 6e 6f 72 65 64 20 61 6e 64 20   is ignored and 
33ef0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
33f00 20 73 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66   same blob.** of
33f10 20 6d 65 6d 6f 72 79 20 72 65 74 75 72 6e 65 64   memory returned
33f20 2e 20 0a 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65  . .**.** Just be
33f30 66 6f 72 65 20 74 68 65 20 73 68 61 72 65 64 2d  fore the shared-
33f40 62 74 72 65 65 20 69 73 20 63 6c 6f 73 65 64 2c  btree is closed,
33f50 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 61   the function pa
33f60 73 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20  ssed as the .** 
33f70 78 46 72 65 65 20 61 72 67 75 6d 65 6e 74 20 77  xFree argument w
33f80 68 65 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  hen the memory a
33f90 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73 20 6d 61  llocation was ma
33fa0 64 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  de is invoked on
33fb0 20 74 68 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66   the .** blob of
33fc0 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
33fd0 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  y. This function
33fe0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c   should not call
33ff0 20 73 71 6c 69 74 65 46 72 65 65 28 29 0a 2a 2a   sqliteFree().**
34000 20 6f 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20   on the memory, 
34010 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  the btree layer 
34020 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f  does that..*/.vo
34030 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
34040 53 63 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c  Schema(Btree *p,
34050 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69   int nBytes, voi
34060 64 28 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a  d(*xFree)(void *
34070 29 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  )){.  BtShared *
34080 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
34090 69 66 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d  if( !pBt->pSchem
340a0 61 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53  a ){.    pBt->pS
340b0 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 4d 61  chema = sqliteMa
340c0 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a 20 20  lloc(nBytes);.  
340d0 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
340e0 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d 0a  ma = xFree;.  }.
340f0 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53    return pBt->pS
34100 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  chema;.}../*.** 
34110 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
34120 6e 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20 74  nother user of t
34130 68 65 20 73 61 6d 65 20 73 68 61 72 65 64 20 62  he same shared b
34140 74 72 65 65 20 61 73 20 74 68 65 20 61 72 67 75  tree as the argu
34150 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68  ment.** handle h
34160 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
34170 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71  e lock on the sq
34180 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
34190 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
341a0 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b  3BtreeSchemaLock
341b0 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
341c0 72 65 74 75 72 6e 20 28 71 75 65 72 79 54 61 62  return (queryTab
341d0 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
341e0 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
341f0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d  )!=SQLITE_OK);.}
34200 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  ..int sqlite3Btr
34210 65 65 4c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65  eeLockTable(Btre
34220 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 2c 20  e *p, int iTab, 
34230 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 7b  u8 isWriteLock){
34240 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
34250 54 45 5f 4f 4b 3b 0a 23 69 66 6e 64 65 66 20 53  TE_OK;.#ifndef S
34260 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
34270 44 5f 43 41 43 48 45 0a 20 20 75 38 20 6c 6f 63  D_CACHE.  u8 loc
34280 6b 54 79 70 65 20 3d 20 28 69 73 57 72 69 74 65  kType = (isWrite
34290 4c 6f 63 6b 3f 57 52 49 54 45 5f 4c 4f 43 4b 3a  Lock?WRITE_LOCK:
342a0 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 72 63  READ_LOCK);.  rc
342b0 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63   = queryTableLoc
342c0 6b 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54  k(p, iTab, lockT
342d0 79 70 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ype);.  if( rc==
342e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
342f0 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28   rc = lockTable(
34300 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70  p, iTab, lockTyp
34310 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e);.  }.#endif. 
34320 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
34330 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
34340 6e 67 20 64 65 62 75 67 67 69 6e 67 20 69 6e 74  ng debugging int
34350 65 72 66 61 63 65 20 68 61 73 20 74 6f 20 62 65  erface has to be
34360 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28 72   in this file (r
34370 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 69 6e  ather.** than in
34380 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
34390 65 73 74 31 2e 63 29 20 73 6f 20 74 68 61 74 20  est1.c) so that 
343a0 69 74 20 63 61 6e 20 67 65 74 20 61 63 63 65 73  it can get acces
343b0 73 20 74 6f 0a 2a 2a 20 74 68 65 20 64 65 66 69  s to.** the defi
343c0 6e 69 74 69 6f 6e 20 6f 66 20 42 74 53 68 61 72  nition of BtShar
343d0 65 64 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ed..*/.#if defin
343e0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
343f0 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 53   && defined(TCLS
34400 48 29 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c  H).#include <tcl
34410 2e 68 3e 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .h>.int sqlite3_
34420 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72 65 70  shared_cache_rep
34430 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ort(.  void * cl
34440 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
34450 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
34460 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
34470 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
34480 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 54  v[].){.  const T
34490 68 72 65 61 64 44 61 74 61 20 2a 70 54 64 20 3d  hreadData *pTd =
344a0 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
344b0 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20  taReadOnly();.  
344c0 69 66 28 20 70 54 64 2d 3e 75 73 65 53 68 61 72  if( pTd->useShar
344d0 65 64 44 61 74 61 20 29 7b 0a 20 20 20 20 42 74  edData ){.    Bt
344e0 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 20  Shared *pBt;.   
344f0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d   Tcl_Obj *pRet =
34500 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
34510 20 20 20 66 6f 72 28 70 42 74 3d 70 54 64 2d 3e     for(pBt=pTd->
34520 70 42 74 72 65 65 3b 20 70 42 74 3b 20 70 42 74  pBtree; pBt; pBt
34530 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
34540 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
34550 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 70  zFile = sqlite3p
34560 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 70 42  ager_filename(pB
34570 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
34580 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
34590 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
345a0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
345b0 53 74 72 69 6e 67 4f 62 6a 28 7a 46 69 6c 65 2c  StringObj(zFile,
345c0 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 54 63 6c   -1));.      Tcl
345d0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
345e0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
345f0 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
34600 6a 28 70 42 74 2d 3e 6e 52 65 66 29 29 3b 0a 20  j(pBt->nRef));. 
34610 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74     }.    Tcl_Set
34620 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
34630 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a 20 20 72  , pRet);.  }.  r
34640 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
34650 23 65 6e 64 69 66 0a                             #endif.